顾名思义,颜色分类就是简单地根据事物的颜色对事物进行分类。它可以通过看到它来轻松完成,但是当要分类的东西太多并且这是一项重复性任务时,自动色选机非常有用。这些机器有颜色传感器来感知任何物体的颜色,并在检测到颜色伺服电机后抓住物体并将其放入相应的盒子中。它们可用于颜色识别、颜色区分和颜色分类很重要的不同应用领域。一些应用领域包括农业(基于颜色的谷物分选)、食品工业、钻石和采矿业、回收等。应用不仅限于此,还可以进一步应用于不同的行业。
在本教程中,我们将使用颜色传感器 TCS3200、一些伺服电机和 Arduino 板制作颜色分选机。本教程将包括彩球的分类并将它们保存在相关的彩盒中。盒子将处于固定位置,伺服电机将用于移动分拣手以将球保持在相关盒子中。
所需组件
Arduino UNO
TCS3200 颜色传感器
伺服电机
跳线
面包板
色选机械臂底盘的制作方法
为了制作包括底盘、臂、滚轮、垫子在内的完整设置,我们使用了 2 毫米厚的白色Sunboard。它在固定商店很容易买到。我们使用切纸机切割 Sunboard Sheet 和 FlexKwik 或 FeviKwik 来连接不同的部分。以下是构建颜色分类臂
的一些步骤:
1)拿取防晒板。
2) 如图所示,用刻度尺和记号笔测量好所有边后,将阳光板切成小块。
3)现在将两块阳光板放在一起,然后在上面倒一滴 FeviKwik 将它们粘在一起。按照图继续连接。
4) 将所有部件连接在一起后,这台色选机将如下所示:
TCS3200 颜色传感器
TCS3200 是一种颜色传感器,可以通过正确的编程检测任意数量的颜色。TCS3200 包含 RGB(红绿蓝)阵列。如图所示,在显微镜下可以看到传感器眼睛内部的方框。这些方块是 RGB 矩阵的数组。这些盒子中的每一个都包含三个传感器,一个用于感测红光强度,一个用于感测绿光强度,最后一个用于感测蓝光强度。
这三个阵列中的每个传感器阵列都是根据需要单独选择的。因此它被称为可编程传感器。该模块可以用来感知特定颜色并离开其他颜色。它包含用于该选择目的的过滤器。第四种模式称为“无滤镜模式”,其中传感器检测白光。
Arduino色选机电路图
这个Arduino 颜色分类器的电路图很容易制作,不需要太多连接。示意图如下。
这是色选机设置背后的电路:
对 Arduino Uno 进行编程以对彩色球进行分类
对 Arduino UNO 进行编程非常简单,需要一个简单的逻辑来简化颜色分类所涉及的步骤。最后给出了带有演示视频的完整程序。
由于使用的是伺服电机,所以伺服库是程序的重要组成部分。这里我们使用两个伺服电机。第一个伺服将彩球从初始位置移动到 TCS3200 检测器位置,然后移动到将落下的分拣位置。移动到分拣位置后,第二个伺服将使用其手臂将球落到所需的颜色桶中。请参阅最后给出的视频中的完整工作。
第一步将包含所有库并定义伺服变量。
#include伺服拾取伺服; 伺服下降伺服;
TCS3200 颜色传感器可以在没有库的情况下工作,因为只需要从传感器引脚读取频率来决定颜色。所以只需定义 TCS3200 的引脚号。
#define S0 4 #define S1 5 #define S2 7 #define S3 6 #define sensorOut 8 int 频率 = 0; 诠释颜色=0;
使选择引脚作为输出,因为这将使彩色光电二极管高或低,并将TCS3200 的 Out 引脚作为输入。OUT 引脚将提供频率。最初选择频率缩放为 20%。
pinMode(S0,输出); pinMode(S1,输出); pinMode(S2,输出); pinMode(S3,输出); pinMode(传感器输出,输入); 数字写入(S0,低); 数字写入(S1,高);
伺服电机连接在 Arduino 的引脚 9 和 10。将拾取彩球的拾取伺服器连接在引脚 9 上,将根据颜色掉落彩球的下落伺服器连接在引脚 10 上。
pickServo.attach(9); dropServo.attach(10);
最初,拾取伺服电机设置在初始位置,在这种情况下为 115 度。它可能会有所不同,并且可以相应地进行定制。电机在延迟一段时间后移动到检测器区域并等待检测。
pickServo.write(115); 延迟(600); for(int i = 115; i > 65; i--) { pickServo.write(i); 延迟(2); } 延迟(500);
TCS 3200从Out Pin 读取颜色并给出频率。
颜色 = 检测颜色(); 延迟(1000);
根据检测到的颜色,下落伺服电机以特定角度移动,并将彩球落入相应的盒子中。
开关(颜色){ 案例1: dropServo.write(50); 休息; 案例2: dropServo.write(80); 休息; 案例3: dropServo.write(110); 休息; 案例4: dropServo.write(140); 休息; 案例5: dropServo.write(170); 休息; 案例0: 中断; } 延迟(500);
伺服电机返回初始位置,等待下一个球被拾取。
for(int i = 65; i > 29; i--) { pickServo.write(i); 延迟(2); } 延迟(300); for(int i = 29; i < 115; i++) { pickServo.write(i); 延迟(2); }
函数detectColor()用于测量频率并比较颜色频率以得出颜色结论。结果打印在串行监视器上。然后它返回用于移动下降伺服电机角度的案例的颜色值。
诠释检测颜色(){
写入 S2 和 S3 (LOW,LOW) 会激活红色光电二极管以获取红色密度读数。
数字写入(S2,低); 数字写入(S3,低); 频率 = 脉冲输入(传感器输出,低); int R = 频率; Serial.print("红色 = "); Serial.print(frequency);//打印红色频率 Serial.print(" "); 延迟(50);
写入 S2 和 S3(低、高)会激活蓝色光电二极管以获取蓝色密度读数。
数字写入(S2,低); 数字写入(S3,高); 频率 = 脉冲输入(传感器输出,低); int B = 频率; Serial.print("蓝色 = "); Serial.print(频率); 序列号.println(" ");
写入 S2 和 S3 (HIGH,HIGH) 会激活绿色光电二极管以获取绿色密度读数。
数字写入(S2,高); 数字写入(S3,高); // 读取输出频率 频率 = pulseIn(sensorOut, LOW); int G = 频率; Serial.print("绿色 = "); Serial.print(频率); 序列号.print(""); 延迟(50);
然后比较这些值以做出颜色决定。不同实验设置的读数不同,因为在进行设置时每个人的检测距离都不同。
如果(R<22 & R>20 & G<29 & G>27){ 颜色 = 1; // Red Serial.print("检测到的颜色是 = "); Serial.println("RED"); } if(G<25 & G>22 & B<22 &B>19){ 颜色 = 2; // 橙色 Serial.println("橙色"); } if(R<21 & R>20 & G<28 & G>25){ 颜色 = 3; // 绿色 Serial.print("检测到的颜色是 = "); Serial.println("绿色"); } if(R<38 & R>24 & G<44 & G>30){ 颜色 = 4; // 黄色 Serial.print("检测到的颜色是 = "); Serial.println("黄色"); } if (G<29 & G>27 & B<22 &B>19){ 颜色 = 5; // 蓝色 Serial.print("检测到的颜色是 = "); Serial.println("蓝色"); } 返回颜色; }
这样就完成了使用 TCS3200 和 Arduino UNO 的色选机。如果需要,您还可以对其进行编程以检测更多颜色。
#include
伺服拾取伺服;
伺服下降伺服;
#define S0 4
#define S1 5
#define S2 7
#define S3 6
#define sensorOut 8
int 频率 = 0;
诠释颜色=0;
int detectColor() {
// 激活红色光电二极管以读取
digitalWrite(S2, LOW);
数字写入(S3,低);
频率 = 脉冲输入(传感器输出,低);
int R = 频率;
Serial.print("红色 = ");
Serial.print(frequency);//打印红色频率
Serial.print(" ");
延迟(50);
// 激活蓝色光电二极管以读取
digitalWrite(S2, LOW);
数字写入(S3,高);
频率 = 脉冲输入(传感器输出,低);
int B = 频率;
Serial.print("蓝色 = ");
Serial.print(频率);
序列号.println(" ");
// 激活绿色光电二极管以读取
digitalWrite(S2, HIGH);
数字写入(S3,高);
// 读取输出频率
频率 = pulseIn(sensorOut, LOW);
int G = 频率;
Serial.print("绿色 = ");
Serial.print(频率);
序列号.print("");
延迟(50);
延迟(50);
//不同设置
的读数不同 //根据您的项目和检测到的读数更改读数
if(R<22 & R>20 & G<29 & G>27){
color = 1; // Red
Serial.print("检测到的颜色是 = ");
Serial.println("RED");
}
if(G<25 & G>22 & B<22 &B>19){
颜色 = 2; // 橙色
Serial.println("橙色");
}
if(R<21 & R>20 & G<28 & G>25){
颜色 = 3; // 绿色
Serial.print("检测到的颜色是 = ");
Serial.println("绿色");
}
if(R<38 & R>24 & G<44 & G>
30){颜色 = 4; // 黄色
Serial.print("检测到的颜色是 = ");
Serial.println("黄色");
}
if (G<29 & G>27 & B<22 &B>19){
颜色 = 5; // 蓝色
Serial.print("检测到的颜色是 = ");
Serial.println("蓝色");
}
返回颜色;
}
无效设置(){
pinMode(S0,输出);
pinMode(S1,输出);
pinMode(S2,输出);
pinMode(S3,输出);
pinMode(传感器输出,输入);
//频率缩放到 20% 选定
的 digitalWrite(S0, LOW);
数字写入(S1,高);
pickServo.attach(9);
dropServo.attach(10);
序列号.开始(9600);
}
void loop() {
//伺服电机的初始位置
pickServo.write(115);
延迟(600);
for(int i = 115; i > 65; i--) {
pickServo.write(i);
延迟(2);
}
延迟(500);
//通过调用函数读取颜色值。将结论值保存在变量
color = detectColor();
延迟(1000);
开关(颜色){
案例1:
dropServo.write(50);
休息;
案例2:
dropServo.write(80);
休息;
案例3:
dropServo.write(110);
休息;
案例4:
dropServo.write(140);
休息;
案例5:
dropServo.write(170);
休息;
案例0:
中断;
}
延迟(500);
for(int i = 65; i > 29; i--) {
pickServo.write(i);
延迟(2);
}
延迟(300);
for(int i = 29; i < 115; i++) {
pickServo.write(i);
延迟(2);
}
颜色=0;
}
全部0条评论
快来发表一下你的评论吧 !