使用TCS3200和Arduino UNO制作颜色分选机

描述

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

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

  所需组件

  Arduino UNO

  TCS3200 颜色传感器

  伺服电机

  跳线

  面包板

  色选机械臂底盘的制作方法

  为了制作包括底盘、臂、滚轮、垫子在内的完整设置,我们使用了 2 毫米厚的白色Sunboard。它在固定商店很容易买到。我们使用切纸机切割 Sunboard Sheet 和 FlexKwik 或 FeviKwik 来连接不同的部分。以下是构建颜色分类臂

  的一些步骤:

  1)拿取防晒板。

TCS3200

  2) 如图所示,用刻度尺和记号笔测量好所有边后,将阳光板切成小块。

TCS3200

TCS3200

TCS3200

  3)现在将两块阳光板放在一起,然后在上面倒一滴 FeviKwik 将它们粘在一起。按照图继续连接。

TCS3200

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

TCS3200

  TCS3200 颜色传感器

TCS3200

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

TCS3200

  这三个阵列中的每个传感器阵列都是根据需要单独选择的。因此它被称为可编程传感器。该模块可以用来感知特定颜色并离开其他颜色。它包含用于该选择目的的过滤器。第四种模式称为“无滤镜模式”,其中传感器检测白光。

  Arduino色选机电路图

  这个Arduino 颜色分类器的电路图很容易制作,不需要太多连接。示意图如下。

TCS3200

  这是色选机设置背后的电路:

TCS3200

对 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

  这样就完成了使用 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;

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分