用颜色传感器感受颜色的变化
看到一个这样的视频:大致就是使用 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);
}
请问为什么arduino串口监视器会显示“未找到TCS34725″呢?
有时候可能是模块的问题,我试过估摸着10个里面可能有1个会有问题。最简单的方法就是换一个试一下,如果另一个工作ok,那就是模块本身的问题了。
我第一次也是以为模块有问题,用的是arduino的库和网上找的库都不行,就在另一家店又买了一块,结果还是不行,后来问第二个店拿了个库,2个都能正常工作。所以不行的话直接问商家拿库
不过我因为量大,所以出现个别不好使的也能接受🤣
我和你的情况一样, 后来又买 了一个, 问题还是依旧,你现在解决了吗?
首先考虑的是连接是否牢固;第二个要考虑的点是程序执行的时候是不是哪里出问题了,导致模块没有被识别到,可以在关键位置 print 一下看看有没有问题;最后考虑是不是模块本身的问题,我应该是一次性买过一两百个,有问题的也能有好几个(具体忘了,但是感觉不少)。
首先感谢你这么快评论,真的让我受宠若惊,不过按照你说的,我不可能买几百个测试,你可以卖一个已经测试通过的给我吗?还有就是我的开发板不是进口的
当然可以啊,但是确实有一些模块无法被识别到。如果你真的需要的话,我们可以走闲鱼,我这边包邮给你,反正是闲置🤣 我刚才试了两种,一种是长条形的、一种是正方形的,测试使用的开发板是之前自己做的基于ESP32-C3的开发板:从初学到下单订PCB | 基于立创EDA如此顺畅(第二篇)整出一块带有充放电的 ESP32 开发板;其他 Arduino 的开发板都差不多,找对 SDA 和 SCL 接口在哪里即可。
是第一句就错了,未找到 TCS34725,后面就没发调试了,连接是否牢固,卖家都有那种排针,连接也不是很难吧
不是,排针焊到板子上是没什么问题🤣,但是有时候杜邦线的连接不是那么牢靠,所以要检查一下;Adafruit_TCS34725 示例确实是这么写的:
if (tcs.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No TCS34725 found ... check your connections");
while (1);
}
通过你的提点,确实是杜邦线不稳定,我弄湾扣死,可以识别到颜色了,但是颜色怎么那么不准呢?怎么让颜色the 值准确一些
我用的办法是一个个试,比方说对着一个红色的平面,记录下其大致的rgb数值范围。当然这和环境光也有很大的关系,如果室内测出来很准,放到室外就可能不准了(上方示例代码中,颜色大致是正确的,不过可能需要微调)。
返回的RGB的值都为0是什么原因呢~
您好,从串口监视器,我得到的RGB值都是0是怎么回事呢?谢谢