1. 功能說明
在小型云臺機械手附近設置一個工作臺,并安裝一個顏色識別傳感器。將紅色、藍色工件分別放置在傳感器上,如果檢測的物料的顏色為紅色,機械臂將物體放在機械臂的左側,如果檢測的物料的顏色為藍色,機械臂將物體放在機械臂的右側,否則,機械臂不動作。
2. 使用樣機
本實驗使用的樣機是用探索者兼容零件制作的。

3. 功能實現(xiàn)
3.1 電子硬件
在這個示例中,采用了以下硬件,請大家參考:

將夾爪、腕關節(jié)、底座關節(jié)的舵機分別接在擴展板的D4、D7以及D11舵機接口上,顏色傳感器接在A0、A4、A3口上。

3.2 編寫程序
編寫并燒錄以下程序(Color_Sorting_Robot.ino),該程序將實現(xiàn)演示視頻中的動作。
|
/******************************************************************************************* 版權說明:Copyright 2022 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved. Distributed under MIT license.See file LICENSE for detail or copy at https://opensource.org/licenses/MIT by 機器譜 2022-12-21 https://www.robotway.com/ --------------------------------------------------------------------------------------- 實驗需求: 用顏色傳感器實現(xiàn)顏色識別。 實現(xiàn)思路: 程序的整體思路為:在機械臂前方安裝顏色傳感器,如果檢測的物料的顏色為紅色,機械臂將 物體放在機械臂的左側,如果檢測的物料的顏色為藍色,機械臂將物體放在機械臂的右側, 否則,機械臂不動作。 實驗接線: 最上端的機械爪舵機接D4; 中間的機械身軀舵機接D7; 最下端的機械底座舵機接D11; 顏色傳感器的接線為 S1 S2 5V GND S3 S2 5V GND OUT LED 5V GND | | | | | | | | | | | | A0 A1 5V GND A5 A4 5V GND D2 A3 5V GND ********************************************************************************************/ //顏色傳感器原理 /*首先進行白平衡,把一個白色物體放置在TCS3200顏色傳感器之下,兩者相距10mm左右,點亮傳感器上的 4個白光LED燈,用Arduino控制器的定時器設置一固定時間1s,然后選通三種顏色的濾波器,讓被測物體反 射光中紅、綠、藍三色光分別通過濾波器,計算1s時間內三色光分別對應的TCS3200的輸出脈沖數(shù),再通過 算式得到白色物體RGB值255與三色光脈沖數(shù)的比例因子。有了白平衡后,得到的RGB比例因子,則其他顏色 物體反射光中紅、綠、藍三色光對應的1s內TCS3200輸出信號脈沖數(shù)乘以R、G、B比例因子,就可換算出被測 物體的RGB標準值。*/ #include "TimerOne.h" //顏色傳感器需要用到的定時函數(shù)庫 #include //舵機驅動需要的函數(shù)庫 ServoTimer2 myservo[3]; //舵機聲明 #define servo_num 3 //舵機數(shù)量 #define Servo_Speed 20 //舵機速度 #define Upward_servo_close 66 //機械爪閉合的角度值 #define Upward_servo_open 115 //機械爪張開的角度值 #define Middle_servo_down 105 //機械臂的初始角 #define Middle_servo_init 85 //機械臂的初始角 #define Middle_servo_left 10 //機械臂向左偏的角度 #define Middle_servo_left1 50 //機械臂向左偏的角度 #define Down_servo_middle 75 //機械底座初始角度值 #define Down_servo_left 5 //機械底座向左偏的角度值 #define Down_servo_right 145 //機械底座向右偏的角度值 int servo_pin[3]={4,7,11}; //定義舵機引腳號 float value_init[3]={Upward_servo_open, Middle_servo_left, Down_servo_middle};//舵機初始角度 int f=20; //舵機從角度A轉到角度B分的分數(shù) //把TCS3200顏色傳感器各控制引腳連到Arduino數(shù)字端口 #define S0 A0 //物體表面的反射光越強,TCS3002D的內置振蕩器產生的方波頻率越高, #define S1 A1 //S0和S1的組合決定輸出信號頻率比率因子,比例因子為2% //比率因子為TCS3200傳感器OUT引腳輸出信號頻率與其內置振蕩器頻率之比 #define S2 A4 //S2和S3的組合決定讓紅、綠、藍,哪種光線通過濾波器 #define S3 A5 #define OUT 2 //TCS3200顏色傳感器輸出信號輸入到Arduino中斷0引腳,并引發(fā)脈沖信號中斷 //在中斷函數(shù)中記錄TCS3200輸出信號的脈沖個數(shù) #define LED A3 //控制TCS3200顏色傳感器是否點亮 int g_count = 0; // 計算與反射光強相對應TCS3200顏色傳感器輸出信號的脈沖數(shù) // 數(shù)組存儲在1s內TCS3200輸出信號的脈沖數(shù),它乘以RGB比例因子就是RGB標準值 int g_array[3]; int g_flag = 0; //濾波器模式選擇順序標志 float g_SF[3]; // 存儲從TCS3200輸出信號的脈沖數(shù)轉換為RGB標準值的RGB比例因子 // 初始化TSC3200各控制引腳的輸入輸出模式 //設置TCS3002D的內置振蕩器方波頻率與其輸出信號頻率的比例因子為2% void TSC_Init() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(OUT, INPUT); pinMode(LED, OUTPUT); digitalWrite(S0, LOW); digitalWrite(S1, HIGH); } //選擇濾波器模式,決定讓紅、綠、藍,哪種光線通過濾波器 void TSC_FilterColor(int Level01, int Level02) { if(Level01 != LOW) Level01 = HIGH; if(Level02 != LOW) Level02 = HIGH; digitalWrite(S2, Level01); digitalWrite(S3, Level02); } //中斷函數(shù),計算TCS3200輸出信號的脈沖數(shù) void TSC_Count() { g_count ++ ; } //定時器中斷函數(shù),每1s中斷后,把該時間內的紅、綠、藍三種光線通過濾波器時, //TCS3200輸出信號脈沖個數(shù)分別存儲到數(shù)組g_array[3]的相應元素變量中 void TSC_Callback() { switch(g_flag) { case 0: TSC_WB(LOW, LOW); //選擇讓紅色光線通過濾波器的模式 break; case 1: g_array[0] = g_count; //存儲1s內的紅光通過濾波器時,TCS3200輸出的脈沖個數(shù) TSC_WB(HIGH, HIGH); //選擇讓綠色光線通過濾波器的模式 break; case 2: g_array[1] = g_count; //存儲1s內的綠光通過濾波器時,TCS3200輸出的脈沖個數(shù) TSC_WB(LOW, HIGH); //選擇讓藍色光線通過濾波器的模式 break; case 3: g_array[2] = g_count; //存儲1s內的藍光通過濾波器時,TCS3200輸出的脈沖個數(shù) TSC_WB(HIGH, LOW); //選擇無濾波器的模式 break; default: g_count = 0; //計數(shù)值清零 break; } } //設置反射光中紅、綠、藍三色光分別通過濾波器時如何處理數(shù)據(jù)的標志 //該函數(shù)被TSC_Callback( )調用 void TSC_WB(int Level0, int Level1) { g_count = 0; //計數(shù)值清零 g_flag ++; //輸出信號計數(shù)標志 TSC_FilterColor(Level0, Level1); //濾波器模式 Timer1.setPeriod(100000); //設置輸出信號脈沖計數(shù)時長1s } //初始化 void setup() { TSC_Init(); Serial.begin(9600); //啟動串行通信 Timer1.initialize(100000); // defaulte is 1s Timer1.attachInterrupt(TSC_Callback); //設置定時器1的中斷,中斷調用函數(shù)為TSC_Callback() //設置TCS3200輸出信號的上跳沿觸發(fā)中斷,中斷調用函數(shù)為TSC_Count() attachInterrupt(0, TSC_Count, RISING); digitalWrite(LED, HIGH);//點亮LED燈 // delay(1500); //延時4s,以等待被測物體紅、綠、藍三色在1s內的TCS3200輸出信號脈沖計數(shù) //通過白平衡測試,計算得到白色物體RGB值255與1s內三色光脈沖數(shù)的RGB比例因子 g_SF[0] = 0.53; //紅色光比例因子 g_SF[1] = 0.65; //綠色光比例因子 g_SF[2] = 0.54; //藍色光比例因子 //紅、綠、藍三色光對應的1s內TCS3200輸出脈沖數(shù)乘以相應的比例因子就是RGB標準值 reset(); } //主程序 int Now_Color = 0; //存儲上一次顏色傳感器檢測的數(shù)值 int Last_Color = 0; //存儲當前顏色傳感器檢測的數(shù)值 void loop() { Last_Color = Color_Detection(); Now_Color = Color_Detection(); if( Last_Color == Now_Color) //如果兩次檢測的數(shù)值相同 //(這里是為了防止顏色傳感器檢測出錯,所以檢測了兩次) { switch(Now_Color) { case 1: Serial.print("Red"); //如果檢測到的物料為紅色,將物料放到機械臂的左側 Servo_Left(); Now_Color = 0; Last_Color = 0; break; case 2: Serial.print("Blue");//如果檢測到的物料為藍色,將物料放到機械臂的右側 Servo_Right(); Now_Color = 0; Last_Color = 0; break; case 3: Serial.print("NONE");//否則,機械臂不動作; Serial.println(); Now_Color = 0; Last_Color = 0; break; } } } int Color_Detection() //顏色檢測函數(shù) { int color[3]; g_flag = 0; for(int i=0; i<3; i++) { color[i] = g_array[i] * g_SF[i]; } Serial.println((String)(color[0]) + '+' + (String)(color[1]) + '+' + (String)(color[2]) + '+'); delay(500); if( (color[0] > color[1]) && (color[0] >color[2]) && ( (color[1]+color[2]) return 1; //如果檢測到的顏色為紅色,返回1; } else if( (color[2] > color[1]) && (color[2] >color[0]) ){ return 2; //如果檢測到的顏色為藍色,返回2; } else { return 3; } //否則,機械臂不動作; } void reset() //舵機角度初始化 { for(int i=0;i { myservo[i].attach(servo_pin[i]); myservo[i].write(map(value_init[i],0,180,500,2500)); } } void servo_move(float value0, float value1, float value2) //舵機轉動 { float value_arguments[3] = {value0, value1, value2}; float value_delta[servo_num]; for(int i=0;i { value_delta[i] = (value_arguments[i] - value_init[i]) / f; } for(int i=0;i { for(int k=0;k { value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k]; } for(int j=0;j { myservo[j].write(map(value_init[j],0,180,500,2500)); delay(Servo_Speed); } } } void Servo_Left() //將物料放到機械臂的左側 { servo_move(Upward_servo_open, Middle_servo_left, Down_servo_middle);//初始化動作 servo_move(Upward_servo_open, Middle_servo_init, Down_servo_middle);//機械臂下降 servo_move(Upward_servo_close, Middle_servo_init, Down_servo_middle);//機械爪閉合(抓取貨物) servo_move(Upward_servo_close, Middle_servo_left1, Down_servo_middle);//機械臂上抬 servo_move(Upward_servo_close, Middle_servo_down, Down_servo_left); //機械臂下降,機械底座向左轉 servo_move(Upward_servo_open, Middle_servo_down, Down_servo_left); //機械爪張開(釋放貨物) servo_move(Upward_servo_open, Middle_servo_left, Down_servo_middle);//機械臂回復到初始角度 } void Servo_Right() //將物料放到機械臂的右側 { servo_move(Upward_servo_open, Middle_servo_left, Down_servo_middle);//初始化動作 servo_move(Upward_servo_open, Middle_servo_init, Down_servo_middle); servo_move(Upward_servo_close, Middle_servo_init, Down_servo_middle); servo_move(Upward_servo_close, Middle_servo_left1, Down_servo_middle); servo_move(Upward_servo_close, Middle_servo_down, Down_servo_right); servo_move(Upward_servo_open, Middle_servo_down, Down_servo_right); servo_move(Upward_servo_open, Middle_servo_left, Down_servo_middle); } |
審核編輯黃昊宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
機器人
+關注
關注
213文章
31073瀏覽量
222180 -
機械手
+關注
關注
7文章
358瀏覽量
31455
發(fā)布評論請先 登錄
相關推薦
熱點推薦
超越ProfiHub B5:耐達訊自動化Profibus集線器在汽車制造機械手臂控制中的實踐
在汽車制造行業(yè),焊接、噴涂、裝配等工藝環(huán)節(jié)高度依賴多臺機械手臂的協(xié)同作業(yè)。傳統(tǒng)控制方案中,每臺機械手臂需通過獨立電纜與PLC連接,導致布線復雜、故障排查困難、擴展性差。尤其當產線需新增機械手臂時,常
破解快遞分揀痛點!光子精密顏色傳感器賦能高速分揀提質增效
識別、強抗干擾、低耗耐用的核心優(yōu)勢,精準破解行業(yè)困境,實現(xiàn)了快遞紙箱顏色標識分揀的“高速化、精準化、穩(wěn)定化、低成本化”。
適配FOUP載具的晶圓搬運機械手,哪些型號維護更便捷?
FOUP載具(Front-Opening Unified Pod)作為半導體晶圓的密封傳輸容器,能有效避免晶圓在搬運過程中被污染,因此在先進制程中應用廣泛。但適配FOUP載具的晶圓搬運機械手,維護
射頻RFID+機械臂:工業(yè)零部件加工后智能分揀
某精密機械加工廠采用RFID+機械臂協(xié)同方案,提升零部件分揀精度與效率,降低錯分率,實現(xiàn)智能制造升級。
家電沖壓產線 “一機雙模” 實現(xiàn)路徑:MDSC-900E 雙料檢測與三次元機械手的協(xié)同方案
機械手
阿童木(廣州)智能科技有限公司
發(fā)布于 :2025年07月24日 11:52:46
SCARA機械手:工業(yè)自動化領域的精密多面手
小型SCARA柔性上料機集高速度、高精度、高靈活性及智能化視覺于一體,推動著電子裝配、精密制造、智能分揀等領域的自動化升級,并為科研創(chuàng)新提供堅實平臺。
桁架機械手直線模組滑臺 五大核心技術打造無人車間新標桿
在工業(yè)4.0的浪潮下,自動化生產已成為制造業(yè)的核心競爭力。如何實現(xiàn)高效、精準、靈活的無人化作業(yè)?飛創(chuàng)桁架機械手直線模組滑臺憑借五大創(chuàng)新技術,重新定義智造標準,為無人車間樹立新標桿!桁架機械手以高強度
profinet轉ethercat網(wǎng)關的自動上料機械手集成案例
主控,伺服電機負責機械手臂的精確定位。分布式I/O模塊通過ethercat連接視覺傳感器和力反饋系統(tǒng)。機械手6軸協(xié)同運動控制,位置精度達±0.02mm。安川伺服完美兼容兩種協(xié)議的控制指令,確保平穩(wěn)運行。實現(xiàn)生產狀態(tài)數(shù)據(jù)的統(tǒng)一采集
如何讓小型云臺機械手實現(xiàn)按顏色分揀物品?
評論