(SKU:RB-02S035)TCS3200 颜色传感器

来自ALSROBOT WiKi
2015年8月27日 (四) 14:41夜枫讨论 | 贡献的版本

跳转至: 导航搜索


Vadrb1.jpg

目录

.概述

Color Sensor是一款简单易用、小巧请便、性价比较高的颜色识别、检测模块,与国外同类产品相比,不但体积小,功能强,而且设计巧妙具有以下特点:一、可完成分辨率的光照度/ 频率转换;二、色彩和满度输出频率可编程调整;三、可以直接与微处理器或其他逻辑电路相连接,适合各种开发板、控制器等产品。

性能描述

  1. 颜色光到频率转换芯片:TCS3200D
  2. 输出频率范围从10kHz~12kHz,占空比50%
  3. 工作电压:+2.7V~+5.5V
  4. 工作电流:1.4mA
  5. 检测状态:静态检测
  6. 最佳检测距离:10mm
  7. 工作温度:-40°C~+85°C
  8. 尺寸大小:35.56mmx 35.56mm x 1.60mm
  9. 重量大小:4.7g
  10. 固定孔直径:3mm
  11. 对角固定孔间距:16.60mm
  12. 相邻固定孔间距:11.74mm

Color Sensor模块的芯片介绍

目前的颜色传感器通常是在独立的光电二极管上覆盖经过修正的红、绿、蓝滤波片,然后对输出信号进行相应的处理,才能将颜色信号识别出来;有的将两者集合起来,但是输出模拟信号,需要一个A/D 电路进行采集,对该信号进一步处理,才能进行识别,增加了电路的复杂性,并且存在较大的识别误差,影响了识别的效果。TA OS(Texas Advanced Optoelectronic Solutions )公司最新推出的颜色传感器 TCS3200D(如下图),不仅能够实现颜色的识别与检测,与以前的颜色传感器相比,还具有许多优良的新特性。
Vadrb2.jpg
  1. TCS3200D 芯片的结构框图与特点:
TCS3200D 是TAOS 公司推出的可编程彩色光到频率的转换器,它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS 电路上,同时在单一芯片上集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器,TCS3200D 的输出信号是数字量,可以驱动标准的 TTL 或CMOS 逻辑输入,因此可直接与微处理器或其他逻辑电路相连接,由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D 转换电路,使电路变得更简单。
TCS3200D 采用8 引脚的SOIC 表面贴装式封装,在单一芯片上集成有64个光电二极管,这些二极管分为四种类型,其 16个光电二极管带有红色滤波器;16个光电二极管带有绿色滤波器;16个光电二极管带有蓝色滤波器,其余16个不带有任何滤波器,可以透过全部的光信息,这些光电二极管在芯片内是交叉排列的,能够最大限度地减少入射光辐射的不均匀性,从而增加颜色识别的精确度;另一方面,相同颜色的 16个光电二极管是并联连接的,均匀分布在二极管阵列中,可以消除颜色的位置误差。工作时,通过两个可编程的引脚来动态选择所需要的滤波器,该传感器的典型输出频率范围从2Hz -500kHz,用户还可以通过两个可编程引脚来选择 100 %、20%或2 %的输出比例因子,或电源关断模式。输出比例因子使传感器的输出能够适应不同的测量范围,提高了它的适应能力。例如,当使用低速的频率计数器时,就可以选择小的定标值,使TCS3200D 的输出频率和计数器相匹配。 当入射光投射到TCS3200D 上时,通过光电二极管控制引脚S2、S3的不同组合,可以选择不同的滤波器;经过电流到频率转换器后输出不同频率的方波(占空比是50%),不同的颜色和光强对应不同频率的方波;还可以通过输出定标控制引脚S0、S1,选择不同的输出比例因子,对输出频率范围进行调整,以适应不同的需求。 下面简要介绍TCS3200D 芯片各个引脚的功能及它的一些组合选项。 S0、S1用于选择输出比例因子或电源关断模式;S2、S3用于选择滤波器的类型;OE反是频率输出使能引脚,可以控制输出的状态,当有多个芯片引脚共用微处理器的输出引脚时,也可以作为片选信号,OUT是频率输出引脚,GND是芯片的接地引脚,VCC为芯片提供工作电压,下表是S0、S1及S2、S3的可用组合。
Vadrb3.jpg
  1. TCS3200D 识别颜色的原理
由上面的介绍可知,这种可编程的彩色光到频率转换器适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制和色彩配合。下面以TCS3200D 在色板颜色识别的应用为例,介绍它的具体使用。首先了解一些光与颜色的知识。
  1. 三原色的感应原理
通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y 、绿G、青V、蓝B 、紫P )。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
  1.  :TCS3200D 识别颜色的原理
由三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其他原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同时,选择其他的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到TCS3200D 传感器上的光的颜色。
  1. 白平衡和颜色识别原理
白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于TCS3200D 的光传感器来说,它对这三种基本色的敏感性是不相同的,导致 TCS3200D 的RGB输出并不相等,因此在测试前必须进行白平衡调整,使得TCS3200D 对所检测的"白色"中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将传感器对准色板的白色区域使其保持静态并平行于色板,使入射光能够良好的反射到TCS3200D 上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的3 个调整参数。
当TCS3200D 识别颜色时,就用这3 个参数对所测颜色的R、G 和B 进行调整。这里有两种方法来计算调整参数:1 、依次选通三颜色的滤波器,然后对 TCS3200D 的输出脉冲依次进行计数。当计数到255 时停止计数,分别计算每个通道所用的时间,这些时间对应于实际测试时TCS3200D 每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R、G 和B 的值。2 、设置定时器为一固定时间 (例如10ms),然后选通三种颜色的滤波器,计算这段时间内 TCS3200D 的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为 255 。在实际测试时,室外同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的R、G 和B 的值。

Color Sensor模块的测试

实验接线图

Yansejiexian.jpg

我们使用Arduino控制器来做个测试,需要用到硬件设备如下:

  1. Arduino 控制器×1
  2. Arduino 传感器扩展板×1
  3. Color Sensor模块×1
  4. 3P传感器连接线×5
  5. 4P传感器连接线×2
  6. IR&LED Modue×5 (红、白、蓝、黄、绿色各一个)
  7. USB 数据通信线×1
  8. 色板×1
使用杜邦线将Color Sensor 连接到Arduino传感器扩展板接口上,连接顺序为S0接数字口6 ,S1接数字口5 ,S2接数字口4 ,S3接数字口3 ,OUT接数字口2 ,OE、GND接GND,+5V 接+5V 。使用传感器线将各种颜色食人鱼灯连接到 Arduino传感器扩展板上,连接顺序为红色食人鱼灯接数字口 8 ,黄色灯接数字口 9 ,绿色灯接数字口10,蓝色灯接数字口 11 ,白色灯接数字口 12。( 注:在使用传感器线、杜邦线时,应注意对应连接,否则后果自负。) 完成硬件连接后,将 TimerOne库文件粘贴到arduino软件的libraries 中(如需库文件请与我们联系),无库文件或将库文件放错位置代码编译可能将会出现错误提示。

将代码编译后下载到Arduino里。Arduino实验代码如下。

#include <TimerOne.h>       // 引用 TimerOne.h 库文件 
#define S0     6            // 定义 S0为引脚6 
#define S1     5            // 定义 S1为引脚5 
#define S2     4            // 定义 S2为引脚4 
#define S3     3            // 定义 S3为引脚3 
#define OUT    2           // 定义 OUT为引脚2 
#define Rs      8           // 定义 Rs为引脚8 
#define Ys      9           // 定义 Ys为引脚9 
#define Gs      10          // 定义 Gs为引脚10 
#define Bs      11          // 定义 Bs为引脚11 
#define Ws      12         // 定义 Ws为引脚12 
int   g_count = 0;   //定义整型变量 g_count并赋初值为0,用于存储计数频率 
int   g_array[3];    //定义整型数组变量 g_array[3],用于存储RGB的值 
int   g_flag = 0;   	 //定义整形变量 g_flag 并赋初值为0,用于过滤器排列 
float g_SF[3];       //定义浮点型数组变量g_SF[3],用于存储RGB比例因子 
int   value[3];      //定义定义整型数组变量value[3],用于判断颜色 
//  初始化tsc230 和设置频率 
void TSC_Init() 
{                                                                   
  pinMode(S0, OUTPUT);      // 定义S0为输出状态 
  pinMode(S1, OUTPUT);      // 定义S1为输出状态 
  pinMode(S2, OUTPUT);      // 定义S2为输出状态 
  pinMode(S3, OUTPUT);      // 定义S3为输出状态 
  pinMode(OUT, INPUT);      // 定义OUT为输入状态 
 
  digitalWrite(S0, LOW);      //定义S0为低电平 
  digitalWrite(S1, HIGH);     // 定义 S1为高电平 
                           //输出频率缩放 2% 
}  
//  选择过滤器的颜色  
void TSC_FilterColor(int Level01, int Level02) 
{ 
  if(Level01 != 0)             // 如果Level01  不等于0   
     Level01 = HIGH;         //则Level01  为高电平 
  if(Level02 != 0)             // 如果Level02  不等于0 
     Level02 = HIGH;         //则Level02  为高电平 
  digitalWrite(S2, Level01);       // 将Level01值送给S2 
  digitalWrite(S3, Level02);       // 将Level02值送给S3 
                              // 选择过滤器颜色 
} 
void TSC_Count() 
{ 
  g_count ++ ;                  // 自动计算频率 
} 
void TSC_Callback() 
{ 
  switch(g_flag) 
  { 
    case 0:  
         Serial.println("->WB Start");    // 串口打印字符串"->WB Start" 
         TSC_WB(LOW, LOW);        // 没有过滤红色 
         break; 
    case 1: 
         Serial.print("->Frequency R=");  // 串口打印字符串"->Frequency R=" 
         Serial.println(g_count);         // 串口打印 g_count变量值 
         g_array[0] = g_count;           
         TSC_WB(HIGH, HIGH);       // 没有过滤绿色 
         break; 
    case 2: 
         Serial.print("->Frequency G=");  // 串口打印字符串"->Frequency G=" 
         Serial.println(g_count);         // 串口打印 g_count变量值 
         g_array[1] = g_count; 
         TSC_WB(LOW, HIGH);       // 没有过滤蓝色 
         break; 
    case 3: 
         Serial.print("->Frequency B=");  // 串口打印字符串"->Frequency B=" 
         Serial.println(g_count);         // 串口打印 g_count变量值 
         Serial.println("->WB End");     // 串口打印字符串"->WB End" 
         g_array[2] = g_count; 
         TSC_WB(HIGH, LOW);       // 清除(无过滤)                                                                      
         break; 
   default: 
         g_count = 0; 
         break; 
  } 
} 
void TSC_WB(int Level0, int Level1)      // 白平衡 
{ 
  g_count = 0; 
  g_flag ++; 
  TSC_FilterColor(Level0, Level1); 
  Timer1.setPeriod(1000000);           //设置一秒周期 
} 
void setup() 
{ 
  pinMode(Rs,OUTPUT);               //设定Rs引脚为输出状态 
  pinMode(Ys,OUTPUT);               //设定Ys引脚为输出状态 
  pinMode(Gs,OUTPUT);               //设定Gs引脚为输出状态 
  pinMode(Bs,OUTPUT);               //设定Bs引脚为输出状态 
  pinMode(Ws,OUTPUT);              //设定Ws引脚为输出状态 
  TSC_Init();                         //初始化tcs230 
  Serial.begin(9600);                   //打开串口并设置通信波特率为 9600 
  Timer1.initialize();                      //初始化默认是一秒 
  Timer1.attachInterrupt(TSC_Callback);     // 外部中断为一秒   
  attachInterrupt(0, TSC_Count, RISING);    //外部中断口初始0 
  delay(4000);                          // 延迟4 秒 
  for(int i=0; i<3; i++) 
     Serial.println(g_array[i]);             //串口打印 g_array[i] 变量值 
  g_SF[0] = 255.0/ g_array[0];            //红色的比例因子 
  g_SF[1] = 255.0/ g_array[1] ;           // 绿色的比例因子 
  g_SF[2] = 255.0/ g_array[2] ;           // 蓝色的比例因子 
  
  Serial.println(g_SF[0]);               // 串口打印 g_SF[0]变量值 
  Serial.println(g_SF[1]);               // 串口打印 g_SF[1]变量值 
  Serial.println(g_SF[2]);               // 串口打印 g_SF[2]变量值 
} 
void loop() 
{ 
   g_flag = 0; 
   for(int i=0; i<3; i++) 
   {Serial.println(int(g_array[i] * g_SF[i])); //串口打印g_array[i] * g_SF[i]变量值 
    value[i]=int(g_array[i] * g_SF[i]);  //将g_array[i] * g_SF[i]值赋值给value[i] 
   } 
      if (((value[0]>168)  &&  (value[0]<208)) && ((value[1]>66) && (value[1]<106)) && ((value[2]>67) && (value[2]<107)))    
 // 如果变量 value[i]数值满足为红色值范围则执行下面语句 
       { 
Serial.println("->Red");                //串口打印字符串"->Red" 
        digitalWrite(Rs,HIGH);                //Rs定义为高电平 
        digitalWrite(Ys,LOW);                //Ys定义为低电平 
        digitalWrite(Gs,LOW);                //Gs定义为低电平                     
        digitalWrite(Bs,LOW);                //Bs 定义为低电平                                                                  
        digitalWrite(Ws,LOW);               //Ws定义为低电平 
       } 
        else if (((value[0]>235) && (value[0]<275)) && ((value[1]> 198) && (value[1]<238)) && ((value[2]>96) && (value[2]<136)))     
 //如果变量 value[i]数值满足为黄色值范围则执行下面语句 
       {
 Serial.println("->Yellow");             //串口打印字符串"->Yellow" 
        digitalWrite(Rs,LOW);                //Rs 定义为低电平 
        digitalWrite(Ys,HIGH);               //Ys 定义为高电平 
        digitalWrite(Gs,LOW);               //Gs 定义为低电平 
        digitalWrite(Bs,LOW);               //Bs 定义为低电平 
        digitalWrite(Ws,LOW);              //Ws 定义为低电平 
       } 
        else if (((value[0]>74) && (value[0]<114)) && ((value[1]>119)  && (value[1]<159)) && ((value[2]>76) && (value[2]<116)))     
 //如果变量 value[i]数值满足为绿色值范围则执行下面语句 
       { 
Serial.println("->Green");              //串口打印字符串"->Green" 
        digitalWrite(Rs,LOW);                //Rs 定义为低电平 
        digitalWrite(Ys,LOW);                //Ys定义为低电平 
        digitalWrite(Gs,HIGH);               //Gs 定义为高电平 
        digitalWrite(Bs,LOW);               //Bs 定义为低电平 
        digitalWrite(Ws,LOW);              //Ws 定义为低电平 
       } 
        else  if(((value[0]>46)  &&  (value[0]<86))  &&  ((value[1]>71)  &&  (value[1]<111))  && ((value[2]>117) && (value[2]<157)))   
  //如果变量 value[i]数值满足为蓝色值范围则执行下面语句 
       { 
Serial.println("->Blue");               //串口打印字符串"->Blue" 
        digitalWrite(Rs,LOW);                //Rs 定义为低电平 
        digitalWrite(Ys,LOW);               //Ys 定义为低电平 
        digitalWrite(Gs,LOW);               //Gs 定义为低电平 
        digitalWrite(Bs,HIGH);              //Bs定义为高电平 
        digitalWrite(Ws,LOW);             //Ws定义为低电平 
       } 
        else if (((value[0]>230) && (value[0]<280)) && ((value[1]> 230) && (value[1]<280)) && ((value[2]>230) && (value[2]<280)))    
 //如果变量 value[i]数值满足为白色值范围则执行下面语句 
       { 
Serial.println("->White");              //串口打印字符串"->White" 
        digitalWrite(Rs,LOW);                //Rs 定义为低电平 
        digitalWrite(Ys,LOW);                //Ys定义为低电平 
        digitalWrite(Gs,LOW);               //Gs 定义为低电平 
        digitalWrite(Bs,LOW);               //Bs 定义为低电平 
        digitalWrite(Ws,HIGH);              //Ws 定义为高电平 
       } 
        else if (value[0]>0 && value[1]>0 && value[2]>0) 
         //如果变量 value[i]数值不满足上述颜色值范围则执行下面语句 
       { 
Serial.println("->Other Color");        //串口打印字符串"->Other Color" 
        digitalWrite(Rs,LOW);               //Rs 定义为低电平 
        digitalWrite(Ys,LOW);               //Ys 定义为低电平 
        digitalWrite(Gs,LOW);               //Gs 定义为低电平 
        digitalWrite(Bs,LOW);               //Bs 定义为低电平 
        digitalWrite(Ws,LOW);              //Ws 定义为低电平 
       } 
delay(4000);                               //延迟4 秒 
在以上步骤完成后,我们首先需要在其程序启动后白平衡(白平衡在上文中已介绍),下图为Arduino实验代码的白平衡实验现象:
Vadrb4.jpg
Vadrb5.jpg
Hih6.jpg
在完成白平衡后(上图实验现象即白色食人鱼灯亮起,也是其系统在检测到白色后的现象)就可以检测其他颜色了。白平衡只是系统对白色的一种数值反馈(即告诉系统什么是白色),本模块识别、检测后读出的只是 R 、G、B 的值,对应其检测到的颜色R、G、B 值,该测试程序编写者特编写了一段应用五种颜色食人鱼灯来显示其检测到的颜色。判断语句中的范围为程序编写者在实验室环境下所测得的R 、G、B 值。更换环境后应予以更改其对应颜色判断的R、G、B 值范围。测试程序( 颜色检测程序)中涉及到了红、黄、绿、蓝、白五种颜色,而色板上为六种颜色,多出一种颜色黑色是为了做出对比 :在检测中遇到非该检测颜色时(即不满足判断语句的条件时)应只在串口打印"->Other Color" ,而无其他现象产生。下图为Arduino实验代码在检测到其他颜色时的实验现象
Vadrb7.jpg
Vadrb8.jpg
Vadrb9.jpg
Vadrb10.jpg
Vadrb11.jpg

产品相关推荐

Erweima.png

购买地址

TCS3200D 颜色传感器

周边产品推荐

灰度传感器
Arduino ColorPAL Color Sensor 进口颜色传感器 颜色识别

相关问题解答

相关学习资料

奥松机器人技术论坛