--- tags: 伴伴學共創專案 --- # 伴伴學:BW16 + Mqtt + Mearm 教案開發 ## 簡介 開發新教案需要火力支援~ 過一段時間要來做親子動手做的科技共學工作坊,因此想來設計一個可以跟物聯網相關的有趣學習內容,所以就有了 bw 16 + mqtt + mearm 的學習目標想法。 之前的工作坊結束後有多一些材料出來,所以我手上有多兩套套件(bw 16 + mearm )可以贈送,想要尋找懂 mqtt 與arduino 的夥伴一起玩與學習,希望可以找到找到人一起協助我開發教案,最後會註明參加者名字,教案完成後會上傳到伴伴學 github ,用開源來分享。 ## 參與設計者: joe will eric 學健 ## 時間 線上伴伴學重點: * 線上交流學習的方法 * 提醒資訊安全 早上八點到下午五點 早上 * 安裝與校正機械手臂 * 有線搖桿控制 * 創意挑戰~(想想看我能拿機械手臂做什麼?) 下午 * 修改一些參數 * 無線遙控 * 創意提案分享 架構: * 手機/電腦 ---> mqtt ---> Mearm 機械手臂 * 手機/電腦 ---> bw16 (ap)---> Mearm 機械手臂 ## 教學 [meArm 組裝教學](https://content.instructables.com/ORIG/FE6/5Q5C/INPE4UPD/FE65Q5CINPE4UPD.pdf) https://www.slideshare.net/beyond-coding/microbit-v02-126322237 ## 工具 [mqttgo.io](http://mqttgo.io) 夜市小霸王佛心建立~ 直接輸入位址:mqttgo.io,port:1883 即可享用以 hivemq 所架設的最新最快的 mqtt broker,完全免費~以後也不會收費。 [MQTT – 1. 使用免費公開的 MQTT Broker Server 學習如何訂閱、發行(收發資料)](https://blog.hoyo.idv.tw/?p=7618) ## 材料 mearm ## 參考資料 [改造開源機器手臂meArm〈硬體篇〉](https://pansci.asia/archives/87384) MQTT [MQTT - 設置 MQTT 客戶端與 Broker 通信](https://www.amebaiot.com/zh/amebad-arduino-mqtt-upload-listen/) [MQTT – 1. 使用免費公開的 MQTT Broker Server 學習如何訂閱、發行(收發資料)](https://blog.hoyo.idv.tw/?p=7618) web [ESP32 Multiple Sliders WebSocket Web Server – PWM Control LEDs Brightness](https://microcontrollerslab.com/esp32-multiple-sliders-websocket-web-server/) [網頁控制LED燈](https://sites.google.com/site/arduinochutiyan/home/esp32/網頁控制led燈) [Google Blockly積木愛玩 臉書社團](https://www.facebook.com/groups/975520919696750) app [BLE Terminal、BLE JoyStick,超好用App,讓iPhone、Android都能控制Arduino](https://blog.jmaker.com.tw/arduino-ble-app/) Dabble - Bluetooth Controller * https://thestempedia.com/product/dabble/ * https://thestempedia.com/docs/dabble/getting-started-with-dabble/ * ios https://apps.apple.com/tw/app/dabble-bluetooth-controller/id1472734455 * Android https://play.google.com/store/apps/details?id=io.dabbleapp&hl=zh_TW&gl=US * 教學 https://sites.google.com/site/wenyuwebbit/11-使用pictoblox積木/03-藍牙連線dabble-app * joe 爸移植 [Porting Dabble to RTL8720 (AmebaD)](https://github.com/jojoling/DabbleAmebaD) 把這2行 UartService.addCharacteristic(Rx); UartService.addCharacteristic(Tx); 改成: UartService.addCharacteristic(Tx); UartService.addCharacteristic(Rx); 就好了。 被它玩了2天。 ``` /* Gamepad module provides three different mode namely Digital, JoyStick and Accerleometer. You can reduce the size of library compiled by enabling only those modules that you want to use. For this first define CUSTOM_SETTINGS followed by defining INCLUDE_modulename. Explore more on: https://thestempedia.com/docs/dabble/game-pad-module/ */ #include <AmebaServo.h> #define SERVO_LEFT 0 //8 PA26 #define SERVO_RIGHT 1 //7 PA25 #define SERVO_STATION 2 //12 PA12 #define SERVO_HEAD 3 //11 PA13 int servo_pin_map[4] = {PA26,PA25,PA12,PA13}; int pos[4] = {90,90,90,0}; AmebaServo myservo[4]; #define CUSTOM_SETTINGS #define INCLUDE_GAMEPAD_MODULE #include <DabbleESP32.h> void do_action(int index, int value) { if(value > 0 && pos[index]<180) { pos[index]++; } else if(value<0 && pos[index]>0) { pos[index]--; } myservo[index].write(pos[index]); } void setup() { // put your setup code here, to run once: Serial.begin(115200); // make sure your Serial Monitor is also set at this baud rate. Serial.println("Init BLE bluetooth & servo."); Dabble.begin("Ameba_mearm"); //set bluetooth name of your device for(int i=0;i<4;i++) { myservo[i].attach(servo_pin_map[i]); myservo[i].write(pos[i]); } } void loop() { Dabble.processInput(); //this function is used to refresh data obtained from smartphone.Hence calling this function is mandatory in order to get data properly from your mobile. //Serial.print("KeyPressed: "); if (GamePad.isUpPressed()) { Serial.print("Up"); do_action(SERVO_RIGHT,1); } if (GamePad.isDownPressed()) { Serial.print("Down"); do_action(SERVO_RIGHT,-1); } if (GamePad.isLeftPressed()) { Serial.print("Left"); do_action(SERVO_STATION,1); } if (GamePad.isRightPressed()) { Serial.print("Right"); do_action(SERVO_STATION,-1); } if (GamePad.isSquarePressed()) { Serial.print("Square"); do_action(SERVO_HEAD,-1); } if (GamePad.isCirclePressed()) { Serial.print("Circle"); do_action(SERVO_HEAD,1); } if (GamePad.isCrossPressed()) { Serial.print("Cross"); do_action(SERVO_LEFT,1); } if (GamePad.isTrianglePressed()) { Serial.print("Triangle"); do_action(SERVO_LEFT,-1); } if (GamePad.isStartPressed()) { Serial.print("Start"); } if (GamePad.isSelectPressed()) { Serial.print("Select"); } /* Serial.print('\t'); int a = GamePad.getAngle(); Serial.print("Angle: "); Serial.print(a); Serial.print('\t'); int b = GamePad.getRadius(); Serial.print("Radius: "); Serial.print(b); Serial.print('\t'); float c = GamePad.getXaxisData(); Serial.print("x_axis: "); Serial.print(c); Serial.print('\t'); float d = GamePad.getYaxisData(); Serial.print("y_axis: "); Serial.println(d); Serial.println(); */ delay(20); } ``` Dabble V7RC 隨時可以用手機控制你的遙控模型 * ios https://apps.apple.com/tw/app/v7rc/id1390983964 * android https://play.google.com/store/apps/details?id=com.v7idea.v7rcliteandroidsdkversion&hl=zh_TW&gl=US * [V7RC APP與裝置間的通訊協定Protocol](https://v7idea.blogspot.com) * ios 不給 2.0 連,所以大部份是 android,除非是 BLE 才能 ios android,但是 uno+hc05 06 是2.0 * V7RC 用BLE傳輸時,需要設備廣播通用的UART SERVICE UUID,連接後會直接在RX Characteristic 採用write without response(write command)的方式持續送資料 * ESP32的UART範例缺少廣播UART UUID * BLEDevice::getAdvertising()->addServiceUUID(SERVICE_UUID); * BW16的UART範例缺少write without response * Rx.setWriteNRProperty(true); ## 實作 MJLiao : app Inventor 弄一個mqtt app 連到網頁上小霸王的broker 控制 mearm [Ameba_BW16_robot_arm](https://github.com/ESPGyro/Ameba_BW16_robot_arm) Mason 製作,使用 Ameba BW16 晶片的 A1 Gyro 開發板來控制五軸的機械手臂。 [V7RC測試程式 by Will](https://github.com/be1ieve/mearm_bw16/) ## 問題 A1 Lite ameba bw16 只有三個類比,所以要改善這狀況。 提案: * 用 [Arduino JoyStick Shield](https://shopee.tw/►285◄-Arduino-JoyStick-Shield-遊戲搖杆-擴展板-類比鍵盤-滑鼠功能-i.4877344.64927163) 來修正。 (採用) * 夾住的功能用按鍵來取代。按下就夾住,放開就不夾。 * 換開發板 Ameba RTL8722DM mini Board (AMB 23) ![](https://i.imgur.com/s0FmchV.png) 紅色部分需要修改比較長一點。 ## 給參加活動的學員的信 各位學員大家好,非常感謝你們報名參加這次的活動,讓我們伴伴學社群有機會跟你們分享:透過陪伴學習科技是最有效與有趣的方式。 在這次工作坊開始之前,需要大家親子彼此陪伴去完成這以下的任務: 1. MAC 或是 windows 10 筆電,筆電需有至少兩個空閒的A type usb 3.0 ,使用hub 或本體端口皆可。 2. 下載與安裝 arduino ide 1.8.19 * https://www.arduino.cc/en/software 3. iphone ,安卓(優先)手機或平板 4. 安裝並運行 Dabble - Bluetooth Controller * ios https://apps.apple.com/tw/app/dabble-bluetooth-controller/id1472734455 * Android https://play.google.com/store/apps/details?id=io.dabbleapp&hl=zh_TW&gl=US * 啟動 app ,打開 gamepad ,然後截圖寄回給我們確認。 5. 安裝並運行 V7RC * ios https://apps.apple.com/tw/app/v7rc/id1390983964 * android https://play.google.com/store/apps/details?id=com.v7idea.v7rcliteandroidsdkversion&hl=zh_TW&gl=US * * 啟動 app ,然後截圖寄回給我們確認。 希望以上任務你們可以順利完成,如果遇到問題有沒關係,我們在活動的前一天晚上會有一個線上社群聚會,這個活動是想跟大家分享如何有效與友善的透過社群的方式來進行科技學習,所以在這過程中也會陪伴大家討論與解決所遇到的問題。 11/05 20:00 線上活動 伴伴學:陪大家學習社群學習 活動連結: https://discord.gg/aQHA2zeBzR 最後再次提醒大家,11/06 的工作坊, 時間:9:00 開始 地點:新竹高鐵百人教室A教室(新竹縣竹北市文興路一段273號2樓) 中餐請自行安排。 讓我們一起完成這次的工作坊,一起陪伴共學,共同完成無線控制機械手臂計畫!把伴伴學的社群學習力帶回家~ ## 工作坊套件內容 ### 材料 * mearm 機械手臂組 * bw16 開發板 * 機械手臂擴充板 * 18650 充電器 * 18650 電池兩顆 * 18650 電池盒 * type c 線 * 搖桿 * 從 a 搬到 b 的圖 * 跳棋 ### 工具 * 十字起子 * 尖嘴鉗 * 美工刀 * 螺絲對照圖 ### 證書 * 最佳伴伴學學友 * 完成機械手臂挑戰 ## 競賽獎項 最佳組裝獎 最會疊疊樂獎 問題多多不放棄獎 ## 時間 這個計劃怎麼開始的?當時想像中要做的事情是甚麼?用 app 控制機械手臂? 然後你是怎麼「規劃」的?像是你上面的堅持 1~5 點,然後你怎麼思考這個要找誰?那些人又怎麼參與討論,和怎麼把各自做的事情接合在一起的? 這些「前傳」是 build 一個 system 需要知道的事情,非常重要。工作坊如果只是領到材料跟著做出來,沒有接觸到這些事情的話,有點可惜。 https://www.facebook.com/honki/posts/pfbid0Ei6WVYHhXqSnNt77D9uoQt2aRnETaMYria4zFGdouQMgSXoQzERzV7eZkcfwrd4Hl?locale=zh_TW ## 這次工作坊使用 [Ameba] A1 PICO / RTL8720DN (BW16) 作為課程用開發板所遇到的問題 ### 簡介 11/06 的工作坊使用的是 Kevin 所設計的 [[Ameba] A1 PICO / RTL8720DN (BW16) 開發板](https://www.makdev.net/2021/09/ameba-ameba-bw16-arduino-ide.html),以此為中心,透過無線訊號來連接 [mearm 開源機械手臂](https://create.arduino.cc/projecthub/benbobgray/mearm-robot-arm-your-robot-v1-0-326702)。在這部分將開發過程所遇到的狀況整理與分享。 ### 課程規劃 原本的課程規劃,教學是先以有線控制機械手臂為開始,說明 pwm 控制的原理。然後再來以無線訊號來控制,說明物聯網的原理。採用機械手臂這有趣的主題為開頭,來引導學員深入課程想要給予的內容。但是遇到時間的限制(一天為限)與開發過程遇到的問題來修正,最後課程內容確定為: * 以 手機 app v7rc 來遙控以[Ameba] A1 PICO / RTL8720DN (BW16) 開發板為核心的 mearm 機械手臂。 ### 開發遇到的問題 * 為了線控機械手臂的教學部分,直接採用已經很成熟的開源計畫,以 arduino uno 為核心的機械手臂套件組,這套件組中採用了一個整合搖桿的擴充板 mearm ps2 joystick。最初是要用跳線的方式連結 A1 PICO 與 mearm ps2 joystick (雙搖桿會用到四個 VR),進而控制機械手臂。但是就遇到 ADC 腳位不足的狀況(只有 3 pin ADC input),後來經過伴伴學社群大家的討論,有找出資料來去改,把原本的隱藏的 ADC 腳位釋放出來,但是不想在教學內容中放入太過複雜的技術部份,在加上課程時間有限,於是就放棄這個作法。以下是當初討論要把 ADC 釋放出來的討論: * variant.h 把A0 A1變出來可以更方便取用,不過原本的直接PB1 PB2 或甚至4 5也可以。瑞昱搞這麼多重複的定義不知道在幹麻。 varient.cpp 那邊的 PIO_ADC,我的 linux 3.1.3版連 PB_3都拿掉了。我猜是他們是把 ADC 檢查的部份錯殺了,可以先不改直接呼叫,不行再加上去。 -來自 will 的猜測。 * 為了無線控機械手臂的教學部分,一開始強調物聯網為主題,所以選擇以 MQTT 的方式來做無線的控制。社群好朋友 MJLiao 提供了他的做法: 1. 用 app Inventor 做一個 mqtt APP 2. 連到網頁上小霸王的 broker 控制 mearm 。 這個做法因為要自己做一個 mqtt app ,加上 app Inventor 在 apple 手機上執行有點糟糕,個人非常擔心無線訊號的傳輸問題,所以放棄這個做法。 * 為了無線控機械手臂的教學部分,第二個方案是用現成的手機 APP 去做無線控制。大量 google 閱讀資料後,找出最適合這次課程的兩個 APP ,一個是外國開發的 Dabble - Bluetooth Controller ,一個是台灣所開發的 V7RC ,都是可以免費下載。Dabble 是教育相關單位為了 STEAM 教育所發展出來的,函式庫只支援 arduino 與 esp32 等,最後專案維護時間停在2019。伴伴學社群中的 joe 貢獻把 Dabble 函式庫移植,變成可支援 BW16 ,請見: [Porting Dabble to RTL8720 (AmebaD)](https://github.com/jojoling/DabbleAmebaD) ,不過移植的部分只有 gamepad 功能。但是這隻 APP 對於 Apple 的手機支援有點問題,所以在課程的最後一刻就放棄使用。 第二個 APP 是 V7RC ,由 will 在搞清楚 [V7RC APP與裝置間的通訊協定Protocol](https://v7idea.blogspot.com) 後,完成對 BW16 的連接,實作計畫請見:[V7RC測試程式 by Will](https://github.com/be1ieve/mearm_bw16/)。 V7RC 在 android 與 apple 手機上是最沒有問題的(該開發團隊持續在更新與維護中),BLE 訊號的控制也沒有任何奇怪的狀況,更重要的是不像 Dabble ,需要額外再安裝函示庫。基於這幾點,最後在這次的課程就採用這個 APP 來作為課程學習。以下是在連結上過程中遇到的狀況與紀錄: * V7RC 用BLE傳輸時,需要設備廣播通用的UART SERVICE UUID,連接後會直接在RX Characteristic 採用write without response(write command)的方式持續送資料 * ESP32的UART範例缺少廣播UART UUID * BLEDevice::getAdvertising()->addServiceUUID(SERVICE_UUID); * BW16的UART範例缺少write without response * Rx.setWriteNRProperty(true); ## 小結 這次的課程的設計與開發算是相當幸運的,因為很早就拿到 Kevin 所設計的開發板,有比較多的時間可以執行。也找到對此有興趣的社群朋友一起開發課程(機械手臂是個有趣吸引人的專案)除了joe 與 will 外,還有 [Ameba_BW16_robot_arm](https://github.com/ESPGyro/Ameba_BW16_robot_arm) 由 Mason 製作,使用 Ameba BW16 晶片的 A1 Gyro 開發板來控制五軸的機械手臂。 過程中有人貢獻了不同方式的控制測試,例如藍芽、mqtt 等。也投入時間去設計專門給 BW16 的擴充板,也移植了多個支援藍芽控制的手機函式庫。以下總結列出使用 BW16 在這次機械手臂課程開發的問題: 1. ADC 不足,雖然後來有找到可以從底層去改,但是有點麻煩。 2. 手機 APP 的藍芽遙控函式庫資源少,需要自行開發移植。 3. 擴充板資源少,需要自設計與生產。 以上這些問題都大幅度的增加設計與開發課程的時間成本和難度,而關於擴充板是個明顯的問題,所以有 Kevin 也感受到這狀況,因此正在設計[[Ameba] RTL8720DN /BW16 二合一擴充板 Shield](https://www.makdev.net/2022/09/ameba-bw16-type-c-shield.html),開發的目的是希望在實做Iot 應用作品時,可以很輕鬆的接入各種感測器及模組。並全力專心在程式開發上,減少在接線錯誤造成開發時間延宕。且同時保有擴展性,保留排針排及使用 Grove 連接器,使開發板增加擴展性。