网站首页 > 基础教程 正文
有这样一种生物——螳螂虾,号称世界上视力最好的海洋生物,它拥有16个眼部感光器,可以看到紫外线、可见光和偏振光。事实上,它们是唯一已知的动物可以检测圆偏振光,他们还可以用一只眼睛感知的深度,另一只眼感受距离。是不是很神奇呢?
我们人眼虽然没有这样强大的功能,但胜在我们会生产并利用工具呀!今天就来为大家介绍一款颜色检测器,一起来看看吧。
实验名称:TCS3200颜色传感器
- TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。
- TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。
- 每6种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。
- 内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系。
一、实验说明
学习TCS3200颜色传感器的具体使用方法,并在串口监控器查看。
二、物料清单
PS:所需物料可以在这里购买—http://tbll000175.cn/DXSXCvr4
三、模块说明
针脚说明:
四、连线图
五、重要提示
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颜色传感器的使用 */ #include <TimerOne.h> #define S0 6 // Please notice the Pin's define #define S1 5 #define S2 4 #define S3 3 #define OUT 2 int g_count = 0; // count the frequecy int g_array[3]; // store the RGB value int g_flag = 0; // filter of RGB queue float g_SF[3]; // save the RGB Scale factor // Init TSC230 and setting Frequency. void TSC_Init() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(OUT, INPUT); digitalWrite(S0, LOW); // OUTPUT FREQUENCY SCALING 2% digitalWrite(S1, HIGH); } // Select the filter color void TSC_FilterColor(int Level01, int Level02) { if (Level01 != 0) Level01 = HIGH; if (Level02 != 0) Level02 = HIGH; digitalWrite(S2, Level01); digitalWrite(S3, Level02); } void TSC_Count() { g_count ++ ; } void TSC_Callback() { switch (g_flag) { case 0: Serial.println("->WB Start"); TSC_WB(LOW, LOW); //Filter without Red break; case 1: Serial.print("->Frequency R="); Serial.println(g_count); g_array[0] = g_count; TSC_WB(HIGH, HIGH); //Filter without Green break; case 2: Serial.print("->Frequency G="); Serial.println(g_count); g_array[1] = g_count; TSC_WB(LOW, HIGH); //Filter without Blue break; case 3: Serial.print("->Frequency B="); Serial.println(g_count); Serial.println("->WB End"); g_array[2] = g_count; TSC_WB(HIGH, LOW); //Clear(no filter) break; default: g_count = 0; break; } } void TSC_WB(int Level0, int Level1) //White Balance { g_count = 0; g_flag ++; TSC_FilterColor(Level0, Level1); Timer1.setPeriod(1000000); // set 1s period } void setup() { TSC_Init(); Serial.begin(9600); Timer1.initialize(); // defaulte is 1s Timer1.attachInterrupt(TSC_Callback); attachInterrupt(0, TSC_Count, RISING); delay(4000); for (int i = 0; i < 3; i++) Serial.println(g_array[i]);[/i] g_SF[0] = 255.0 / g_array[0]; //R Scale factor g_SF[1] = 255.0 / g_array[1] ; //G Scale factor g_SF[2] = 255.0 / g_array[2] ; //B Scale factor Serial.println(g_SF[0]); Serial.println(g_SF[1]); Serial.println(g_SF[2]); } void loop() { g_flag = 0; for (int i = 0; i < 3; i++) Serial.println(int(g_array * g_SF)); delay(4000); }
串口监视器:
七、相关函数介绍
delay(ms):延时函数(参数:时间,单位:ms)。延时一段时间,以毫秒为单位,如1000为1秒。
Serial.print(val) :在串行口以人们可以看懂的 ASSCII 码的形式打印数据。参数val:要打印的值。
Serial.println(val):将数据作为人类可读的ASCII文本打印到串行端口,后跟回车符(ASCII 13或'\ r')和换行符(ASCII 10或'\ n')。参数val:要打印的值。
今天的内容你学会了吗?动手实践才是真理呦,赶快跟着小编的讲解实际操作一下吧!有问题还可以在评论区留言呦!关注我们的微信公众号:xunmingiot,后台回复“入门”即可获取学习资料,帮助你更好的进入学习。
我们下期再见啦!(码字不易,点个赞再走呗)
往期教程可以点击以下链接查看:
怎样快速入门Arduino?(二十二)—在SD卡中进行文件读写
猜你喜欢
- 2024-10-12 R数据分析:倾向性评分匹配实例操作
- 2024-10-12 要为学习神经网络奠定基础,你需要认真读读R深度学习
- 2024-10-12 把数据输入R之后,如何进行简单的操作(一)
- 2024-10-12 聚类分析5—物种集合-数量生态学:R语言的应用 第四章
- 2024-10-12 一文读懂R中的探索性数据分析(附R代码)
- 2024-10-12 从0开始自制解释器——添加对括号的支持
- 2024-10-12 常见编程语言:Go:Go语言函数与方法
- 2024-10-12 Python基础之变量、循环、函数(二)
- 2024-10-12 R语言中使用scan函数从键盘获取数据的方法
- 2024-10-12 ElasticSearch系列-搜索-评分(function_score)
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)