TCS3200颜色传感器使用说明

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOSTCS3200RGB感应芯片和4个白光LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。它适合于色度计测量应用领域。比如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制。通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。TCS3200D传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2和S3的高低电平来选择滤波器模式,如下图。TCS3200D有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOSTCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0和S1的高低电平来选择,如下图。这个测试实验,我把TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率比率因子设为2%,有了输出频率比例因子,但是如何通过OUT引脚输出信号频率来换算出被测物体由三原色光强组成的RGB颜色值呢?这还需进行白平衡校正来得到RGB比例因子才行!白平衡校正方法是:把一个白色物体放置在TCS3200颜色传感器之下,两者相距10mm左右,点亮传感器上的4个白光LED灯,用Arduino控制器的定时器设置一固定时间1s,然后选通三原色的滤波器,让被测物体反射光中红、绿、蓝三色光分别通过滤波器,计算1s时间内三色光对应的TCS3200传感器OUT输出信号脉冲数(单位时间的脉冲数包含了输出信号的频率信息),再通过正比算式得到白色物体RGB值255与三色光脉冲数的比例因子。有了白平衡校正得到的RGB比例因子,则其它颜色物体反射光中红、绿、蓝三色光对应的TCS3200输出信号1s内脉冲数乘以R、G、B比例因子,就可换算出了被测物体的RGB标准值了。现在谈谈,如何进行TCS3200各控制引脚与Arduino控制器的硬件连线问题,下图分别是TCS3200传感器和其连线图。上图中TCS3200传感器各控制引脚与Arduino控制器数字端口连线的对应关系,我设置为:#defineS06#defineS15#defineS24#defineS33#defineOUT2#defineLED7当被测物体为不发光物体时,应该把TCS3200的LED引脚设置为高电平,以点亮TCS3200传感器电路板上的四个白光LED灯。下文展示了一个带有白平衡的测试程序,把这个程序下载到Arduino控制器中,同时把一个白色物体放置在TCS3200颜色传感器之下,点亮传感器上的4个白光LED灯,再打开ArduinoIDE的串口监视器,会出现下图监视画面,可以在该画面中找到白色物体RGB值255以及RGB比例因子。(可通过QQ截图来锁定画面,以便观察。)(双击图片,可以放大看!)把白平衡时放置在TCS3200颜色传感器之下白色物体拿走,放上另一个黄色物体,在ArduinoIDE串口监视器看到的这个黄色物体RGB值为233、157、56,如下图所示。打开电脑Windows操作系统自带的画图板,点击菜单栏“颜色”---“编辑颜色”---“规定自定义颜色”--右下角输入RGB值,查看对应的颜色与实际测试的颜色是否相符。实际测试结果是测得的物体颜色与实际颜色有些偏色,但并不影响区分出被测物体是哪种颜色的物体。介绍完TCS3200传感器颜色识别原理和其与Arduino控制器的硬件连线,以及如何利用串口监视器找到白平衡后的比例因子和被测物体的RGB值。下面展示的是Arduino测试程序。注意:下面的#include《TimerOne.h要改为单括号形式。Arduino程序:#include《TimerOne.h//申明库文件//把TCS3200颜色传感器各控制引脚连到Arduino数字端口#defineS06//物体表面的反射光越强,TCS3002D内置振荡器产生的方波频率越高,#defineS15//S0和S1的组合决定输出信号频率比例因子,比例因子为2%//比率因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比#defineS24//S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器#defineS33#defineOUT2//TCS3200颜色传感器输出信号连接到Arduino中断0引脚,并引发脉冲信号中断//在中断函数中记录TCS3200输出信号的脉冲个数#defineLED7//控制TCS3200颜色传感器是否点亮LED灯floatg_SF[3];//从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子intg_count=0;//计算与反射光强相对应TCS3200颜色传感器输出信号的脉冲数//数组用于存储在1s内TCS3200输出信号的脉冲数,它乘以RGB比例因子就是RGB标准值intg_array[3];intg_flag=0;//滤波器模式选择顺序标志//初始化TSC3200各控制引脚的输入输出模式//设置TCS3002D的内置振荡器方波频率与其输出信号频率的比例因子为2%voidTSC_Init(){pinMode(S0,OUTPUT);pinMode(S1,OUTPUT);pinMode(S2,OUTPUT);pinMode(S3,OUTPUT);pinMode(OUT,INPUT);pinMode(LED,OUTPUT);digitalWrite(S0,LOW);digitalWrite(S1,HIGH);}//选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器voidTSC_FilterColor(intLevel01,intLevel02){if(Level01!=0)Level01=HIGH;if(Level02!=0)Level02=HIGH;digitalWrite(S2,Level01);digitalWrite(S3,Level02);}//中断函数,计算TCS3200输出信号的脉冲数voidTSC_Count(){g_count++;}//定时器中断函数,每1s中断后,把该时间内的红、绿、蓝三种光线通过滤波器时,//TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中voidTSC_Callback(){switch(g_flag){case0:Serial.println(-WBStart);TSC_WB(LOW,LOW);//选择让红色光线通过滤波器的模式break;case1:Serial.print(-FrequencyR=);Serial.println(g_count);//打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数g_array[0]=g_count;//存储1s内的红光通过滤波器时,TCS3200输出的脉冲个数TSC_WB(HIGH,HIGH);//选择让绿色光线通过滤波器的模式break;case2:Serial.print(-FrequencyG=);Serial.println(g_count);//打印1s内的绿光通过滤波器时,TCS3200输出的脉冲个数g_array[1]=g_count;//存储1s内的绿光通过滤波器时,TCS3200输出的脉冲个数TSC_WB(LOW,HIGH);//选择让蓝色光线通过滤波器的模式break;case3:Serial.print(-FrequencyB=);Serial.println(g_count);//打印1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数Serial.println(-WBEnd);g_array[2]=g_count;//存储1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数TSC_WB(HIGH,LOW);//选择无滤波器的模式break;default:g_count=0;//计数值清零break;}}//设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志//该函数被TSC_Callback()调用voidTSC_WB(intLevel0,intLevel1){g_count=0;//计数值清零g_flag++;//输出信号计数标志TSC_FilterColor(Level0,Level1);//滤波器模式Timer1.setPeriod(1000000);//设置输出信号脉冲计数时长1s}//初始化voidsetup(){TSC_Init();Serial.begin(9600);//启动串行通信Timer1.initialize();//defaulteis1sTimer1.attachInterrupt(TSC_Callback);//设置定时器1的中断,中断调用函数为TSC_Callback()//设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()attachInterrupt(0,TSC_Count,RISING);digitalWrite(LED,HIGH);//点亮LED灯delay(4000);//延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数//通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子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],5);Serial.println(g_SF[1],5);Serial.println(g_SF[2],5);//红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值//打印被测物体的RGB值for(inti=0;i3;i++)Serial.println(int(g_array[i]*g_SF[i]));}//主程序voidloop(){g_flag=0;//每获得一次被测物体RGB颜色值需时4sdelay(4000);//打印出被测物体RGB颜色值for(inti=0;i3;i++)Serial.println(int(g_array[i]*g_SF[i]));}程序中的头文件TimerOne.h文件请下载:上面是带有白平衡的测试程序,对于具体项目的应用程序,要在此基础上加以变动。如果TCS3200传感器与被测物体的检测距离以及周围环境光线没有发生大的变化,进行一次白平衡校正后,RGB比例因子就可以确定下来了。于是您一定要把得到的RGB比例因子直接替代掉红色字体标识程序段中的数组g_array[3]各元素变量。另外绿色字体标识的程序段也可以注释掉。在具体项目中,您所检测的是某

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功