news 2026/2/17 15:44:24

系统学习Arduino Uno R3开发板与颜色识别传感器交互

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
系统学习Arduino Uno R3开发板与颜色识别传感器交互

从零开始玩转颜色识别:用Arduino Uno R3读懂世界的色彩

你有没有想过,让一块小小的开发板“睁开眼睛”,像人一样分辨红绿蓝?
在智能分拣流水线上,机器能自动挑出不同颜色的塑料颗粒;在盲人辅助设备中,系统可以语音播报衣服的颜色;甚至在艺术装置里,观众举起一张彩色卡片就能点亮一片灯光森林——这些看似魔法的操作,背后往往都离不开一个关键角色:颜色识别传感器

而实现这一切的起点,可能只是你手边那块几十元的Arduino Uno R3开发板。今天,我们就来一起动手,搞懂它如何与颜色传感器“对话”,并真正把“看颜色”这件事变成可编程、可控制、可扩展的智能系统。


为什么选Arduino Uno R3?因为它够“接地气”

作为嵌入式开发界的“国民板”,Arduino Uno R3 的魅力在于:
- 主控芯片 ATmega328P 虽然不算强大,但资源足够教学和原型验证;
- 数字/模拟引脚丰富,支持 PWM、I²C、SPI、UART 多种通信方式;
- 社区生态庞大,几乎任何传感器都有现成库或示例代码;
- 开发环境简单直观,连高中生都能快速上手。

更重要的是,它能完美兼容市面上主流的颜色识别模块,无论是老派的 TCS3200,还是更先进的 TCS34725,接上去就能跑。


入门首选:TCS3200 —— 用频率告诉你颜色的秘密

它是怎么“看见”颜色的?

TCS3200 并不是直接输出 RGB 数值的“聪明孩子”。它的原理很“硬核”:把光强转换成频率信号,然后让你自己去算。

这块传感器底下有 16 个光电二极管,分成四组:
- 4 个红色滤光
- 4 个绿色滤光
- 4 个蓝色滤光
- 4 个无滤光(Clear)

当你照射一个物体时,反射光进入传感器,每组滤光片只允许对应波段的光通过。比如红色表面会强烈反射红光,被红色通道感知到的光就更强——而这个“强弱”会被转化为一个方波信号的频率高低

频率越高 → 光越强 → 当前通道响应越大

Arduino 不需要 ADC 读电压,只需要用pulseIn()测量这个方波的周期(单位微秒),就能反推出频率。数值越小,说明周期短、频率高,代表该颜色成分越明显。

引脚怎么接?记住这四个控制脚

引脚功能连接到 Arduino
OUT输出频率信号数字引脚 D2
S0/S1设置输出频率缩放比例D3/D4
S2/S3选择当前采样通道D5/D6

其中:
-S0/S1决定输出频率范围,防止超出单片机测量能力。我们通常设为100% 输出(S0=HIGH, S1=LOW)
-S2/S3控制哪个颜色通道工作:
- LOW + LOW → 红色
- HIGH + HIGH → 绿色
- LOW + HIGH → 蓝色
- HIGH + LOW → Clear(全光谱)

实战代码:一步步读取RGB值

const int OUT = 2; const int S0 = 3, S1 = 4, S2 = 5, S3 = 6; void setup() { pinMode(OUT, INPUT); pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); digitalWrite(S0, HIGH); // 100% 输出比例 digitalWrite(S1, LOW); Serial.begin(9600); } int readFrequency(int s2_val, int s3_val) { digitalWrite(S2, s2_val); digitalWrite(S3, s3_val); delay(10); // 切换通道后稍作稳定 return pulseIn(OUT, LOW, 100000); // 返回脉冲低电平持续时间(μs) } void loop() { int red = readFrequency(LOW, LOW); // 红 int green = readFrequency(HIGH, HIGH); // 绿 int blue = readFrequency(LOW, HIGH); // 蓝 Serial.print("Red: "); Serial.print(red); Serial.print(" | Green: "); Serial.print(green); Serial.print(" | Blue: "); Serial.println(blue); delay(500); }
关键点提醒:
  • pulseIn()返回的是周期(单位 μs),不是频率。所以数值越小,表示频率越高,光越强。
  • 建议多次采样取平均,减少抖动。
  • 必须做白平衡校准!否则同一张白纸在不同光照下读数差异巨大。

💡 小技巧:找一张标准白纸,记录下此时 R/G/B 的原始值,后续所有读数都除以这个基准值进行归一化处理,效果立竿见影。


升级之选:TCS34725 —— 数字时代的高精度色彩猎人

如果你觉得 TCS3200 “太原始”,那该认识一下它的进阶版:TCS34725

同样是测颜色,但它已经进化成了“数字原住民”。

它强在哪?

对比项TCS3200TCS34725
输出方式频率信号(需定时器测量)I²C 数字通信
分辨率受限于主控时钟精度16位ADC,最大65535
抗干扰性易受电源波动影响内置增益调节+去IR滤波
编程难度需手动切换通道库函数一键获取RGB
成本便宜(约10元内)稍贵(约20–30元)

一句话总结:TCS3200 是机械表,TCS34725 是智能手表

它是怎么工作的?

TCS34725 内部集成了完整的信号链:
1. RGBC 四通道光电二极管采集光线
2. 每个通道独立 ADC 转换为数字值
3. 支持可编程增益(1x / 4x / 16x / 60x)
4. 自动积分时间调节,避免过曝
5. 数据通过 I²C 接口传给 Arduino

最厉害的是它还内置了红外抑制算法,能有效过滤掉不可见光对颜色判断的干扰——这是很多廉价传感器做不到的。

接线超简单:只需四根线

传感器引脚Arduino 引脚
VCC5V
GNDGND
SDAA4
SCLA5

⚠️ 注意:虽然大多数模块自带上拉电阻,但如果通信失败,建议外加上拉(4.7kΩ 接 VCC)。

上手即用:Adafruit 库带你起飞

#include <Wire.h> #include <Adafruit_TCS34725.h> // 参数说明: // - 积分时间:曝光时间,越长越灵敏(但别饱和) // - 增益:放大倍数,暗光环境下调高 Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_700MS, TCS34725_GAIN_1X); void setup() { Serial.begin(9600); if (!tcs.begin()) { Serial.println("❌ 找不到TCS34725,请检查接线!"); while (1); // 卡死等待 } Serial.println("✅ 传感器初始化成功"); } void loop() { uint16_t r, g, b, c; tcs.getRGB(&r, &g, &b); // 获取归一化后的RGB值 c = tcs.getRawData().clear; // 总光照强度 Serial.print("R: "); Serial.print(r); Serial.print(" G: "); Serial.print(g); Serial.print(" B: "); Serial.print(b); Serial.print(" C: "); Serial.println(c); // 计算照度(Lux) float lux = tcs.calculateLux(r, g, b); Serial.print("照度: "); Serial.print(lux); Serial.println(" Lux"); delay(800); }
使用建议:
  • 初始调试建议使用INTEGRATIONTIME_2_4MSGAIN_1X,防止强光烧录数据溢出;
  • 在最终部署前务必做一次白平衡校准,可用.setInterrupt()触发自动校正;
  • 若用于长期监测,启用中断模式可降低 CPU 占用率。

构建你的第一个智能识别系统:不只是“读数”

现在你已经能让 Arduino “看到”颜色了,下一步呢?当然是让它“做出反应”。

典型闭环流程

[补光LED] → [物体反射] → [颜色传感器] ↓ [Arduino Uno R3] ↓ [判断是否为红色?] → 是 → [舵机推开] ↓ 否 → 继续传送

这就是一个最简单的工业分拣模型。

如何做颜色分类?

你可以用几种方法:

方法一:阈值法(适合固定场景)
if (red > 50000 && green < 20000 && blue < 20000) { Serial.println("→ 检测到红色"); }
方法二:归一化+欧氏距离(推荐)

将 R/G/B 归一化到 [0,1] 区间,计算与标准颜色向量的距离:

float dist_red = sqrt(pow(r_norm - 1.0, 2) + pow(g_norm - 0.0, 2) + pow(b_norm - 0.0, 2)); float dist_green = sqrt(pow(r_norm - 0.0, 2) + pow(g_norm - 1.0, 2) + pow(b_norm - 0.0, 2));

哪个距离最小,就是哪种颜色。

方法三:查表匹配(适用于多色识别)

提前录入每种目标颜色的标准值,运行时做最近邻搜索。


工程实践中的那些“坑”与破解之道

别以为接上线就能稳定工作——现实世界充满挑战。

🌞 问题1:环境光变化导致误判

现象:白天识别正常,晚上全乱套
解法
- 加恒流驱动的白色LED补光(推荐3000K暖白)
- 使用黑色遮光筒罩住传感器,只留前端开口
- 每次开机执行白板校准

📏 问题2:距离不同造成亮度差异

现象:离得近读数爆表,远一点又太弱
解法
- 固定安装高度(建议1–3cm)
- 使用 Clear 通道做归一化:R' = R / C,G' = G / C,B' = B / C

🔌 问题3:电机启动干扰传感器

现象:舵机一动,串口数据疯狂跳变
解法
- 电源分离:传感器走LDO稳压,电机单独供电
- 地线共地但走线尽量短
- 软件加滤波:滑动平均或中值滤波


这些创意项目,也许下一个就是你做的

掌握了基础之后,想象力才是真正的边界。

✅ 已验证的应用案例

  • 智能药盒提醒器:识别药品包装颜色,语音提示服药
  • 儿童教育玩具:识别彩色积木,播放对应英文单词
  • 植物健康检测仪:分析叶片黄化程度,预警缺铁/缺氮
  • 互动音乐墙:触摸不同颜色面板,触发不同乐器音效

🚀 可拓展方向

  • 加 ESP-01S 模块,把颜色数据上传到微信小程序
  • 结合 TensorFlow Lite for Microcontrollers,实现边缘AI颜色分类
  • 配合 OLED 屏幕,做成便携式色卡识别笔

写在最后:从“会用”到“懂原理”的跨越

TCS3200 教你理解底层机制:光如何变成电信号,再变成频率,最后被 MCU 解码。它是学习传感器原理的绝佳入口。

TCS34725 则展示了现代传感器的发展方向:集成化、数字化、智能化。它让你专注于应用逻辑,而不是底层时序。

无论你选择哪一款,Arduino Uno R3都是你通往智能硬件世界的船票。下次当你看到一台自动分拣机,不妨想想:它的“眼睛”是不是也和你桌上这块板子说着同样的语言?

如果你正在尝试类似的项目,或者遇到了颜色识别不准的问题,欢迎留言交流。我们一起把这个世界看得更清楚一点。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/14 8:55:36

树莓派下安装中文输入法 + 截图和编辑工具

1、安装中文输入法sudo apt install fcitx fcitx-googlepinyin -y在 树莓派菜单 -> Preferences -> Fcitx Configuration 中添加输入法切换输入法快捷键为Ctrl 空格键2、安装截图和编辑工具sudo apt-get install grim slurp ksnip -y安装 gedit 文本编辑器&#xff08;按…

作者头像 李华
网站建设 2026/2/16 21:20:55

微信消息智能转发神器:终极使用指南

微信消息智能转发神器&#xff1a;终极使用指南 【免费下载链接】wechat-forwarding 在微信群之间转发消息 项目地址: https://gitcode.com/gh_mirrors/we/wechat-forwarding 还在为手动转发微信群消息而烦恼吗&#xff1f;&#x1f914; 每天在几十个微信群之间来回切换…

作者头像 李华
网站建设 2026/2/15 20:48:54

六音音源修复完整指南:5步解决洛雪音乐兼容性问题

六音音源修复完整指南&#xff1a;5步解决洛雪音乐兼容性问题 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 还在为洛雪音乐升级后六音音源失效而困扰吗&#xff1f;这份详细的六音音源修复指南…

作者头像 李华
网站建设 2026/2/16 23:38:14

六音音源故障终极解决方案:快速配置与问题排查指南

六音音源故障终极解决方案&#xff1a;快速配置与问题排查指南 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 面对洛雪音乐1.6.0版本后六音音源失效的技术难题&#xff0c;本文提供一套完整的故…

作者头像 李华
网站建设 2026/2/16 2:01:39

终极NCM解密指南:三步释放你的音乐收藏

终极NCM解密指南&#xff1a;三步释放你的音乐收藏 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 还在为网易云音乐的NCM格式限制而烦恼吗&#xff1f;这款强大的音频格式转换工具让你轻松突破壁垒&am…

作者头像 李华