Arduino 颜色分拣机制作指南:基于 TCS3200 传感器与舵机
项目概述
本教程将指导你制作一个 Arduino 颜色分拣机。该项目仅需一个 TCS3200 颜色传感器和两个微型舵机,结构简单却趣味十足。你可以观看视频教程,或阅读下文的图文详解。
设计原理
使用 SolidWorks 3D 建模软件设计了分拣机的机械结构,其工作流程如下:
- 料仓中的彩色糖果落在上层舵机搭载的平台上;
- 上层舵机旋转,将糖果送至颜色传感器检测位置;
- 传感器识别颜色后,下层舵机转动至对应出料口角度;
- 上层舵机再次旋转,糖果滑入导轨落入对应收集盒。

3D 模型与图纸下载
完整的装配体 3D 模型可在 Thangs 在线查看并下载。激光切割所需的零件图纸(含所有尺寸)亦可从此处获取。

机械组装
本项目采用 3mm 厚纤维板。按图纸绘制轮廓,用手锯裁切所有零件。

先用热熔胶组装外框,再用万能胶固定两个舵机于各自平台,并安装导轨、支撑件及上层平台。


随后安装电源开关、DC 电源插座(供 Arduino 5V 供电)及颜色传感器模块。

电路原理图

所需元件清单
- TCS3200 颜色传感器模块
- Arduino Nano 开发板
- 面包板与杜邦线若干
- 微型舵机 ×2(如 SG90 或 MG90S)
- 拨动开关
- DC 电源插座
Arduino 源代码
上传代码前请确认舵机角度参数需根据实物微调。完整代码如下:
/* Arduino 颜色分拣机
* 作者:Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <Servo.h>
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6
Servo topServo;
Servo bottomServo;
int frequency = 0;
int color = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// 设置频率分频为 20%
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
topServo.attach(7);
bottomServo.attach(8);
Serial.begin(9600);
}
void loop() {
// 移至料仓位置
topServo.write(115);
delay(500);
// 缓慢送至传感器
for (int i = 115; i > 65; i--) {
topServo.write(i);
delay(2);
}
delay(500);
color = readColor();
delay(10);
// 根据颜色转动下层舵机
switch (color) {
case 1: bottomServo.write(50); break; // 红
case 2: bottomServo.write(75); break; // 橙
case 3: bottomServo.write(100); break; // 绿
case 4: bottomServo.write(125); break; // 黄
case 5: bottomServo.write(150); break; // 棕
case 6: bottomServo.write(175); break; // 蓝
case 0: break;
}
delay(300);
// 翻转落料
for (int i = 65; i > 29; i--) {
topServo.write(i);
delay(2);
}
delay(200);
// 复位
for (int i = 29; i < 115; i++) {
topServo.write(i);
delay(2);
}
color = 0;
}
// 读取颜色自定义函数
int readColor() {
// 读取红色通道
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
frequency = pulseIn(sensorOut, LOW);
int R = frequency;
Serial.print("R= "); Serial.print(frequency); Serial.print(" ");
delay(50);
// 读取绿色通道
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
int G = frequency;
Serial.print("G= "); Serial.print(frequency); Serial.print(" ");
delay(50);
// 读取蓝色通道
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
int B = frequency;
Serial.print("B= "); Serial.print(frequency); Serial.println(" ");
delay(50);
// 阈值判断(需根据实测校准)
if (R < 45 && R > 32 && G < 65 && G > 55) color = 1; // 红
if (G < 55 && G > 43 && B < 47 && B > 35) color = 2; // 橙
if (R < 53 && R > 40 && G < 53 && G > 40) color = 3; // 绿
if (R < 38 && R > 24 && G < 44 && G > 30) color = 4; // 黄
if (R < 56 && R > 46 && G < 65 && G > 55) color = 5; // 棕
if (G < 58 && G > 45 && B < 40 && B > 26) color = 6; // 蓝
return color;
}
代码关键点解析
- 频率分频:S0/S1 设为 HIGH/LOW,输出频率为满量程 20%,适合 Arduino 读取。
- 舵机角度:代码中的 115、65、29 等角度需根据你的机械结构实测调整。
- 颜色阈值:`readColor()` 中的 `if` 判断范围基于实测 RGB 频率值,建议先通过串口监视器记录各颜色糖果的实际读数,再修改阈值。
- 抗抖动:每次读取通道间加入 50ms 延时,确保传感器稳定。

完善细节
代码上传无误后,用热熔胶固定 Arduino Nano。利用透明塑料瓶制作料仓,盖上顶盖即完成整机组装。


项目完成!如有疑问欢迎在评论区留言交流。
制造工艺
- 用 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 合成乐音:从零实现 88 键钢琴全音域