这篇文章向您展示了如何使用 TCS230/TCS3200 颜色传感器使用 Arduino 检测颜色。
TCS3200颜色传感器可以根据波长检测各种颜色。该传感器特别适用于颜色识别项目,例如颜色匹配、颜色分类、试纸读取等。
目录
介绍
TCS3200颜色传感器(如下图所示)使用 TAOS TCS3200 RGB 传感器芯片来检测颜色。它还包含四个白色 LED,可照亮其前面的物体。
规格
以下是传感器规格:
- 电源:2.7V 至 5.5V
- 尺寸:28.4 x 28.4mm (1.12 x 1.12“)
- 接口:数字TTL
- 光强度到频率的高分辨率转换
- 可编程颜色和满量程输出频率
- 直接与微控制器通信
TCS3200传感器是如何工作的?
TCS3200具有一系列带有 4 个不同滤光片的光电二极管。光电二极管只是一种将光转换为电流的半导体器件。该传感器具有:
- 16 个带红色滤光片的光电二极管 – 对红色波长敏感
- 16 个带绿色滤光片的光电二极管 – 对绿色波长敏感
- 16 个带蓝色滤光片的光电二极管 – 对蓝色波长敏感
- 16 个不带滤光片的光电二极管
如果你仔细观察TCS3200芯片,你可以看到不同的滤波器。
通过有选择地选择光电二极管滤光片的读数,您可以检测不同颜色的强度。该传感器有一个电流频率转换器,可将光电二极管的读数转换为方波,其频率与所选颜色的光强度成正比。然后,Arduino读取该频率 – 如下图所示。
引脚排列
以下是传感器引脚排列:
引脚名称 | I/O | 描述 |
接地 (4) | 电源接地 | |
OE系列 (3) | I | 使能输出频率(低电平有效) |
输出 (6) | O | 输出频率 |
S0, S1(1,2) | I | 输出频率调节选择输入 |
中二、中三(7,8) | I | 光电二极管类型选择输入 |
电压直流(VDD)(5) | 电压供应 |
过滤器选择
要选择光电二极管读取的颜色,请使用控制引脚 S2 和 S3。由于光电二极管是并联的,因此将 S2 和 S3 LOW 和 HIGH 设置为不同的组合允许您选择不同的光电二极管。请看下表:
光电二极管类型 | S2 | S3 |
Red | LOW | LOW |
蓝 | LOW | HIGH |
无过滤器(清除) | HIGH | LOW |
绿 | HIGH | HIGH |
频率调节
引脚 S0 和 S1 用于调节输出频率。它可以缩放到以下预设值:100%、20% 或 2%。调整输出频率有助于优化各种频率计数器或微控制器的传感器读数。请看下表:
输出频率调节 | S0 | S1 |
关 | L | L |
2% | L | H |
20% | H | L |
100% | H | H |
对于Arduino,通常使用20%的频率缩放。因此,将 S0 引脚设置为 HIGH,将 S1 引脚设置为 LOW。
使用Arduino和TCSP3200进行颜色感应
在此示例中,您将使用 Arduino 和 TCSP3200 颜色传感器检测颜色。 该传感器不是很准确,但可以很好地检测简单项目中的颜色。
所需零件
以下是此项目所需的部件:
- TCSP3200 或 TCS230 颜色传感器
- Arduino UNO
- 跳线
连接图
将TCSP3200传感器连接到Arduino非常简单。只需按照下图操作即可。
以下是 TCSP3200 和 Arduino 之间的联系:
- S0:数字引脚 4
- S1:数字引脚 5
- VCC:5V
- S3:数字引脚 6
- S4:数字引脚 7
- OUT:数字引脚 8
用法
此项目需要两个程序:
- 在串行监视器上读取和显示输出频率。在这一部分中,当您在传感器前面放置不同的颜色时,您需要记下频率值。
- 区分不同的颜色。在本节中,您将在代码中插入之前选取的频率值,以便传感器可以区分不同的颜色。我们将检测红色、绿色和蓝色。
1. 读取输出频率
将以下代码上传到Arduino开发板。
// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
void setup() {
// Setting the outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Setting the sensorOut as an input
pinMode(sensorOut, INPUT);
// Setting frequency scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Begins serial communication
Serial.begin(9600);
}
void loop() {
// Setting RED (R) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
redFrequency = pulseIn(sensorOut, LOW);
// Printing the RED (R) value
Serial.print("R = ");
Serial.print(redFrequency);
delay(100);
// Setting GREEN (G) filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
greenFrequency = pulseIn(sensorOut, LOW);
// Printing the GREEN (G) value
Serial.print(" G = ");
Serial.print(greenFrequency);
delay(100);
// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
blueFrequency = pulseIn(sensorOut, LOW);
// Printing the BLUE (B) value
Serial.print(" B = ");
Serial.println(blueFrequency);
delay(100);
}
以 9600 的波特率打开串行监视器。
将蓝色物体放置在传感器前面的不同距离。您应该保存两个测量值:当物体远离传感器时和当物体靠近传感器时。
检查串行监视器上显示的值。与红色 (R) 和绿色 (G) 频率读数相比,蓝色频率 (B) 应该是最低的——见下图。
当我们将蓝色物体放在传感器前面时,蓝色频率 (B) 值在 59 到 223 之间振荡(参见突出显示的值)。
注意:您不能在代码中使用这些频率值(59 和 223),您应该使用自己的颜色传感器测量特定对象的颜色。然后,保存蓝色的频率上限和下限,因为您稍后会用到它们。
对绿色和红色物体重复此过程,并记下每种颜色的频率上限和下限。
2.区分不同的颜色
下一个程序将频率值映射到 RGB 值(介于 0 和 255 之间)。
在上一步中,当我们有最大蓝色时,我们获得了 59 的频率,当我们在更高的距离上拥有蓝色时,我们获得了 223。
因此,频率 59 对应于 255(RGB),频率 223 对应于 0(RGB)。我们将使用 Arduino map() 函数来做到这一点。在 map() 函数中,您需要将 XX 参数替换为您自己的值。
为了区分不同的颜色,我们有三个条件:
- 当 R 是最大值(在 RGB 参数中)时,我们知道我们有一个红色对象
- 当 G 是最大值时,我们知道我们有一个绿色物体
- 当 B 是最大值时,我们知道我们有一个蓝色物体
现在,在传感器前面放一些东西。它应该在串行监视器中打印检测到的颜色:红色、绿色或蓝色。
提示:您的传感器还可以使用更多 if 语句检测其他颜色。
结束语
在这篇文章中,您学习了如何使用TCSP3200颜色传感器检测颜色。
您只需添加一个伺服电机即可轻松构建色选机。
您有与颜色分类相关的项目想法吗?