欢迎光临
我们一直在努力

颜色识别传感器TCS3200 示例教程 适用于Arduino平台

1. 产品图片

2. 产品购买地址点我购买

3. 产品概述
1、TCS3200这种可编程的彩色光到频率转换器适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制和色彩配合。本文以 TCS3200 在液体颜色识别中的应用为例,介绍它的具体使用。在开始介绍TCS3200 的颜色识别前,先来了解一些光与颜色的知识。
2、三原色的感应原理
通常所看到的物体的颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹 (Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
3、 TCS3200识别颜色的原理
由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到TCS3200 传感器上的光的颜色。
4、白平衡和颜色识别原理
白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于 TCS3200 的光传感器来说,它对这三种基本色的敏感性是不相同的,导致TCS3200 的RGB 输出并不相等,因此在测试前必须进行白平衡调整,使得TCS3200 对所检测的“白色”中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使入射光能够穿过试管照射到TCS3200 上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的三个调整参数。
当用TCS3200 识别颜色时,就用这三个参数对所测颜色的R 、G 和B 进行调整。这里有两种方法来计算调整参数:①依次选通三种颜色的滤波器,然后对 TCS3200的输出脉冲依次进行计数。当计数到255 时停止计数,分别计算每个通道所用的时间。这些时间对应于实际测试时TCS3200 每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R 、G 和B 的值。②设置定时器为一固定时间(例如10ms ),然后选通三种颜色的滤波器,计算这段时间内 TCS3200 的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。在实际测试时,使用同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的 R 、G 和B 的值
使用本模块的结果都是基于白平衡而工作的!

4. 产品参数
(A)颜色光到频率转换主芯片:TCS3200D
(B)输出频率范围从10kHz~12kHz,占空比50%
(C)工作电压:+2.7V~+5.5V
(D)工作电流:1.4mA
(E)检测状态:静态检测
(F)最佳检测距离:10mm
(G)工作温度:-40°C~+85°C

5. 接线方式

Arduino UNO———–Color Sensor
Digital 6——————S0
Digital 5——————S1
Digital 4——————S2(决定颜色通过引脚,配合S3引脚)
Digital 3——————S3
Digital 2——————OUT
VCC————————VCC
GND————————GND
说明:请按照教程上的引脚定义接线,待教程做通后再尝试其他引脚或程序。

6. 示例程序
接好电路后,开始烧录颜色传感器测试代码。开始测试时,要进行白平衡测试,所谓白平衡,就是告诉TCS3200什么是白色的。测试代码中已经有了该代码,首先找一个白色光源或比较纯净的白色环境,打开串口,DEMO会自动得到“白色”的RGB值,后面所有的测试颜色值都是以这个“白色”值为基准。最佳测试距离10MM。

//中贝斯特UltiRobot颜色识别传感器示例教程
//程序效果:先进行白平衡,打开串口监视器可以看到检测到时RGB值。
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.com
#include <TimerOne.h>//申明库文件
//把TCS3200颜色识别传感器各控制引脚连到Arduino数字端口 
#define S0     6   //物体表面的反射光越强,TCS3200内置震荡器产生的方波频率越高,
#define S1    5   //SO和S1的组合决定输出信号频率比例因子,比例因子为2%
//比例因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比
#define S2     4  //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器
#define S3     3
#define OUT    2 //TCS3200颜色传感器输出信号
//在中断函数中纪录TCS3200输出信号的脉冲个数
int   g_count = 0;    // 计算与反射光相对应TCS3200颜色传感器输出信号的脉冲数
int   g_array[3];     // 存储RGB值
int   g_flag = 0;     // 滤波器模式选择顺序标志
float g_SF[3];        // 从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
//初始化TSC3200各控制引脚的输入输出模式
//设置TCS3200的内置振荡器方波频率与其输出信号频率的比例因子为2%
void TSC_Init()
{
   pinMode(S0, OUTPUT);
   pinMode(S1, OUTPUT);
   pinMode(S2, OUTPUT);
   pinMode(S3, OUTPUT);
   pinMode(OUT, INPUT);
   digitalWrite(S0, LOW);
  digitalWrite(S1, HIGH);
}
//选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器
void TSC_FilterColor(int Level01, int Level02)
{
   if(Level01 != 0)
     Level01 = HIGH;
   if(Level02 != 0)
     Level02 = HIGH;
   digitalWrite(S2, Level01); 
   digitalWrite(S3, Level02); 
}
//中断函数,计算TCS3200输出信号的脉冲波
void TSC_Count()
{
   g_count ++ ;
}
//定时器中断函数,每1S中断后,把该时间内的红、绿、蓝三种光线通过滤波器时,
//TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中
void TSC_Callback()
{
   switch(g_flag)
   {
     case 0: 
          Serial.println("->WB Start");
          TSC_WB(LOW, LOW);              //选择让红色光线通过滤波器的模式

          break;
     case 1:
          Serial.print("->Frequency R=");
          Serial.println(g_count);    //打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数
          g_array[0] = g_count;       //存储1S内的红光通过滤波器时,TCS3200输出的脉冲个数
          TSC_WB(HIGH, HIGH);            //选择让绿色光线通过滤波器的模式

          break;
     case 2:
          Serial.print("->Frequency G=");
          Serial.println(g_count);  //打印1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
          g_array[1] = g_count;  //存储1S内的绿光通过滤波器时,TCS3200输出的脉冲个数
          TSC_WB(LOW, HIGH);             //选择让蓝色光线通过滤波器的模式

          break;
     case 3:
          Serial.print("->Frequency B=");
          Serial.println(g_count);  //打印1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
          Serial.println("->WB End");
          g_array[2] = g_count;  //存储1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
          TSC_WB(HIGH, LOW);             //选择无滤波器的模式  
          break;
    default:
          g_count = 0;  //计数值清零
          break;
   }
}
//设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志
//该函数被TSC_Callback()调用
void TSC_WB(int Level0, int Level1)      //White Balance
{
   g_count = 0; //计数值清零
   g_flag ++;  //输出信号计数标志
   TSC_FilterColor(Level0, Level1); //滤波器模式
   Timer1.setPeriod(1000000);             // 设置输出信号脉冲计数时长1s
}
//初始化
void setup()
{
   TSC_Init();
   Serial.begin(9600);  //启动串口通信
   Timer1.initialize();             // defaulte is 1s缺省是1秒
   Timer1.attachInterrupt(TSC_Callback);  //设置定时器1的中断,中断调用函数为TSC_Callbace()

//设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()
   attachInterrupt(0, TSC_Count, RISING);  
   delay(4000); //延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数

//通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
   for(int i=0; i<3; i++)
     Serial.println(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] ;    //蓝色光比例因子

//打印白平衡后的红、绿、蓝三色的RGB比例因子
   Serial.println(g_SF[0]);
   Serial.println(g_SF[1]);
   Serial.println(g_SF[2]);
}
//红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
//打印被测物体的RGB值
void loop()
{
    g_flag = 0;//每获得一次被测物体的RGB颜色值时需要4s
    for(int i=0; i<3; i++)      //打印被测物体的RGB值 
     Serial.println(int(g_array[i] * g_SF[i]));
    delay(4000);
}

8. 效果检验
百度搜索一个RGB颜色转换:点我查看
输入得到的颜色值,查看对应的颜色与实际测试的颜色是否相符。

(数值对应的显示区底色为白色)

9. 注意事项
1.模块测试各种颜色存在一定的色差,对颜色测试要求很高者请慎重考虑后购买。
2.TCS3200与要测试的物体的最佳距离大约为1cm。
3.每次重新上电前,都要进行白平衡调节,具体操作为:先找一张白纸放在传感器垂直下方,高度1cm,再开电源,然后再测量其他颜色物体。
4.每次白平衡调节的白色物体的白色程度很重要,尽量选择颜色比较正的白色来进行白平衡调节。
5、很多人碰到RGB值超过0-255范围,其实是在第一次开机会做白平衡校正,此时我们记录本次数据为255,255,255的基准值,后面的测量是与这个基准值比较的,所以光照度增加后带来的超范围数值,是没有参考价值的,一般来说,照明条件发生变化后需要重新校正白平衡。

10. 相关下载
百度网盘:点我下载

未经允许不得转载:Arduino-Maker » 颜色识别传感器TCS3200 示例教程 适用于Arduino平台

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

线上商城

中贝斯特创客空间蘑菇云创客教育