• 沒有找到結果。

5.1 系統運行

首先由 Arduino IDE 編譯的程式語言燒入至機械手中的 Arduino Mega 2560 單晶片微控制器,經由 PC 系統整合讓 Leap Motion 偵測到的手勢能夠 從 Processing 中編譯好的程式語言由 MQTT 傳送訊息至 Topic 中,再讓 Arduino Mega 2560 外接 Arduino Ethernet Shield 連線至網路並且給予訂 閱相同 Topic 的指令,最後 Arduino Mega 2560 收到的訊息就能夠命令伺服 馬達轉動不同的角度,進而達到遠端控制機械手。

圖 5.1-1 系統運作示意圖

23

5.2 系統整合

將 Processing 與 Arduino 整合起來能夠通訊是最關鍵的地方,初步整合 我試用了 Leap Motion 手勢控制呼吸燈來做,漸漸張開手掌燈泡會漸漸亮起 來,反之,手掌慢慢合起來燈泡會漸漸暗掉,程式碼為附錄中(表 5.2-1)與(表 5.2-2)。

圖 5.2-1 呼吸燈系統整合

5.3 機械手構造簡介

InMoov 機械手的材料組件是由網路上提供的 3D 列印 Open Source 所印 出來的,其中小姆指、無名指及大拇指各有一根能滾動的軸固定住,能讓手掌 做些微的彎曲,而手指上有三個關節分別以三個螺絲鎖上讓關節能夠彎曲。

圖 5.3-1 機械手零件

25

圖 5.3-2 小姆指及無名指中的滑軸 圖 5.3-3 大拇指構造 (摘錄於 InMoov.fr) (摘錄於 InMoov.fr)

圖 5.3-4 三個活動關節 圖 5.3-5 機械手掌 (摘錄於 InMoov.fr) (摘錄於 InMoov.fr)

5.4 馬達調整

機械手主要的動力來源是裝置於手臂上的伺服馬達,伺服馬達接線至 Arduino 及麵包板給與電壓,且伺服馬達與每根手指各有兩條線來做手指上動 作的拉伸,共有五個伺服馬達,一個控制一根手指,藍色物件為控制手腕的伺 服馬達不過本論文並無安裝。

圖 5.4-1 伺服馬達安裝圖

27

MG995 伺服馬達,棕色腳位 1 是 GND 接地線,紅色腳位 2: 4.8V~6V,橙 色腳位 3: PWM 輸入訊號。伺服馬達為機器人應用所常見的電子馬達,其基 本控制原理是利用控制迴圈、結合必要的馬達反饋,從而協助馬達進入所需 的狀態,如位置與速度。由於伺服馬達必須透過控制迴圈了解目前狀態,因此 其穩定性高於步進馬達[43]。

實驗機械手每根手指皆由兩條尼龍線綁住馬達,一條拉緊會讓手指伸直,

另一條拉緊會讓手指彎曲,然而拉緊尼龍線所需要的就是轉動伺服馬達,但 每條綁定的尼龍線鬆緊程度不同,我自己的方式是寫個簡單的程式碼讓伺服 馬達從 5 度轉到 175 度再轉回來,測試每條線的鬆緊度是否能如預期的讓手 指伸直或是彎取,請參閱程式碼(表 5.4-1 Arduino 測試鬆緊度程式碼)。

圖 5.4-2 伺服馬達綁線圖

圖 5.4-3 成品圖

5.5 電路連接

在機械手都安裝完成之後,要與 Arduino 單晶片微控制器連結就需要接 上 GND、電壓、輸入訊號腳位,我將大拇指至小拇指分別接上 4 到 8 的數位腳 位,電壓為 5V,電路圖黑、藍 = PWN 輸入訊號,紅、粉 = 5V,黃、白 = GND ,電路圖(圖 6.2-1)及概要圖(圖 6.2-2)如下,不過 Arduino 所提供的 電壓不足驅動五個伺服馬達同時運作,這裡使用外接電源的方式將兩個 18650 的電池用電池盒串聯得到 7.2V 來供給伺服馬達的電壓,並將網路線接 Arduino Ethernet Shield,最後在把 Leap Motion 連結至個人電腦中。

29

圖 5.5-1 電路圖

圖 5.5-2 概要圖

5.6 確認 Arduino 連上網路

先利用家用網路分享器確認是否有連上網路,並確認 IP 位置及 Mac Address[44]的數據是否與自己設定的相同,在使用 ping[45]的方式確認能 收訊,從 ping 出來的 4 次就能知道訊息是否有遺失。

圖 5.6-1 網路連線

接著使用手機 APP 確認 Mqtt connect broker[46],這裡使用的是 MQTTool 由 iOS 系統裡面的 Apple Store 開放免費下載的 APP,連線至已架 設完成的 MQTT 後由手機發出訊息至/lm 這個 Topic 試探 Arduino 有無接收到 訊息。

31

圖 5.6-2 Arduino 收訊確認

再由 Processing 端用 Leap Motion 偵測手指的動作,並發出相對應的 訊息給 MQTT 中的/lm,發送後經由 MQTTool 來監控是否能夠順利的收到訊 號,下圖收到小寫的字母代表彎曲的手指,而大寫的字母代表伸直的手指。

圖 5.6-3 Processing 發訊息確認

最後測試成功後,將上述的內容整合,由 Processing 端用 Leap Motion 偵測手指的動作,並發出相對應的訊息給 MQTT 中的/lm,在試探 Arduino 有 無接收到訊息。

圖 5.6-4 連線整合確認

5.7 序列埠程式碼編輯

Arduino 的部分首先將使用序列埠(Comport)[44]的方式經由 USB 連接至 Arduino MEGA-2560 先進行無網路通訊的編譯,完成後再加上 MQTT 通訊協定。

在 void setup()之前先插入<Servo.h>,並設定變數 thumb、index、middle、

ring 及 pinky 等等的腳位,定義每個手指各一個 Servo 的名稱,void setup()

33

中,每個寫入每個定義好的 Servo 名稱並 attach()至相對應的手指,最後設 定 Serial.begin(9600)的傳輸速率。

而 void loop() 的 迴 圈 中 , 將 定 義 好 的 finger 先 歸 0 , 並 將 if(Serial.available() > 0)當作確認有無數據傳入,迴圈內再將 finger = Serial.read ,目的是讓讀取存入 Serial.read 的數據傳入 finger 達到通訊 管理的效果,最後 switch(finger) 讓偵測到的數據能夠做出相對應的指令。

Processing 使用 processing.serial.*及 de.voidplus.leapmotion.*,

接著定義 Serial 的變數名稱以及 LeapMotion 的變數名稱,void setup()之 中定義視窗大小,背景顏色,設定字串 arduinoPort = Serial.list[1],可 利用 printArray(Serial.list())這個指令清楚的知道序列埠的編碼,在將定 義好的 LeapMotion 名稱設定為使用 Leap Motion 中的 Library,最後再將 Serial 定義好的名稱設定序列埠編碼以及傳輸速率。

而最後的 void draw()先後將 for (Hand hand : leap.getHands ()) 、 hand.draw()、 for (Finger finger : hand.getOutstretchedFingers())依 序放入設定一個迴圈,並 switch(finger.getType()),讓伸出的手指受到 Leap Motion 的偵測並傳輸訊息,再設一個相同的迴圈,不過最後改為 for (Finger finger : hand.getOutstretchedFingersByAngel(0)) 且這裡必須再加上 if(finger.isExtended()==false)才能夠進行 switch(finger.getType()),

這樣以來就能夠偵測各個手指的伸直與彎曲,程式碼請參閱附件ㄧ(表 5.7-1 Arduino)與(表 5.7-2 Processing)。

5.8 MQTT 程式碼編輯

在 Processing 中 import Library 來建立 MQTT 與 Leap Motion 的物件,

Leap Motion 使用 de.voidplus.leapmotion 來偵測手指的伸直與彎曲與否, 而 MQTT 利 用 客 戶 端 連 線 、 重 新 連 線 、 訂 閱 、 發 佈 等 指 令 使 用 client.connect("Server","ClientId")及 client.publish("/topic","message")的方式連 接至已架設好的伺服器中,且偵測到手指的動作後應發送的訊息至主題中,

而過程中可以使用手機 APP 連上同一個伺服器的主題,達到監控訊息傳遞的 效果。

而 Arduino,插入 Servo 並建立五個 Servo 物件分別對應手指及訊號腳 位,在收到手指伸直時轉向 5 度,而彎曲時轉向 175 度來控制機械手與自身 的手同步動作, 網路方面插<Ethernet.h> 、<PubSubClient.h>且於 setup 中 寫 入 client.setServer(Server, Port) 、 client.setCallback(callback) 、 Ethernet.begin(mac, ip); 再 依 序 由 ethernet connect 、 Mqtt connect broker、Subscribe to topic、Serial.print message 確認 Arduino 已連上 伺服器,最後 void callback(char* topic, byte*payload, unsigned int length)中將 client.subscribe("/topic")所收到的訊息由 payload[0]的方 式判斷告知 Arudino 中對應的伺服馬達該轉動的度數,進而達到遠端控制機 械手,程式碼請參閱附件ㄧ(表 5.8-1 Arduino)與(表 5.8-2 Processing)。

35

相關文件