用颜色传感器感受颜色的变化

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

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

两种规格的颜色传感器 TCS3472 图片来自于淘宝
两种规格的颜色传感器 TCS3472 图片来自于淘宝

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

使用场景

颜色传感器 TCS3472 识别颜色 方形版本实物
颜色传感器 TCS3472 识别颜色,其方形版本的实物
把颜色传感器安装在小车上,用Arduino进行控制,识别到不同颜色的时候做出不同的指令。
把颜色传感器安装在小车上,使用 Arduino 进行控制,识别到不同颜色的时候做出不同的指令

接线参考

和 Arduino之间的接线方式如下表所示(只罗列了 Arduino Nano、Arduino UNO、D1 mini,其他模块的接线方式类似),实际上只要连接四根线即可运行:

TCS3472 颜色传感器Arduino UNOArduino NanoD1 mini
SDAA4 (SDA)A4 (SDA)D2 (SDA)
SCLA5 (SCL)A5 (SCL)D1 (SCL)
GNDGNDGNDGND
VIN5V5V5V

然后需要用到这个库文件: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);
}

类似文章

发表评论

您的电子邮箱地址不会被公开。