本文將帶領讀者認識Arduino/Genunio101的功能,以及如何使用I2C界面來控制機械手臂MeArm、用BLE(Bluetooth Low Energy)來跟手機溝通,並使用MIT App Inventor來撰寫手機的應用程式來跟控制板溝通。
作者/攝影 | 袁佑緣 |
時間 | 3小時 |
成本 | 約1,850(不含101) |
難度 | * * * * * |
材料表 |
|
1.Arduino/Genuino 101 介紹
2015年10月,Arduino與Intel合作發表了一塊名為Arduino/Genuino 101的開發板,使用x86的核心並搭載BLE(Bluetooth Low Energy)以及IMU(Inertial Measurement Unit),也就是內建加速度感測與陀螺儀,而本次範例將使用101上面的BLE功能,如果想要了解IMU在101上面的應用,可以參考部落格上的另外一篇文章[ Arduino101 專題實作計畫] Arduino101二輪平衡小車DIY
101 的詳細規格介紹
2. Arduino IDE 環境準備
首先請到Arduino的官網下載最新版本的IDE,https://www.arduino.cc/en/Main/Software
以筆者為例,最新的Arduino IDE版本是8.3,Windows使用者如果不想要系統安裝Arduino IDE的話,可以直接點選Windows zip的選項,下載後解壓縮,點選裡面的.exe檔也可以直接執行。
打開Arduino IDE後,我們要來安裝最新的101套件包,因為驅動程式也會包含在裡面,所以不需要在額外安裝囉。請打開Tools -> Board -> Boards Manager,並搜尋101,應該就會有最新版本的Intel Curie Boards跳出來,以筆者為例,最新版本為2.0.2版。
接下來因為我們的101在連接到機械手臂之間,會經過一塊16通道的伺服馬達控制板PCA9685,所以我們必須先下載PCA9685的函式庫才能控制我們的伺服馬達。
請到Adafruit的github上面下載Adafruit-PWM-Servo-Driver-Library。
請點選Download,並將下載後的壓縮檔解壓縮後,放到Arduino資料夾裡面的libraries資料夾裡面。
3.硬體電路
接下來請準備好若干條母對公的杜邦線,以及電池提供額外的電源(6v),以防驅動機械手臂時電源供應不足,導致101控制板無法正常運作。
完整的電路接線圖如下,基本機械手臂上的四顆伺服馬達只要把接頭正確的接上PCA9685上就行了,PCA9685上面黑色的部份表示接地線,紅色部份表示電源線,黃色則是訊號線,我們可以透過此腳位輸入PWM訊號來控制伺服馬達。
PCA9685接到101的部份只要把SDA、SCL這兩個腳位接起來,好讓101可以透過I2C來跟PCA9685溝通,另外再接上VCC跟GND以提供PCA9685工作時所需的電壓就行了。
接完之後大概就會如下完成圖,因為這塊伺服馬達控制板的關係,所以我們不需要一塊額外的麵包板跟很多條的杜邦線互相接,是不是很方便啊?
4.Arduino 程式設計
請在Arduino IDE 上面完成以下的程式碼。
程式說明:
以上的程式碼主要會引入兩個函式庫,一個是用來控制馬達的<Adafruit_PWMServoDriver.h>,另一個則是待會要用來跟手機溝通的<CurieBLE.h>,接下來的程式碼就是初始化一個BLE的Service,然後裡面
包一個Characteristic,主要負責來接收手機端傳送過命令。來馬達編號,還有指定的馬達PWM訊號,藉此來操控我們的機械手臂。
在while(central.connected())迴圈當中,101會一直去確認是否有新的訊息送過來,如果有收到訊息,就會把收到的來馬達編號,還有指定的馬達PWM訊號,透過pwm.setPWM(servo_num, 0, pulse_len);來控制指定的伺服馬達,藉此來操控我們的機械手臂。
5.App Inventor 程式設計
App Inventor是一款圖形化的Android App設計界面,只要您有google帳號,就可以直接線上編輯,雲端儲存,還可以打包下載成APK檔,然後傳到手機裡安裝,如果想要知道App Inventor的教學與應用,可以參考App Inventor中文學習網。
接下來我們就要實際動手來寫我們的應用程式了,請先連到MIT App Inventor官網
接下來請新建一個專案,並進到Designer界面,開始進行我們的手機界面佈置。
因為本次專案會用到BLE的元件,所以我們必須用到App Inventor的擴充元件功能,請複製以下的網址http://iot.appinventor.mit.edu/assets/edu.mit.appinventor.ble.aix
並在extension中把BLE元件import進來,如下圖。
接下來請完成以下的元件佈置,其中Slider的最大數值是600,最小數值是150,跟前面Arduino 程式碼裡面定義的一樣,另外Connect按鈕其實是一個清單(而非一般的按鈕元件),按下去之後可以讓使用者去選取要連哪一個藍牙裝置,最下方有一個scan的按鈕,可以用來掃描新的藍牙裝置,掃描附近的裝置後,app就會自動更新清單中可以連線的裝置列表。
接下來我們進到Blocks界面,開始設計我們的後台程式。
首先是初始化以及連線清單的設定,在初始化的過程就會先進行一次掃描的動作,並把掃描的結果更新在清單上,此外,當清單被點選之後,程式就會呼叫BLE元件去連線清單內的指定的裝置。
讀者可能會好奇,其中有一個叫做is_connected的函式,這個自定義的元件是有什麼功能呢?其實它就是會根據是否連接到裝置來做一些按鈕跟拉桿的設定,以及此刻狀態的提示,如下圖。
以下則是基本的連線、斷線功能,以及掃描附近裝置與更新的實作。
接下來的這四個Blocks,讀者可以直接從字面上的意思去解讀他的功能,也就是當編號1到4的拉桿被拖動時,就會執行update_and_send的函式,也就是更新拉桿上面馬達狀態的提示以及送出指定的馬達脈波長度。
update_and_send的實作如下,基本上就是會根據拉桿的位置對應到的數值,送出指定的控制指令,這邊值得注意的是要記得把serviceUuid跟characteriscUuid改成跟前面Arduino程式碼裡面指定的一模一樣喔,不然BLE會無法進行資料的溝通。
到此為止已經大功告成囉,接下來就剩下把App下載到手機上就完成了,您可以點選Build -> App(provide QR code for apk,讓App Inventor把編譯好的程式碼暫時存到雲端,並顯示QRcode,讓您可以掃描它來安裝App。
注意:
由於BLE元件是App Inventor相當新的功能,所以對於一些手機較舊的讀者可能會發現無法安裝或者是無法使用的問題,這只能換更新版本的Android系統或者是看看App Inventor官方未來是否會有相關的計畫來支援舊版本的手機。
相關文章: