1. 功能說明
在小型云臺機械手附近設置一個工作臺,并安裝一個顏色識別傳感器。將紅色、藍色工件分別放置在傳感器上,如果檢測的物料的顏色為紅色,機械臂將物體放在機械臂的左側,如果檢測的物料的顏色為藍色,機械臂將物體放在機械臂的右側,否則,機械臂不動作。
2. 使用樣機
本實驗使用的樣機是用探索者兼容零件制作的。
3. 功能實現
3.1 電子硬件
在這個示例中,采用了以下硬件,請大家參考:
將夾爪、腕關節、底座關節的舵機分別接在擴展板的D4、D7以及D11舵機接口上,顏色傳感器接在A0、A4、A3口上。
3.2 編寫程序
編寫并燒錄以下程序(Color_Sorting_Robot.ino),該程序將實現演示視頻中的動作。
/******************************************************************************************* 版權說明: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/ --------------------------------------------------------------------------------------- 實驗需求: 用顏色傳感器實現顏色識別。 實現思路: 程序的整體思路為:在機械臂前方安裝顏色傳感器,如果檢測的物料的顏色為紅色,機械臂將 物體放在機械臂的左側,如果檢測的物料的顏色為藍色,機械臂將物體放在機械臂的右側, 否則,機械臂不動作。 實驗接線: 最上端的機械爪舵機接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的輸出脈沖數,再通過 算式得到白色物體RGB值255與三色光脈沖數的比例因子。有了白平衡后,得到的RGB比例因子,則其他顏色 物體反射光中紅、綠、藍三色光對應的1s內TCS3200輸出信號脈沖數乘以R、G、B比例因子,就可換算出被測 物體的RGB標準值。*/ #include "TimerOne.h" //顏色傳感器需要用到的定時函數庫 #include //舵機驅動需要的函數庫 ServoTimer2 myservo[3]; //舵機聲明 #define servo_num 3 //舵機數量 #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分的分數 //把TCS3200顏色傳感器各控制引腳連到Arduino數字端口 #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引腳,并引發脈沖信號中斷 //在中斷函數中記錄TCS3200輸出信號的脈沖個數 #define LED A3 //控制TCS3200顏色傳感器是否點亮 int g_count = 0; // 計算與反射光強相對應TCS3200顏色傳感器輸出信號的脈沖數 // 數組存儲在1s內TCS3200輸出信號的脈沖數,它乘以RGB比例因子就是RGB標準值 int g_array[3]; int g_flag = 0; //濾波器模式選擇順序標志 float g_SF[3]; // 存儲從TCS3200輸出信號的脈沖數轉換為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); } //中斷函數,計算TCS3200輸出信號的脈沖數 void TSC_Count() { g_count ++ ; } //定時器中斷函數,每1s中斷后,把該時間內的紅、綠、藍三種光線通過濾波器時, //TCS3200輸出信號脈沖個數分別存儲到數組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輸出的脈沖個數 TSC_WB(HIGH, HIGH); //選擇讓綠色光線通過濾波器的模式 break; case 2: g_array[1] = g_count; //存儲1s內的綠光通過濾波器時,TCS3200輸出的脈沖個數 TSC_WB(LOW, HIGH); //選擇讓藍色光線通過濾波器的模式 break; case 3: g_array[2] = g_count; //存儲1s內的藍光通過濾波器時,TCS3200輸出的脈沖個數 TSC_WB(HIGH, LOW); //選擇無濾波器的模式 break; default: g_count = 0; //計數值清零 break; } } //設置反射光中紅、綠、藍三色光分別通過濾波器時如何處理數據的標志 //該函數被TSC_Callback( )調用 void TSC_WB(int Level0, int Level1) { g_count = 0; //計數值清零 g_flag ++; //輸出信號計數標志 TSC_FilterColor(Level0, Level1); //濾波器模式 Timer1.setPeriod(100000); //設置輸出信號脈沖計數時長1s } //初始化 void setup() { TSC_Init(); Serial.begin(9600); //啟動串行通信 Timer1.initialize(100000); // defaulte is 1s Timer1.attachInterrupt(TSC_Callback); //設置定時器1的中斷,中斷調用函數為TSC_Callback() //設置TCS3200輸出信號的上跳沿觸發中斷,中斷調用函數為TSC_Count() attachInterrupt(0, TSC_Count, RISING); digitalWrite(LED, HIGH);//點亮LED燈 // delay(1500); //延時4s,以等待被測物體紅、綠、藍三色在1s內的TCS3200輸出信號脈沖計數 //通過白平衡測試,計算得到白色物體RGB值255與1s內三色光脈沖數的RGB比例因子 g_SF[0] = 0.53; //紅色光比例因子 g_SF[1] = 0.65; //綠色光比例因子 g_SF[2] = 0.54; //藍色光比例因子 //紅、綠、藍三色光對應的1s內TCS3200輸出脈沖數乘以相應的比例因子就是RGB標準值 reset(); } //主程序 int Now_Color = 0; //存儲上一次顏色傳感器檢測的數值 int Last_Color = 0; //存儲當前顏色傳感器檢測的數值 void loop() { Last_Color = Color_Detection(); Now_Color = Color_Detection(); if( Last_Color == Now_Color) //如果兩次檢測的數值相同 //(這里是為了防止顏色傳感器檢測出錯,所以檢測了兩次) { 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() //顏色檢測函數 { 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); } |
審核編輯黃昊宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
機器人
+關注
關注
211文章
28597瀏覽量
207832 -
機械手
+關注
關注
7文章
338瀏覽量
29706
發布評論請先 登錄
相關推薦
AI視角下的ZR機械手市場:速程精密科技獨占鰲頭
AI視角下的ZR機械手市場:速程精密科技獨占鰲頭 在智能制造的浪潮中,AI技術以其獨特的數據分析能力和市場洞察力,成為評估行業格局的重要工具。近期,通過AI的深度分析,國內ZR機械手市場的競爭格局
機械手 OEM 的應用
中心,機械手可以快速地將包裹從傳送帶上分揀到不同的區域,以便進行后續的配送。
倉儲管理 :在倉儲管理中,機械手 OEM 可以與倉儲管理系統相結合,實現貨物的自動存儲和取出。它能夠根據系
發表于 09-18 10:31
明治案例 | 【BGS背景抑制】【大光斑】機械手吸取網布有無檢測
在自動化生產線中,機械手需要準確地識別和吸取特定位置上的網布。網狀物抓取網布表面存在大小不一的孔洞,這給傳統傳感器帶來了很大挑戰。傳統的點光斑傳感器在檢測時可能因孔洞而漏檢,或因顏色復雜而誤檢。因此
“快、準、穩”——阿普奇AK5在機械手領域的應用解決方案
程序實現抓取、搬運物件或操作工具等自動作業,如今工業機械手已然成為現代制造生產系統中的一個重要組成部分。 (點焊) (噴涂) (裝配空調) (穿針引線) 那么,機械手是由什么組成的呢? ? 常見的
機器視覺控制機械手的具體過程
機器視覺控制機械手是一種將機器視覺技術與機械手控制技術相結合的自動化技術。它通過機器視覺系統獲取目標物體的圖像信息,然后利用圖像處理技術對圖像進行分析和處理,從而實現對機械手的精確控制
PLC在機械手控制系統中的具體應用
隨著工業自動化技術的飛速發展,機械手作為現代制造業中不可或缺的重要設備,其智能化、自動化水平不斷提高。在機械手控制系統中,PLC(可編程邏輯控制器)因其可靠性高、編程簡單、功能強大等優點,被廣泛應用
工業網關的數字化車間機械手和工業生產設備遠程監控解決方案應用
工業生產環境中,數字化車間機械手和工業生產設備的遠程監控日益成為一種趨勢。隨著工業互聯網的快速發展和智能制造的興起,傳統的生產方式已經難以適應市場的需求和競爭的壓力,因此,數字化車間機械手和工業生產
ZR機械手:提高生產效率,降低成本的有效途徑-速程精密
ZR機械手:提高生產效率,降低成本的有效途徑-速程精密 在制造業中,如何提高生產效率、降低成本一直是企業追求的目標。隨著科技的不斷進步,ZR機械手作為一種新型的自動化設備,逐漸成為實現這一
ZR機械手:推動制造業向更高水平發展
ZR機械手:推動制造業向更高水平發展-速程精密 隨著科技的不斷發展,制造業正面臨著巨大的變革。在這個過程中,ZR機械手以其卓越的性能和創新的技術,成為了推動制造業向更高水平發展的重要力量。 ZR
搬運機械手連接“搭子”哪家選?YM系列工業級連接器真搭
搬運機械手是工廠、流水線上非常重要的角色,用于完成對貨品或工件的取放動作。搬運機械手能否做到流暢的工作,穩定且更有保障的持續安全供電連接是非常關鍵的一環。YM系列連接器為搬運機械手提供連接支持搬運
ZR機械手:未來工業自動化的重要組成部分
ZR機械手:未來工業自動化的重要組成部分 隨著科技的飛速發展,工業自動化已成為制造業轉型升級的關鍵。在這個過程中,ZR機械手以其卓越的性能和創新的技術,成為了未來工業自動化的重要組成部分。 一、技術
評論