作者/攝影 | 曾吉弘 |
時間 | 2小時 |
成本 |
|
難度 |
★★★★☆ |
材料表 |
|
既然要寫,就都寫吧。日前寫了一篇如何結合 App Inventor 的 PIC 視覺辨識功能與樂高 EV3 機器人,其實都是來自最基礎的水果分類器教學。透過藍牙就可以結合各種機器人平台,當然程式碼根據實際狀況多少會有點不同,但基本架構都是差不多的!今天要說明如何讓 micro:bit 機器人根據App Inventor的辨識結果來執行對應的動作。基礎的 App Inventor 藍牙(BLE) 控制 microbit 文章請按我。
本範例一樣使用 MIT App Inventor 的 Personal Image Classifier 網站來訓練以下三種路牌。請實際印出來並放在之後機器人要執行的環境中來行走,這樣效果會比較好。最後把訓練好的 .model 檔上傳到您的 App Inventor 專案中。離線視覺辨識app 就完成囉!
訓練神經網路
請參考本文 https://blog.cavedu.com/2019/08/27/app-inventor-image-classifier
microbit機器人
在此使用 DFROBOT maqueen 雙輪小車,但其他的雙輪機器人平台,例如登月小車 mooncar,應該都是同樣的作法(請根據選用的平台找到正確的控制指令)。以下是示意圖,還在設計一個合適的手機支架,原來現在手機太大也是個煩惱啊…
App Inventor結合其他開發板的文章請參考:http://www.appinventor.tw/iot
App Inventor端
與Lego EV3 或 Arduino Uno 搭配 HC05 不同,BLE 不需要先配對,直接連線即可。
Designer頁面設定
請由MIT App Inventor 網站下載 personalImageClassifier擴充檔,或由此下載 .aia原始檔。再匯入您的 App Inventor 專案即可。請注意,PIC元件無法像 Sound元件一樣,無法透過程式指令在執行過程中修改所使用的 model (Sound元件可以隨時修改其 Source 來源檔案)
本專案元件說明如下,您之後可以根據個人需要來修改介面配置:
- personalImageClassifier 元件(本文後簡稱PIC元件),別忘了匯入喔
- 一個 Listpicker 來選取 microbit (不需要先配對)
- 一個 中斷藍牙連線的按鈕
- 一個 WebViewer 用來即時預覽相機的畫面
- 切換前後鏡頭的按鈕 (ButtonSwitch)
- 顯示結果用的標籤 (Label_Result)
- microbit_Uart 元件,用於發送訊號給 microbit,需搭配BluetoothLE 元件 (需另外匯入 .aix 檔)
- BluetoothLE 元件,用於進行藍牙通訊 (需另外匯入 .aix 檔)
Blocks
STEP1 PIC元件相關設定
當PIC元件準備完成之後,把在PIC網站上訓練好的模型的 ModelLabel 顯示在Label 上。可以先檢查有沒有匯入錯的辨識模型檔。
STEP2
如果PIC元件發生錯誤的話,把 errorCode 顯示出來
STEP3 BLE 藍牙連線/斷線設定
按下 ListPicker,選擇 micro:bit (從名稱可以看得出來是 microbit),連線成功的話就會讓 Clock 的 timer 啟動來辨識物體。斷線的則一如往常簡單,呼叫 Disconnect 指令就好。
STEP4 連續辨識影像
水果辨識器的做法是按下按鈕才辨識一次,但在此希望機器人能連續辨識來做出對應的粽剁,所以改用 Clock。在此設定 clock 的 Timerinterval 為100,請根據實際狀況來調整這個參數,太快太慢都要拿捏一下。
STEP4 取得辨識結果與信心指數並發送控制字元給 micro:bit
在PIC元件的 GotClassification事件中,所回傳的 result 是 (類別名稱, 信心指數) 的清單,例如 (apple, 0.763)。信心指數原為 0~1之間的小數,在此 x 100 轉換為百分比。
在此先檢查信心指數 (value) 是否大於60,並進一步根據辨識結果來執行對應的動作。在此都是透過 microbit_Uart 元件的 WriteRXCharacteristic (寫入RX字元) 指令送出一個字元與換行符號,例如 “R\n” 或 “F\n”,在此 \n 代表一段指令結果,micro:bit會讀取到 \n 為止。micro:bit 接到指令字元之後就會執行對應的動作。
阿吉老師說:相較於 LinkIt 7697 / Lego EV3 都有對應的 App Inventor 元件,這樣兩邊對應的做法比較瑣碎。
注意,在此使用了 local variable 區域變數 (class, value),如果您覺得不太習慣的話,改用全域變數也可以。
micro:bit端程式說明
STEP1 匯入 maqueen 函式庫
如果要控制 maqueen 小車的話,請在 makecode 網站建立一個新專案,並匯入 maqueen extension,匯入成功會看到 Maqueen IR 與 Maqueen 兩個新的指令集,如下圖
STEP2 開機時啟動藍牙服務
micro:bit 在啟動時會顯示”BLE”訊息提示使用者,並執行藍牙溫度服務與UART服務。在此宣告一個文字變數 RX_Data 來接收從手機發送過來的藍牙訊息。
並在藍牙成功連線與斷線的事件顯示對應訊息 (“C” / “D”)
在此多放一個 Bluetooth temperature sevice 只是放著,說明如果您想要在手機上看到 micro:bit 的溫度感測器值的話就要加這個指令 (延伸閱讀)
STEP3 宣告副函式讓程式更好讀
在 makecode 專案畫面點選 Advanced / Fuctions → Make a Fuction…,可以新增副函式來管理程式碼,由於機器人的動作是由馬達轉向與轉速所決定,因此用副函式來管理會好很多。
新增三個副函式,名稱為 left / right / forward,代表機器人左轉右轉與前進等動作。每個副函式都要新增 lSpeed 與 rSpeed 兩個參數,這樣每次呼叫副函式都可以調整馬達速度,程式的彈性就更高了。
STEP4 根據收到字元執行對應的動作
接下來就是等是否收到新的藍牙訊號,在此以換行符號 (newLine)作區別,並把讀取結果放在 RX_Data 變數中。最後比較變數內容並呼叫對應的副函式並傳入馬達轉宿即可,例如 call forward (200, 200),就是要馬達以 75%的電力轉動,讓機器人前進。請注意,maqueen 小車 motor 指令的馬達轉速範圍為 0- 255 且無法輸入負數,不然其實用同一個副函式搭配不同的馬達轉向轉速就可以讓機器人前進、轉彎與停止等等。
執行畫面
開啟程式會直接開啟相機鏡頭並顯示於app中的 WebViewer元件,隨後會看到 ModelLabel (模型可分辨的影像類別)。點選 Listpicker 來選取您的 micro:bit (如下圖中的 D9:D6: … 這個裝置),連線成功之後機器人就會開始移動。沒看到路牌就會前進,如果看到路牌就會執行對應的左轉、右轉與停止等動作,一起來玩玩看吧!
相關連結: