颜色识别模块TCS230、TCS3200代码(arduino)

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、问题

  • 颜色识别传感器价格便宜,检测效果不好。只适合静物检测,动态的话更加不稳定。
  • 太多连线,很容易出错,而且很敏感,不稳定
  • 14
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是基于Arduino的循迹和TCS3200颜色识别小车的代码参考: 循迹小车代码: ```C++ //定义引脚 int left1 = 11; int left2 = 10; int right1 = 9; int right2 = 6; int left_pin = A0; int right_pin = A1; //定义阈值 int left_value = 0; int right_value = 0; void setup() { Serial.begin(9600); pinMode(left1, OUTPUT); pinMode(left2, OUTPUT); pinMode(right1, OUTPUT); pinMode(right2, OUTPUT); } void loop() { //读取左右两个巡线传感器的值 left_value = analogRead(left_pin); right_value = analogRead(right_pin); //如果左右都在黑线上,直行 if (left_value < 600 && right_value < 600) { digitalWrite(left1, HIGH); digitalWrite(left2, LOW); digitalWrite(right1, HIGH); digitalWrite(right2, LOW); } //如果左侧在黑线上,右转 else if (left_value >= 600 && right_value < 600) { digitalWrite(left1, LOW); digitalWrite(left2, LOW); digitalWrite(right1, HIGH); digitalWrite(right2, LOW); } //如果右侧在黑线上,左转 else if (left_value < 600 && right_value >= 600) { digitalWrite(left1, HIGH); digitalWrite(left2, LOW); digitalWrite(right1, LOW); digitalWrite(right2, LOW); } //如果左右都不在黑线上,倒车 else { digitalWrite(left1, LOW); digitalWrite(left2, HIGH); digitalWrite(right1, LOW); digitalWrite(right2, HIGH); } } ``` TCS3200颜色识别小车代码: ```C++ //定义引脚 int S0 = 7; int S1 = 6; int S2 = 5; int S3 = 4; int out_pin = 3; //定义颜色值 int R = 0; int G = 0; int B = 0; void setup() { Serial.begin(9600); pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(out_pin, INPUT); digitalWrite(S0, HIGH); digitalWrite(S1, LOW); } void loop() { //读取颜色值 digitalWrite(S2, LOW); digitalWrite(S3, LOW); R = pulseIn(out_pin, digitalRead(out_pin) == HIGH ? LOW : HIGH); digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); G = pulseIn(out_pin, digitalRead(out_pin) == HIGH ? LOW : HIGH); digitalWrite(S2, LOW); digitalWrite(S3, HIGH); B = pulseIn(out_pin, digitalRead(out_pin) == HIGH ? LOW : HIGH); //判断颜色 if (R > 200 && G < 100 && B < 100) { Serial.println("红色"); } else if (R < 100 && G > 200 && B < 100) { Serial.println("绿色"); } else if (R < 100 && G < 100 && B > 200) { Serial.println("蓝色"); } else { Serial.println("无色"); } } ``` 注意事项: 1. 循迹小车需要在黑线上测试阈值,并且根据实际情况调整代码中的阈值。 2. TCS3200颜色识别模块需要根据具体使用的RGB LED颜色,可以在代码中调整阈值或者添加其他颜色的判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值