1、 连线与代码(硬件与软件)
1.1 连线图
1.2 代码
define S0 2
define S1 3
define S2 4
define S3 5
define sensorOut 6
int R;
int G;
int B;
void setup() {
pinMode(S0,OUTPUT);
pinMode(S1,OUTPUT);
pinMode(S2,OUTPUT);
pinMode(S3,OUTPUT);
//输出频率out引脚
pinMode(sensorOut1,INPUT);
//S0和S1设置频率比2%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
}
void loop() {
//检测红色计数
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
R = pulseIn(sensorOut1,LOW);
delay(100);
//检测绿色计数
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
G = pulseIn(sensorOut2,LOW);
delay(100);
//检测蓝色计数
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
B = pulseIn(sensorOut3,LOW);
delay(100);
//输出三原色的技术
Serial.print("Red="R," Green="G," Blue="B);
}
2、 功能和引脚图
3、可用组合
4、原理
4.1 三原色的原理
通常看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光中一部分有色成分,而反射出另一部分有色光,从而被人眼吸收。白色光是由各种频率的可见光混合而成的,根据德国物理学家赫姆霍兹的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
4.2 颜色识别原理
对于TCS3200来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其他原色。例如:当选择红色滤波器时,入射光只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其他的滤波器,就可以得到蓝色和绿色光的光强、通过这三个值,就可以分析投射到TCS3200传感器上的光的颜色。
4.3 白平衡原理
白平衡设置是为了告诉系统什么是白色。从理论上,白色是由等量的红色、绿色和蓝色组成的。但实际上,白色中的三原色并不完全相等,并且,TCS3200对不同色光的敏感性不同,使得TCS3200对R\G\B输出的值并不相等,因此对白色的“定义”不同,所以在测试钱必须进行白平衡挑战(只针对需要较精准地识别出各种各样不同的颜色,如果只需要区分出几种颜色,可以直接对R\G\B值划分阈值来区分)
白平衡挑战的步骤:
将白色物体放置在TCS3200下方,依次通过红色、绿色和蓝色滤波器,分别测试出红色、绿色和蓝色的值,然后计算出需要调整的3个比例因子,即将值转化为0~255之间。
5、比较
这是目前网上常见的arduino的颜色识别代码:
https://www.eefocus.com/zhang700309/blog/13-08/296390_6c438.html
这是目前网上常见的C51的颜色识别代码:
http://www.51hei.com/bbs/dpj-36234-1.html
这是比较全面的TCS3200的文档:
https://wenku.baidu.com/view/7961e4ec71fe910ef12df87d.html
这两个代码都是通过定时器中断,软件计数的方法来得到各个颜色的方波个数。其实TCS3200自带有OUT引脚,可以直接输出方波个数,因此使用OUT引脚可以大大简化程序。而且直接通过内部硬件计数,更加稳定可靠。最初使用过上面两个代码,数据变动大,效果较差,因此不建议使用。
6、问题
- 颜色识别传感器价格便宜,检测效果不好。只适合静物检测,动态的话更加不稳定。
- 太多连线,很容易出错,而且很敏感,不稳定