风筝
发表于: 2019-6-5 11:51:15 | 显示全部楼层

顾名思义,颜色分类只是根据颜色对事物进行排序。它可以通过查看来轻松完成,但是当有太多东西需要分类并且是重复性任务时,自动颜色分选机非常有用。这些机器使用颜色传感器来感应任何物体的颜色,并在检测到颜色伺服电机后抓住物体并将其放入相应的盒子中。它们可用于不同的应用领域,其中颜色识别、颜色区分和颜色分类很重要。一些应用领域包括农业(基于颜色的谷物分选)、食品工业、钻石和采矿业,回收利用等。应用不限于此,并且可以进一步应用于不同的行业。


最常用的检测颜色的传感器是TCS3200颜色传感器。我们以前使用过Arduino和TCS3200传感器来获取任何颜色的RGB分量(红色、绿色、蓝色)。


在本篇文章中,我们将使用颜色传感器TCS3200、伺服电机和Arduino开发板制作颜色分选机。本文将包括彩球的分类并将它们保存在相关的颜色框中。盒子将处于固定位置,伺服电机将用于移动分拣机的手以将球放到相关的盒子中。


需要的组件

●    Arduino UNO开发板

●    TCS3200色彩传感器

●    伺服电机

●    跳线

●    面包板


如何制作颜色分选机手臂的底盘

为了完成包括底盘、手臂、滚轮、垫的完整设置,我们使用了2mm厚的白色阳光板。它在商店很容易买到。我们使用切纸机切割阳光板。

以下是制作颜色分选机手臂的一些步骤:

1)准备一些阳光板。

Sunboard-Sheet-for-Designing-Arduino-based-Color-Sorter-Machine.jpg

2)用标尺和标记测量所有侧面后,将太阳板片切成块,如图所示。

Designing-Arduino-based-Color-Sorter-Machine.jpg

Ramp-for-Arduino-based-Color-Sorter-Machine.jpg

Pieces-for-Arduino-based-Color-Sorter-Machine.jpg

3)现在将两块阳光板固定在一起,在其上倒上胶水,将碎片粘在一起。按照图示继续加入各个部分。

Joining-Pieces-for-Arduino-based-Color-Sorter-Machine.png

4)将所有部件拼接在一起后,这台颜色分选机将如下所示:

Setup-for-Arduino-based-Color-Sorter-Machine.jpg


TCS3200彩色传感器

TCS3200-Color-Sensor.jpg

TCS3200是一种颜色传感器,可以通过正确的编程检测任意数量的颜色。 TCS3200包含RGB(红绿蓝)阵列。如图所示,在微观层面上可以看到传感器眼睛内的方框。这些方框是RGB矩阵的阵列。每个盒子都包含三个传感器,一个用于感应红光强度,一个用于感应绿光强度,另一个用于感应蓝光强度。

TCS230-Pinout.gif

根据需要分别选择这三个阵列中的每个传感器阵列。因此它被称为可编程传感器。该模块可以用于感知特定颜色。它包含用于该选择目的的过滤器。存在称为“无滤波器模式”的第四模式,其中传感器检测白光。


电路原理图

这款Arduino颜色分选机的电路图很容易制作,不需要太多连接。原理图如下。

Circuit-Diagram-for-DIY-Arduino-based-Color-Sorter-Machine-using-TCS3200-Color-Sensor .png


以下是颜色分选机设置背后的电路:

Back-View-for-Arduino-based-Color-Sorter-Machine.jpg


编程Arduino Uno

编写Arduino UNO非常简单,需要一个简单的逻辑来简化颜色排序所涉及的步骤。


由于使用了伺服电机,因此伺服库是程序的重要组成部分。这里我们使用两个伺服电机。第一个伺服器将彩色球从初始位置移动到TCS3200探测器位置,然后移动到球将被丢弃的分拣位置。在移动到分拣位置后,第二个伺服器将使用其臂将球落到所需的颜色桶中。


第一步是包含所有库并定义伺服变量。

  1. #include <Servo.h>
  2. Servo pickServo;
  3. Servo dropServo;
复制代码

TCS3200颜色传感器可以在没有库的情况下工作,因为只需要从传感器引脚读取频率来决定颜色。因此,只需定义TCS3200的引脚编号即可。

  1. #define S0 4
  2. #define S1 5
  3. #define S2 7
  4. #define S3 6
  5. #define sensorOut 8
  6. int frequency = 0;
  7. int color=0;
复制代码

将选择的引脚作为输出,这将使彩色光电二极管变高或变低,并将TCS3200的输出引脚作为输入。 OUT引脚将提供频率。最初选择频率比例为20%。

  1.   pinMode(S0, OUTPUT);
  2.   pinMode(S1, OUTPUT);
  3.   pinMode(S2, OUTPUT);
  4.   pinMode(S3, OUTPUT);
  5.   pinMode(sensorOut, INPUT);
  6.   digitalWrite(S0, LOW);
  7.   digitalWrite(S1, HIGH);
复制代码

伺服电机连接在Arduino的9号和10号引脚上。将拾取彩球的拾取伺服连接在引脚9上,并且在Pin10处连接将根据颜色丢弃彩球的下降伺服。

  1. pickServo.attach(9);
  2. dropServo.attach(10);
复制代码

刚开始,拾取伺服电机设置在初始位置,本例为115度。它可能不同,可以相应地进行定制。电机在一段延迟后移动到检测器区域并等待检测。

  1.   pickServo.write(115);
  2.   delay(600);
  3.   for(int i = 115; i > 65; i--) {
  4.     pickServo.write(i);
  5.     delay(2);
  6.   }
  7.   delay(500);
复制代码

TCS 3200读取颜色并从输出引脚中提供频率。

  1.   color = detectColor();
  2.   delay(1000);
复制代码

根据检测到的颜色,下降伺服电机以特定角度移动并将彩色球落到各自的盒子上。

  1.   switch (color) {
  2.     case 1:
  3.     dropServo.write(50);
  4.     break;
  5.     case 2:
  6.     dropServo.write(80);
  7.     break;
  8.     case 3:
  9.     dropServo.write(110);
  10.     break;
  11.     case 4:
  12.     dropServo.write(140);
  13.     break;
  14.     case 5:
  15.     dropServo.write(170);
  16.     break;
  17.     case 0:
  18.     break;
  19.   }
  20.   delay(500);
复制代码

伺服电机返回初始位置,以便下一个接球。

  1.   for(int i = 65; i > 29; i--) {
  2.     pickServo.write(i);
  3.     delay(2);
  4.   }
  5.   delay(300);
  6.   for(int i = 29; i < 115; i++) {
  7.     pickServo.write(i);
  8.     delay(2);
  9.   }
复制代码

函数detectColor()用于测量频率并比较颜色频率以得出颜色的结论。结果将打印在串行监视器上。然后它返回用于移动下降伺服电机角度的情况的颜色值。

  1. int detectColor() {
复制代码

向S2和S3写入(LOW,LOW)激活红色光电二极管以获取红色密度的读数。

  1.   digitalWrite(S2, LOW);
  2.   digitalWrite(S3, LOW);
  3.   frequency = pulseIn(sensorOut, LOW);
  4.   int R = frequency;
  5.   Serial.print("Red = ");
  6.   Serial.print(frequency);//printing RED color frequency
  7.   Serial.print("   ");
  8.   delay(50);
复制代码

向S2和S3写入(LOW,HIGH)激活蓝色光电二极管以获取蓝色密度的读数。

  1.   digitalWrite(S2, LOW);
  2.   digitalWrite(S3, HIGH);
  3.   frequency = pulseIn(sensorOut, LOW);
  4.   int B = frequency;
  5.   Serial.print("Blue = ");
  6.   Serial.print(frequency);
  7.   Serial.println("   ");
复制代码

向S2和S3写入(HIGH,HIGH)激活绿色光电二极管以获取绿色密度的读数。

  1.   digitalWrite(S2, HIGH);
  2.   digitalWrite(S3, HIGH);

  3.   // Reading the output frequency
  4.   frequency = pulseIn(sensorOut, LOW);
  5.   int G = frequency;
  6.   Serial.print("Green = ");
  7.   Serial.print(frequency);
  8.   Serial.print("   ");
  9.   delay(50);
复制代码

然后比较这些值以做出颜色决定。对于不同的实验设置,读数是不同的,因为在进行设置时每个人的检测距离都不同。

  1.   if(R<22 & R>20 & G<29 & G>27){
  2.     color = 1; // Red
  3.     Serial.print("Detected Color is = ");
  4.     Serial.println("RED");
  5.   }
  6.   if(G<25 & G>22 & B<22 &B>19){
  7.     color = 2; // Orange
  8.       Serial.println("Orange  ");
  9.   }
  10.   if(R<21 & R>20 & G<28 & G>25){
  11.     color = 3; // Green
  12.       Serial.print("Detected Color is = ");
  13.     Serial.println("GREEN");
  14.   }
  15.   if(R<38 & R>24 & G<44 & G>30){
  16.     color = 4; // Yellow
  17.        Serial.print("Detected Color is = ");
  18.     Serial.println("YELLOW");
  19.   }
  20.   if (G<29 & G>27 & B<22 &B>19){
  21.     color = 5; // Blue
  22.      Serial.print("Detected Color is = ");
  23.     Serial.println("BLUE");
  24.   }
  25.   return color;
  26. }
复制代码

Testing-Arduino-based-Color-Sorter-Machine-using-TCS3200-Color-Sensor .jpg

以上就是使用TCS3200和Arduino UNO开发板制作颜色分选机的全部步骤。 如果需要,您还可以对其进行编程以检测更多颜色。 如果您有任何疑问或有任何建议,可以本帖下面进行回复。


代码

以下是本文使用的完整代码: main.rar (993 Bytes, 下载次数: 181)

跳转到指定楼层
ywdwhy
发表于: 2019-6-15 18:15:11 | 显示全部楼层

学习中,非常好的小实验
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1483



手机版|

GMT+8, 2024-5-19 19:07 , Processed in 0.062743 second(s), 10 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表