Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器系列实验(64)---TCS3200D颜色识别传感器

[复制链接]
 楼主| 发表于 2022-4-18 20:33 | 显示全部楼层
模块电原理图之二

5.14-15.jpg

 楼主| 发表于 2022-4-18 20:34 | 显示全部楼层
模块工作原理
通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。


由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。


TCS3200D传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2S3的高低电平来选择滤波器模式。

5.14-17.jpg

 楼主| 发表于 2022-4-18 20:35 | 显示全部楼层
TCS3200D有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOS TCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0S1的高低电平来选择。

5.14-18.jpg

 楼主| 发表于 2022-4-18 20:35 | 显示全部楼层
模块引脚图

5.14-19.jpg

5.14-20.jpg

 楼主| 发表于 2022-4-18 20:36 | 显示全部楼层
TCS3200D颜色识别传感器模块实验所需硬件清单
Arduino Uno开发 X1
RGB三色LED灯模块X1
杜邦线 若干(备了9条)
IIC/I2C 1602 LCD液晶屏模块X1
TCS3200D颜色识别传感器模块X1
Proto Shield 原型扩展(带mini面包板)X1

5.14-21.jpg

 楼主| 发表于 2022-4-18 20:37 | 显示全部楼层
传感器模块实验所需软件平台
代码编程 Arduino IDE (版本1.8.19
仿真编程 Linkboy     (版本V4.6.3
图形编程 Mind+  (版本 V1.7.0 RC2.0
以及编玩边学(线上平台https://ide.codepku.com/?type=Arduino


实验接线示意图
Arduino Uno   <----->          TSC3200颜色传感器
Pin 6                <----->                  S0
Pin 5                <----->                  S1                       
Pin 4                <----->                  S2
Pin 3                <----->                  S3
Pin 2                <----->                 OUT
5V                   <----->                 VCC
GND                <----->      GND

5.14-22.jpg

 楼主| 发表于 2022-4-18 20:38 | 显示全部楼层
白平衡校正方法
在实际环境中,自然光、灯光都有其色温,白色也有不同的颜色偏差。所以实验前,第一个物体必须是白色的,因为程序先运行白平衡测试,测试后程序计算得出比例因子,之后就可以比较正确的测出其他颜色。当第1次使用TCS3200D,或TCS3200D识别模块重启、更换光源等情况时,都需要进行白平衡调整。

5.14-26.jpg

白平衡校正方法是:把一个白色物体放置在TCS3200颜色传感器之下,两者相距10mm左右,点亮传感器上的4个白光LED灯,用Arduino控制器的定时器设置一固定时间1s,然后选通三原色的滤波器,让被测物体反射光中红、绿、蓝三色光分别通过滤波器,计算1s时间内三色光对应的TCS3200传感器OUT输出信号脉冲数(单位时间的脉冲数包含了输出信号的频率信息),再通过正比算式得到白色物体RGB255与三色光脉冲数的比例因子。有了白平衡校正得到的RGB比例因子,则其它颜色物体反射光中红、绿、蓝三色光对应的TCS3200输出信号1s内脉冲数乘以RGB比例因子,就可换算出了被测物体的RGB标准值了。

 楼主| 发表于 2022-4-18 20:39 | 显示全部楼层
实验中需要注意的问题

1、不能检测灯光的颜色。
2、颜色识别时要避免外界光线的干扰,否则会影响颜色识别的结果,最好把传感器、光源等放置在一个密闭、无反射的箱子中进行测试。
3、对光源没有特殊的要求,但是光源发出的光要尽量集中,否则会造成传感器之间的相互干扰。
4、颜色识别传感器价格便宜,检测效果不好。只适合静物检测,动态的话更加不稳定。
5、太多连线,很容易出错,而且很敏感,影响稳定性。
6、一般都是通过定时器中断,软件计数的方法来得到各个颜色的方波个数。其实TCS3200自带有OUT引脚,可以直接输出方波个数,因此使用OUT引脚可以大大简化程序。而且直接通过内部硬件计数,更加稳定可靠。

 楼主| 发表于 2022-4-18 20:40 | 显示全部楼层
程序一:每2秒选择一个光电二极管组并读取它的数据
(1)Arduino参考开源代码
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序一:每2秒选择一个光电二极管组并读取它的数据
  4. */

  5. #define s0  6 //模块引脚接线
  6. #define s1  5
  7. #define s2  4
  8. #define s3  3
  9. #define out  2
  10. int data = 0; //这是要存值的地方

  11. void setup() {
  12.   pinMode(s0, OUTPUT);   //引脚模式
  13.   pinMode(s1, OUTPUT);
  14.   pinMode(s2, OUTPUT);
  15.   pinMode(s3, OUTPUT);
  16.   pinMode(out, INPUT)
  17.   Serial.begin(9600);  // 初始化串口监视器波特率

  18.   //将 S0/S1 置于 HIGH/HIGH 电平表示输出频率缩放为 100%(推荐)
  19.   digitalWrite(s0, HIGH);
  20.   //LOW/LOW 关闭 HIGH/LOW 为 20%,LOW/HIGH 为 2%
  21.   digitalWrite(s1, HIGH);
  22. }

  23. void loop() {     //每2s我们选择一个光电二极管组并读取它的数据
  24.   //S2/S3 级别定义了我们使用的光电二极管
  25.   //LOW/LOW 代表红色,LOW/HIGH 代表蓝色,HIGH/HIGH 代表绿色
  26.   digitalWrite(s2, LOW);      
  27.   digitalWrite(s3, LOW);
  28.   Serial.print("红色值= ");
  29.   GetData();  //执行GetData函数获取颜色值         

  30.   digitalWrite(s2, LOW);
  31.   digitalWrite(s3, HIGH);
  32.   Serial.print(" 蓝色值= ");
  33.   GetData();

  34.   digitalWrite(s2, HIGH);
  35.   digitalWrite(s3, HIGH);
  36.   Serial.print(" 绿色值= ");
  37.   GetData();
  38.   Serial.println();
  39.   delay(2000);
  40. }

  41. void GetData() {
  42.   //这里我们等到“out”变低,我们开始测量持续时间并在“out”再次为高时停止
  43.   data = pulseIn(out, LOW);   
  44.   //这是一个测量的持续时间,与频率有关,因为传感器根据颜色给出频率
  45.   Serial.print(data);   
  46.   //频率越高持续时间越短      
  47.   Serial.print("\t");         
  48.   delay(20);
  49. }
复制代码



 楼主| 发表于 2022-4-18 20:40 | 显示全部楼层
实验串口返回情况

5.14-27.jpg


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-11-29 23:49 , Processed in 0.073774 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表