用颜色传感器感受颜色的变化
看到一个这样的视频:大致就是使用 Arduino 和颜色传感器判断 M&M 豆的颜色,M&M 豆的颜色其实并不多,所以该装置的作者使用了一个舵机和一个彩色的小仪表盘指示 M&M 豆的颜色。该项目的介绍地址如下(但并不是英文的):RGB Farb Sensor TCS34725 am Arduino 。

淘宝上可以找到同款的颜色传感器,一般来说会看到这两种样式的,一种是方形、一种是长条形两侧带孔的。价格差不多且功能一致,但是后者的安装孔的直径是3mm并且是双LED灯珠,前者是2.5mm安装孔加上单LED灯珠,看具体需求选择合适的版本。

这个传感器模块提供红色,绿色,蓝色(RGB)和清晰光感应值的数字输出,集成了红外阻挡滤光片,可最大限度地减少入射光的红外光谱成分,并可精确地进行颜色测量。
使用场景


接线参考
和 Arduino之间的接线方式如下表所示(只罗列了 Arduino Nano、Arduino UNO、D1 mini,其他模块的接线方式类似),实际上只要连接四根线即可运行:
TCS3472 颜色传感器 | Arduino UNO | Arduino Nano | D1 mini |
SDA | A4 (SDA) | A4 (SDA) | D2 (SDA) |
SCL | A5 (SCL) | A5 (SCL) | D1 (SCL) |
GND | GND | GND | GND |
VIN | 5V | 5V | 5V |
然后需要用到这个库文件:https://github.com/adafruit/Adafruit_TCS34725 。如何安装和使用Arduino IDE 中的库文件?可以查看这篇文章:Arduino 制造光污染 | 全彩灯带 WS2812 中“找一个合适的库”这一节。
参考示例代码
安装完毕之后,可以试着使用以下的程序(参考并修改自:Makerblog.at)试试看这个传感器的实际效果,注意这个传感器理论上可以识别 255*255*255 种颜色,但是实际上我们为了考虑到便利性无法为它定义出那么多种颜色。只要是红色占主导,那结果就是红色,比如,红色和深红都认为是红色。下方的代码中只识别了几种常见的颜色:
#include "Arduino.h"
#include "Wire.h"
#include "Adafruit_TCS34725.h"
// 初始化颜色传感器对象
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);
void setup()
{
Serial.begin(9600);
//颜色传感器
if (tcs.begin()) {
Serial.println("找到传感器");
} else {
Serial.println("未找到 TCS34725...进程停止!");
while (1); // 停止!
}
}
void loop()
{
printColor();
}
void printColor() {
// 传感器返回 R、G、B 值和 clear 值
uint16_t clearcol, red, green, blue;
float average, r, g, b;
delay(100); // 颜色测量需要100ms
tcs.getRawData(&red, &green, &blue, &clearcol);
// 求RGB的平均值
average = (red + green + blue) / 3;
// 平均颜色值
// 所有值现在都在 1 左右
r = red / average;
g = green / average;
b = blue / average;
// 尝试使用 r、g、b 值确定颜色。
String rgbValue = "r " + String(r) + " g " + String(g) + " b " + String(b);
Serial.print(rgbValue);
if ((r > 1.6 && r < 1.9) && (g < 0.75) && (b > 0.6 && b < 0.9)) {
Serial.print("\t红");
}
else if ((r < 0.95) && (g > 1.4) && (b < 0.9)) {
Serial.print("\t绿");
}
else if ((r < 0.8) && (g < 1.2) && (b > 1.2)) {
Serial.print("\t蓝");
}
else if ((r > 1 && r < 1.15) && (g > 1.2 && g < 1.35) && (b > 0.55 && b < 0.75)) {
Serial.print("\t黄");
}
else if ((r > 1.4 && r < 1.8) && (g < 0.9 && g > 0.7) && (b < 0.6 && b > 0.45)) {
Serial.print("\t橙");
}
else if ((r > 0.8 && r < 0.9) && (g > 0.9 && g < 1.0) && (b > 1.2 && b < 1.3)) {
Serial.print("\t紫");
}
else {
Serial.print("\t不是匹配的颜色");
}
delay(10);
}
发表回复