顧名思義,顏色分類就是簡單地根據事物的顏色對事物進行分類。它可以通過看到它來輕松完成,但是當要分類的東西太多并且這是一項重復性任務時,自動色選機非常有用。這些機器有顏色傳感器來感知任何物體的顏色,并在檢測到顏色伺服電機后抓住物體并將其放入相應的盒子中。它們可用于顏色識別、顏色區分和顏色分類很重要的不同應用領域。一些應用領域包括農業(基于顏色的谷物分選)、食品工業、鉆石和采礦業、回收等。應用不僅限于此,還可以進一步應用于不同的行業。
在本教程中,我們將使用顏色傳感器 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;
}
-
伺服電機
+關注
關注
85文章
2028瀏覽量
57698 -
Arduino
+關注
關注
187文章
6464瀏覽量
186642 -
分選機
+關注
關注
0文章
22瀏覽量
6776 -
TCS3200
+關注
關注
0文章
23瀏覽量
15548
發布評論請先 登錄
相關推薦
評論