怎样快速入门Arduino?(二十三)—TCS3200颜色传感器

有这样一种生物——螳螂虾,号称世界上视力最好的海洋生物,它拥有16个眼部感光器,可以看到紫外线、可见光和偏振光。事实上,它们是唯一已知的动物可以检测圆偏振光,他们还可以用一只眼睛感知的深度,另一只眼感受距离。是不是很神奇呢?


我们人眼虽然没有这样强大的功能,但胜在我们会生产并利用工具呀!今天就来为大家介绍一款颜色检测器,一起来看看吧。

实验名称:TCS3200颜色传感器

TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOSTCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。

TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。

每6种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。

内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系。

一、实验说明

学习TCS3200颜色传感器的具体使用方法,并在串口监控器查看。

二、物料清单


PS:所需物料可以在这里购买—

三、模块说明


针脚说明:



引脚说明

四、连线图


五、重要提示

1、TCS3200识别颜色的原理

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的值。

使用本模块的结果都是基于白平衡而工作的。

六、实验代码
/*作者:山东迅鸣物联网时间:2019年1月30日发表地址:程序说明:TCS3200颜色传感器的使用*/defineS06//PleasenoticethePin'sdefinedefineS24defineOUT2intg_count=0;//countthefrequecyintg_array[3];//storetheRGBvalueintg_flag=0;//filterofRGBqueuefloatg_SF[3];//savetheRGBScalefactor//_Init(){pinMode(S0,OUTPUT);pinMode(S1,OUTPUT);pinMode(S2,OUTPUT);pinMode(S3,OUTPUT);pinMode(OUT,INPUT);digitalWrite(S0,LOW);//OUTPUTFREQUENCYSCALING2%digitalWrite(S1,HIGH);}//SelectthefiltercolorvoidTSC_FilterColor(intLevel01,intLevel02){if(Level01!=0)Level01=HIGH;if(Level02!=0)Level02=HIGH;digitalWrite(S2,Level01);digitalWrite(S3,Level02);}voidTSC_Count(){g_count++;}voidTSC_Callback(){switch(g_flag){case0:("-WBStart");TSC_WB(LOW,LOW);//FilterwithoutRedbreak;case1:("-FrequencyR=");(g_count);g_array[0]=g_count;TSC_WB(HIGH,HIGH);//FilterwithoutGreenbreak;case2:("-FrequencyG=");(g_count);g_array[1]=g_count;TSC_WB(LOW,HIGH);//FilterwithoutBluebreak;case3:("-FrequencyB=");(g_count);("-WB");g_array[2]=g_count;TSC_WB(HIGH,LOW);//Clear(nofilter)break;default:g_count=0;break;}}voidTSC_WB(intLevel0,intLevel1)//WhiteBalance{g_count=0;g_flag++;TSC_FilterColor(Level0,Level1);(1000000);//set1speriod}voidsetup(){TSC_Init();(9600);();//(TSC_Callback);attachInterrupt(0,TSC_Count,RISING);delay(4000);for(inti=0;i3;i++)(g_array[i]);[/i]g_SF[0]=255.0/g_array[0];//RScalefactorg_SF[1]=255.0/g_array[1];//GScalefactorg_SF[2]=255.0/g_array[2];//(g_SF[0]);(g_SF[1]);(g_SF[2]);}voidloop(){g_flag=0;for(inti=0;i3;i++)(int(g_array*g_SF));delay(4000);}

串口监视器:



七、相关函数介绍

delay(ms):延时函数(参数:时间,单位:ms)。延时一段时间,以毫秒为单位,如1000为1秒。

(val):在串行口以人们可以看懂的ASSCII码的形式打印数据。参数val:要打印的值。

(val):将数据作为人类可读的ASCII文本打印到串行端口,后跟回车符(ASCII13或'\r')和换行符(ASCII10或'\n')。参数val:要打印的值。

我们下期再见啦!(码字不易,点个赞再走呗)

怎样快速入门Arduino?(二十二)—在SD卡中进行文件读写

怎样快速入门Arduino?(二十一)—ADXL345加速度传感器+1602

怎样快速入门Arduino?(二十)—1602液晶显示实验(2)

免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系