感受颜色的变化 | 用 Arduino 和颜色传感器 TCS3472 识别颜色

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

看到一个这样的视频:大致就是使用 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);
}

评论

  1. Claire
    Windows Chrome 92.0.4515.131
    1 年前
    2023-1-15 15:47:01

    请问为什么arduino串口监视器会显示“未找到TCS34725″呢?

    • 博主
      Claire
      Windows Chrome 108.0.0.0
      1 年前
      2023-1-15 16:16:15

      有时候可能是模块的问题,我试过估摸着10个里面可能有1个会有问题。最简单的方法就是换一个试一下,如果另一个工作ok,那就是模块本身的问题了。

      • ly
        xlynx
        Windows Chrome 113.0.0.0
        11 月前
        2023-5-18 13:33:58

        我第一次也是以为模块有问题,用的是arduino的库和网上找的库都不行,就在另一家店又买了一块,结果还是不行,后来问第二个店拿了个库,2个都能正常工作。所以不行的话直接问商家拿库

        • 博主
          ly
          Android Chrome 113.0.0.0
          11 月前
          2023-5-26 10:12:23

          不过我因为量大,所以出现个别不好使的也能接受🤣

    • no3
      Claire
      Windows Firefox 109.0
      1 年前
      2023-2-08 21:49:01

      我和你的情况一样, 后来又买 了一个, 问题还是依旧,你现在解决了吗?

      • 博主
        no3
        iPhone Safari 16.2
        已编辑
        1 年前
        2023-2-08 22:33:14

        首先考虑的是连接是否牢固;第二个要考虑的点是程序执行的时候是不是哪里出问题了,导致模块没有被识别到,可以在关键位置 print 一下看看有没有问题;最后考虑是不是模块本身的问题,我应该是一次性买过一两百个,有问题的也能有好几个(具体忘了,但是感觉不少)。

  2. No3
    iPhone AppleWebKit 605.1.15
    1 年前
    2023-2-09 10:17:39

    首先感谢你这么快评论,真的让我受宠若惊,不过按照你说的,我不可能买几百个测试,你可以卖一个已经测试通过的给我吗?还有就是我的开发板不是进口的

    • 博主
      No3
      Windows Chrome 109.0.0.0
      1 年前
      2023-2-09 12:07:02

      当然可以啊,但是确实有一些模块无法被识别到。如果你真的需要的话,我们可以走闲鱼,我这边包邮给你,反正是闲置🤣 我刚才试了两种,一种是长条形的、一种是正方形的,测试使用的开发板是之前自己做的基于ESP32-C3的开发板:从初学到下单订PCB | 基于立创EDA如此顺畅(第二篇)整出一块带有充放电的 ESP32 开发板;其他 Arduino 的开发板都差不多,找对 SDA 和 SCL 接口在哪里即可。

  3. No3
    iPhone AppleWebKit 605.1.15
    1 年前
    2023-2-09 10:21:00

    是第一句就错了,未找到 TCS34725,后面就没发调试了,连接是否牢固,卖家都有那种排针,连接也不是很难吧

    • 博主
      No3
      Windows Chrome 109.0.0.0
      1 年前
      2023-2-09 12:03:08

      不是,排针焊到板子上是没什么问题🤣,但是有时候杜邦线的连接不是那么牢靠,所以要检查一下;Adafruit_TCS34725 示例确实是这么写的:

      if (tcs.begin()) {
      Serial.println("Found sensor");
      } else {
      Serial.println("No TCS34725 found ... check your connections");
      while (1);
      }

  4. No3
    iPhone AppleWebKit 605.1.15
    1 年前
    2023-2-09 12:05:11

    通过你的提点,确实是杜邦线不稳定,我弄湾扣死,可以识别到颜色了,但是颜色怎么那么不准呢?怎么让颜色the 值准确一些

    • 博主
      No3
      Windows Chrome 109.0.0.0
      1 年前
      2023-2-09 14:40:12

      我用的办法是一个个试,比方说对着一个红色的平面,记录下其大致的rgb数值范围。当然这和环境光也有很大的关系,如果室内测出来很准,放到室外就可能不准了(上方示例代码中,颜色大致是正确的,不过可能需要微调)。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇