37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验六十三: 颜色传感器GY-33 GY-31 TCS3200D TCS34725颜色识别颜色感应模块
模块电原理图之二
模块工作原理
通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D 来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。
TCS3200D传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2和S3的高低电平来选择滤波器模式。
TCS3200D有可编程的彩色光到电信号频率的转换器,当被测物体反射光的红、绿、蓝三色光线分别透过相应滤波器到达TAOS TCS3200RGB感应芯片时,其内置的振荡器会输出方波,方波频率与所感应的光强成比例关系,光线越强,内置的振荡器方波频率越高。TCS3200传感器有一个OUT引脚,它输出信号的频率与内置振荡器的频率也成比例关系,它们的比率因子可以靠其引脚S0和S1的高低电平来选择。
模块引脚图
TCS3200D颜色识别传感器模块实验所需硬件清单
Arduino Uno开发板 X1
RGB三色LED灯模块X1
杜邦线 若干(备了9条)
IIC/I2C 1602 LCD液晶屏模块X1
TCS3200D颜色识别传感器模块X1
Proto Shield 原型扩展板(带mini面包板)X1
传感器模块实验所需软件平台
代码编程 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
白平衡校正方法
在实际环境中,自然光、灯光都有其色温,白色也有不同的颜色偏差。所以实验前,第一个物体必须是白色的,因为程序先运行白平衡测试,测试后程序计算得出比例因子,之后就可以比较正确的测出其他颜色。当第1次使用TCS3200D,或TCS3200D识别模块重启、更换光源等情况时,都需要进行白平衡调整。
白平衡校正方法是:把一个白色物体放置在TCS3200颜色传感器之下,两者相距10mm左右,点亮传感器上的4个白光LED灯,用Arduino控制器的定时器设置一固定时间1s,然后选通三原色的滤波器,让被测物体反射光中红、绿、蓝三色光分别通过滤波器,计算1s时间内三色光对应的TCS3200传感器OUT输出信号脉冲数(单位时间的脉冲数包含了输出信号的频率信息),再通过正比算式得到白色物体RGB值255与三色光脉冲数的比例因子。有了白平衡校正得到的RGB比例因子,则其它颜色物体反射光中红、绿、蓝三色光对应的TCS3200输出信号1s内脉冲数乘以R、G、B比例因子,就可换算出了被测物体的RGB标准值了。
实验中需要注意的问题
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);
}
实验串口返回情况
程序二:动态显示红绿蓝三色的波形
(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)实验串口返回情况
打开Arduino IDE——工具——串口绘图器,查看实验波形
实验串口绘图器返回情况
Arduino实验场景图
程序四:三种颜色的波形显示
(1)实验开源仿真编程(Linkboy V4.63)
实验串口绘图器返回情况
hacker_2023.08.09
666