Arduino Nano 与 TCS3200 传感器实现物体颜色检测
组件与物料清单
| 组件 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| TCS3200 颜色识别传感器模块 | 1 |
| 1602 I2C 蓝色背光 LCD 显示模块 | 1 |
| 面包板 | 1 |
| 杜邦线若干 | 1 |
所需软件与在线服务
- Arduino IDE
项目简介
本教程将演示如何使用 Arduino Nano 和 TCS3200 传感器读取物体颜色,并将检测结果显示在 LCD 上。该项目是更大型机械臂项目的一个组成部分,机械臂将根据物体颜色执行相应动作。下图展示了主要组件框架图。

以下视频展示了最终项目的运行效果:
步骤 1:物料清单 (BoM)
以下链接和价格仅供参考:
- Arduino Nano (约 $8.00)
- TCS3200 颜色传感器模块 (约 $9.00)
- I2C 1602 串口蓝色背光 LCD 模块 (约 $8.00)
- 面包板 (约 $2.00)
- 连接线若干
步骤 2:了解 TCS3200 颜色传感器

根据数据手册,TCS3200 是一种可编程的彩色光频转换器,它将可配置的硅光二极管和电流-频率转换器集成在单片 CMOS 集成电路中。
输出为方波(50% 占空比),频率与光强度(辐照度)成正比。通过两个控制输入引脚(S0 和 S1),全量程输出频率可按三个预设值之一进行缩放。数字输入和数字输出允许直接与微控制器或其他逻辑电路连接。

输出使能 (OE) 将输出置于高阻抗状态,以便多个单元共享微控制器输入线。TCS3200 通过 8×8 光二极管阵列读取光信号:
- 16 个光二极片带蓝色滤镜
- 16 个光二极片带绿色滤镜
- 16 个光二极片带红色滤镜
- 16 个光二极片无滤镜(透明)
引脚 S2 和 S3 用于选择激活哪组光二极管(红、绿、蓝、透明)。每个光二极管尺寸为 110μm × 110μm,中心间距 134μm。
OE(使能)引脚应接地(低电平)。传感器封装后工作电压为 2.7V–5.5V DC,本项目使用 Arduino 5V 供电。为防止侧向光干扰,建议安装一个小橡胶圈隔离传感器,可用热熔胶固定。

步骤 3:硬件连接

TCS3200 传感器连接:
- S0 → Nano D4
- S1 → Nano D5
- S2 → Nano D6
- S3 → Nano D7
- OUT → Nano D8
- EN → GND
- VCC → +5V
- GND → GND
I2C LCD 1602 串口显示屏连接:
- SDA → Nano A4
- SCL → Nano A5
将 Arduino Nano 安装在面包板上,将 Nano 的 5V 和 GND 分别接到面包板两侧电源轨。
步骤 4:Arduino 代码详解

首先设置频率缩放,由 S0 和 S1 控制。缩放输出频率可优化传感器读数以适配不同的频率计数器或微控制器。本项目将 S0 和 S1 均设为 HIGH(100%):
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
接下来通过 S2 和 S3 选择要读取的颜色通道(红、绿、蓝)。由于光二极管并联连接,通过 S2、S3 的不同高低电平组合可选择不同光二极管组:
// 读取红色分量
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = pulseIn(outPin, LOW);
// 读取绿色分量
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
grn = pulseIn(outPin, LOW);
// 读取蓝色分量
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
blu = pulseIn(outPin, LOW);
实际代码中会多次读取每个 RGB 分量并取平均值,以减少单次读数异常带来的误差。
获得 RGB 三分量后,需通过预先校准来判断颜色。可使用已知颜色的测试纸或物体读取三分量数值。以下是参考校准代码(需根据环境光调整参数):
void getColor() {
readRGB();
if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16)
color = "WHITE";
else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125)
color = "BLACK";
else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70)
color = "RED";
else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85)
color = "GREEN";
else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38)
color = "YELLOW";
else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65)
color = "BLUE";
else
color = "NO_COLOR";
}
上述代码预定义了白、黑、红、绿、黄、蓝 6 种颜色。环境光变暗时,参数阈值会偏大。
在 loop() 中,每秒更新一次 LCD 显示。完整代码可在 GitHub 获取。
步骤 5:总结

希望本项目能帮助更多爱好者探索电子、机器人和 IoT 的精彩世界!
请访问我的 GitHub 获取更新文件:Color Detector
更多项目请访问我的博客:MJRoBot.org
来自世界南端的问候!
下期教程见!
谢谢,
Marcelo
制造工艺
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
- Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
- 自制 Arduino 电子宠物「Tamaguino」:复刻经典 Tamagotchi 全攻略
- 智能无线开关控制器:Arduino + 433MHz 远程操控墙壁开关
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 基于 Arduino Nano 的智能运动感应水枪
- 使用 SparkFun 7 段数码管构建可靠的 Arduino 倒计时器
- Arduino RGB LED调色器:三电位器混色入门项目
- Arduino 向日葵:制作电子向日葵追踪阳光
- 自制 Arduino 遥控保时捷赛车:从改装底盘到手机 App 控制全攻略
- Arduino智能防碰撞预警系统:超声波测距+声光分级报警