回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【雕爷学编程】Arduino动手做(63)---TCS3200D颜色识别传感器3 中等

头像 驴友花雕 2023.07.24 16 1

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验六十三: 颜色传感器GY-33 GY-31 TCS3200D TCS34725颜色识别颜色感应模块
 

04.jpg

TCS3200技术资料(共14页):

https://pdf.easybom.com/r/datasheets/ams-tcs3200dtr-datasheets-2115.pdf

 

38.jpg

模块电原理图之二

 

5.14-15.jpg

模块工作原理

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

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

 

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

 

5.14-17.jpg

 

 

TCS3200D有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOS TCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0和S1的高低电平来选择。
 

5.14-18.jpg

模块引脚图
 

5.14-19.jpg

5.14-20.jpg

TCS3200D颜色识别传感器模块实验所需硬件清单
Arduino Uno开发板 X1
RGB三色LED灯模块X1
杜邦线 若干(备了9条)
IIC/I2C 1602 LCD液晶屏模块X1
TCS3200D颜色识别传感器模块X1
Proto Shield 原型扩展板(带mini面包板)X1
 

5.14-21.jpg

传感器模块实验所需软件平台
代码编程 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

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

 

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

 

5.14-26.jpg
 

实验中需要注意的问题

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

程序一:每2秒选择一个光电二极管组并读取它的数据
(1)Arduino参考开源代码

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序一:每2秒选择一个光电二极管组并读取它的数据
*/

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

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

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

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

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

  digitalWrite(s2, HIGH);
  digitalWrite(s3, HIGH);
  Serial.print(" 绿色值= ");
  GetData();
  Serial.println();
  delay(2000);
}

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

实验串口返回情况
 

5.14-27.jpg

程序二:动态显示红绿蓝三色的波形
(1)Arduino参考开源代码
 

 

代码
/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序二:动态显示红绿蓝三色的波形
  实验模块接线
  Arduino Uno          <----->          TSC3200颜色传感器
  Pin 6                <----->                  S0
  Pin 5                <----->                  S1
  Pin 4                <----->                  S2
  Pin 3                <----->                  S3
  Pin 2                <----->                 OUT
  5V                  <----->                 VCC
  GND                <----->                 GND
*/

#define S0 6
#define S1 5
#define S2 4
#define S3 3
#define sensorOut 2
int frequency = 0;

void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);
  // 将频率缩放设置为20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  Serial.begin(9600);
}
void loop() {
  // 设置要读取的红色滤波光电二极管
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -49, 255, 0);
  // 在串行监视器上打印值
  Serial.print("R= ");//打印名称
  Serial.print(frequency);//打印红色频率
  Serial.print("  ");
  delay(2000);
  // 设置要读取的绿色过滤光电二极管
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -50, 255, 0);
  //在串行监视器上打印值
  Serial.print("G= ");//打印名称
  Serial.print(frequency);//打印绿色频率
  Serial.print("  ");
  delay(2000);
  // 设置要读取的蓝色滤光光电二极管
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // 读取输出频率
  frequency = pulseIn(sensorOut, LOW);
  frequency = map(frequency,-10, -41, 255, 0);
  // 在串行监视器上打印值
  Serial.print("B= ");//打印名称
  Serial.print(frequency);//打印蓝色频率
  Serial.println("  ");
  delay(2000);
}

(2)实验串口返回情况
 

5.14-28.jpg

打开Arduino IDE——工具——串口绘图器,查看实验波形
实验串口绘图器返回情况
 

5.14-29.jpg

Arduino实验场景图
 

5.14-30.jpg

程序四:三种颜色的波形显示
(1)实验开源仿真编程(Linkboy V4.63)
 

5.14-32.jpg

实验串口绘图器返回情况

 

5.14-33.jpg

评论

user-avatar
  • hacker_

    hacker_2023.08.09

    666

    0
    icon 他的勋章
      展开更多