顧名思義,顏色分類就是簡(jiǎn)單地根據(jù)事物的顏色對(duì)事物進(jìn)行分類。它可以通過看到它來輕松完成,但是當(dāng)要分類的東西太多并且這是一項(xiàng)重復(fù)性任務(wù)時(shí),自動(dòng)色選機(jī)非常有用。這些機(jī)器有顏色傳感器來感知任何物體的顏色,并在檢測(cè)到顏色伺服電機(jī)后抓住物體并將其放入相應(yīng)的盒子中。它們可用于顏色識(shí)別、顏色區(qū)分和顏色分類很重要的不同應(yīng)用領(lǐng)域。一些應(yīng)用領(lǐng)域包括農(nóng)業(yè)(基于顏色的谷物分選)、食品工業(yè)、鉆石和采礦業(yè)、回收等。應(yīng)用不僅限于此,還可以進(jìn)一步應(yīng)用于不同的行業(yè)。
在本教程中,我們將使用顏色傳感器 TCS3200、一些伺服電機(jī)和 Arduino 板制作顏色分選機(jī)。本教程將包括彩球的分類并將它們保存在相關(guān)的彩盒中。盒子將處于固定位置,伺服電機(jī)將用于移動(dòng)分揀手以將球保持在相關(guān)盒子中。
所需組件
Arduino UNO
TCS3200 顏色傳感器
伺服電機(jī)
跳線
面包板
色選機(jī)械臂底盤的制作方法
為了制作包括底盤、臂、滾輪、墊子在內(nèi)的完整設(shè)置,我們使用了 2 毫米厚的白色Sunboard。它在固定商店很容易買到。我們使用切紙機(jī)切割 Sunboard Sheet 和 FlexKwik 或 FeviKwik 來連接不同的部分。以下是構(gòu)建顏色分類臂
的一些步驟:
1)拿取防曬板。
2) 如圖所示,用刻度尺和記號(hào)筆測(cè)量好所有邊后,將陽光板切成小塊。
3)現(xiàn)在將兩塊陽光板放在一起,然后在上面倒一滴 FeviKwik 將它們粘在一起。按照?qǐng)D繼續(xù)連接。
4) 將所有部件連接在一起后,這臺(tái)色選機(jī)將如下所示:
TCS3200 顏色傳感器
TCS3200 是一種顏色傳感器,可以通過正確的編程檢測(cè)任意數(shù)量的顏色。TCS3200 包含 RGB(紅綠藍(lán))陣列。如圖所示,在顯微鏡下可以看到傳感器眼睛內(nèi)部的方框。這些方塊是 RGB 矩陣的數(shù)組。這些盒子中的每一個(gè)都包含三個(gè)傳感器,一個(gè)用于感測(cè)紅光強(qiáng)度,一個(gè)用于感測(cè)綠光強(qiáng)度,最后一個(gè)用于感測(cè)藍(lán)光強(qiáng)度。
這三個(gè)陣列中的每個(gè)傳感器陣列都是根據(jù)需要單獨(dú)選擇的。因此它被稱為可編程傳感器。該模塊可以用來感知特定顏色并離開其他顏色。它包含用于該選擇目的的過濾器。第四種模式稱為“無濾鏡模式”,其中傳感器檢測(cè)白光。
Arduino色選機(jī)電路圖
這個(gè)Arduino 顏色分類器的電路圖很容易制作,不需要太多連接。示意圖如下。
這是色選機(jī)設(shè)置背后的電路:
對(duì) Arduino Uno 進(jìn)行編程以對(duì)彩色球進(jìn)行分類
對(duì) Arduino UNO 進(jìn)行編程非常簡(jiǎn)單,需要一個(gè)簡(jiǎn)單的邏輯來簡(jiǎn)化顏色分類所涉及的步驟。最后給出了帶有演示視頻的完整程序。
由于使用的是伺服電機(jī),所以伺服庫是程序的重要組成部分。這里我們使用兩個(gè)伺服電機(jī)。第一個(gè)伺服將彩球從初始位置移動(dòng)到 TCS3200 檢測(cè)器位置,然后移動(dòng)到將落下的分揀位置。移動(dòng)到分揀位置后,第二個(gè)伺服將使用其手臂將球落到所需的顏色桶中。請(qǐng)參閱最后給出的視頻中的完整工作。
第一步將包含所有庫并定義伺服變量。
#include伺服拾取伺服; 伺服下降伺服;
TCS3200 顏色傳感器可以在沒有庫的情況下工作,因?yàn)橹恍枰獜膫鞲衅饕_讀取頻率來決定顏色。所以只需定義 TCS3200 的引腳號(hào)。
#define S0 4 #define S1 5 #define S2 7 #define S3 6 #define sensorOut 8 int 頻率 = 0; 詮釋顏色=0;
使選擇引腳作為輸出,因?yàn)檫@將使彩色光電二極管高或低,并將TCS3200 的 Out 引腳作為輸入。OUT 引腳將提供頻率。最初選擇頻率縮放為 20%。
pinMode(S0,輸出); pinMode(S1,輸出); pinMode(S2,輸出); pinMode(S3,輸出); pinMode(傳感器輸出,輸入); 數(shù)字寫入(S0,低); 數(shù)字寫入(S1,高);
伺服電機(jī)連接在 Arduino 的引腳 9 和 10。將拾取彩球的拾取伺服器連接在引腳 9 上,將根據(jù)顏色掉落彩球的下落伺服器連接在引腳 10 上。
pickServo.attach(9); dropServo.attach(10);
最初,拾取伺服電機(jī)設(shè)置在初始位置,在這種情況下為 115 度。它可能會(huì)有所不同,并且可以相應(yīng)地進(jìn)行定制。電機(jī)在延遲一段時(shí)間后移動(dòng)到檢測(cè)器區(qū)域并等待檢測(cè)。
pickServo.write(115); 延遲(600); for(int i = 115; i > 65; i--) { pickServo.write(i); 延遲(2); } 延遲(500);
TCS 3200從Out Pin 讀取顏色并給出頻率。
顏色 = 檢測(cè)顏色(); 延遲(1000);
根據(jù)檢測(cè)到的顏色,下落伺服電機(jī)以特定角度移動(dòng),并將彩球落入相應(yīng)的盒子中。
開關(guān)(顏色){ 案例1: dropServo.write(50); 休息; 案例2: dropServo.write(80); 休息; 案例3: dropServo.write(110); 休息; 案例4: dropServo.write(140); 休息; 案例5: dropServo.write(170); 休息; 案例0: 中斷; } 延遲(500);
伺服電機(jī)返回初始位置,等待下一個(gè)球被拾取。
for(int i = 65; i > 29; i--) { pickServo.write(i); 延遲(2); } 延遲(300); for(int i = 29; i < 115; i++) { pickServo.write(i); 延遲(2); }
函數(shù)detectColor()用于測(cè)量頻率并比較顏色頻率以得出顏色結(jié)論。結(jié)果打印在串行監(jiān)視器上。然后它返回用于移動(dòng)下降伺服電機(jī)角度的案例的顏色值。
詮釋檢測(cè)顏色(){
寫入 S2 和 S3 (LOW,LOW) 會(huì)激活紅色光電二極管以獲取紅色密度讀數(shù)。
數(shù)字寫入(S2,低); 數(shù)字寫入(S3,低); 頻率 = 脈沖輸入(傳感器輸出,低); int R = 頻率; Serial.print("紅色 = "); Serial.print(frequency);//打印紅色頻率 Serial.print(" "); 延遲(50);
寫入 S2 和 S3(低、高)會(huì)激活藍(lán)色光電二極管以獲取藍(lán)色密度讀數(shù)。
數(shù)字寫入(S2,低); 數(shù)字寫入(S3,高); 頻率 = 脈沖輸入(傳感器輸出,低); int B = 頻率; Serial.print("藍(lán)色 = "); Serial.print(頻率); 序列號(hào).println(" ");
寫入 S2 和 S3 (HIGH,HIGH) 會(huì)激活綠色光電二極管以獲取綠色密度讀數(shù)。
數(shù)字寫入(S2,高); 數(shù)字寫入(S3,高); // 讀取輸出頻率 頻率 = pulseIn(sensorOut, LOW); int G = 頻率; Serial.print("綠色 = "); Serial.print(頻率); 序列號(hào).print(""); 延遲(50);
然后比較這些值以做出顏色決定。不同實(shí)驗(yàn)設(shè)置的讀數(shù)不同,因?yàn)樵谶M(jìn)行設(shè)置時(shí)每個(gè)人的檢測(cè)距離都不同。
如果(R<22 & R>20 & G<29 & G>27){ 顏色 = 1; // Red Serial.print("檢測(cè)到的顏色是 = "); 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("檢測(cè)到的顏色是 = "); Serial.println("綠色"); } if(R<38 & R>24 & G<44 & G>30){ 顏色 = 4; // 黃色 Serial.print("檢測(cè)到的顏色是 = "); Serial.println("黃色"); } if (G<29 & G>27 & B<22 &B>19){ 顏色 = 5; // 藍(lán)色 Serial.print("檢測(cè)到的顏色是 = "); Serial.println("藍(lán)色"); } 返回顏色; }
這樣就完成了使用 TCS3200 和 Arduino UNO 的色選機(jī)。如果需要,您還可以對(duì)其進(jìn)行編程以檢測(cè)更多顏色。
#include
伺服拾取伺服;
伺服下降伺服;
#define S0 4
#define S1 5
#define S2 7
#define S3 6
#define sensorOut 8
int 頻率 = 0;
詮釋顏色=0;
int detectColor() {
// 激活紅色光電二極管以讀取
digitalWrite(S2, LOW);
數(shù)字寫入(S3,低);
頻率 = 脈沖輸入(傳感器輸出,低);
int R = 頻率;
Serial.print("紅色 = ");
Serial.print(frequency);//打印紅色頻率
Serial.print(" ");
延遲(50);
// 激活藍(lán)色光電二極管以讀取
digitalWrite(S2, LOW);
數(shù)字寫入(S3,高);
頻率 = 脈沖輸入(傳感器輸出,低);
int B = 頻率;
Serial.print("藍(lán)色 = ");
Serial.print(頻率);
序列號(hào).println(" ");
// 激活綠色光電二極管以讀取
digitalWrite(S2, HIGH);
數(shù)字寫入(S3,高);
// 讀取輸出頻率
頻率 = pulseIn(sensorOut, LOW);
int G = 頻率;
Serial.print("綠色 = ");
Serial.print(頻率);
序列號(hào).print("");
延遲(50);
延遲(50);
//不同設(shè)置
的讀數(shù)不同 //根據(jù)您的項(xiàng)目和檢測(cè)到的讀數(shù)更改讀數(shù)
if(R<22 & R>20 & G<29 & G>27){
color = 1; // Red
Serial.print("檢測(cè)到的顏色是 = ");
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("檢測(cè)到的顏色是 = ");
Serial.println("綠色");
}
if(R<38 & R>24 & G<44 & G>
30){顏色 = 4; // 黃色
Serial.print("檢測(cè)到的顏色是 = ");
Serial.println("黃色");
}
if (G<29 & G>27 & B<22 &B>19){
顏色 = 5; // 藍(lán)色
Serial.print("檢測(cè)到的顏色是 = ");
Serial.println("藍(lán)色");
}
返回顏色;
}
無效設(shè)置(){
pinMode(S0,輸出);
pinMode(S1,輸出);
pinMode(S2,輸出);
pinMode(S3,輸出);
pinMode(傳感器輸出,輸入);
//頻率縮放到 20% 選定
的 digitalWrite(S0, LOW);
數(shù)字寫入(S1,高);
pickServo.attach(9);
dropServo.attach(10);
序列號(hào).開始(9600);
}
void loop() {
//伺服電機(jī)的初始位置
pickServo.write(115);
延遲(600);
for(int i = 115; i > 65; i--) {
pickServo.write(i);
延遲(2);
}
延遲(500);
//通過調(diào)用函數(shù)讀取顏色值。將結(jié)論值保存在變量
color = detectColor();
延遲(1000);
開關(guān)(顏色){
案例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;
}
-
伺服電機(jī)
+關(guān)注
關(guān)注
85文章
2043瀏覽量
57808 -
Arduino
+關(guān)注
關(guān)注
188文章
6468瀏覽量
186951 -
分選機(jī)
+關(guān)注
關(guān)注
0文章
24瀏覽量
6779 -
TCS3200
+關(guān)注
關(guān)注
0文章
23瀏覽量
15557
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論