一、Seeed Studio XIAO nRF52840 Sense
Seeed Studio 推出的 XIAO(小)系列開發板,形同其名尺寸相當小巧,全系列尺寸皆僅 21 x 17.5 mm,比一個十元硬幣都還要小!(°ロ°٥) XIAO 系列有多種 MCU 可以供選擇,包含 SAMD21、ESP32-C3、RP2040、nRF52840 等,其中最讓筆者驚豔的則是 XIAO nRF52840 Sense 這塊開發板了!原因在於其硬體規格和 Arduino Nano 33 BLE Sense 相當接近,同樣具備 IMU 與麥克風但價格僅為後者的四成!這也代表了只要花費更少的錢,就能玩到使用 Arduino Nano 33 BLE Sense 的 TinyML 專案了!
筆者同時將 Arduino 與 XIAO 系列使用 nRF52840 的開發板規格整理如下表,可看到雖然 XIAO nRF52840 Sense 感測器的種類並不如 Arduino Nano 33 BLE Sense,但有經常作為 TinyML 感測的 IMU 與麥克風,同時有電池管理 IC,使其能夠單靠電池進行供電使用,價錢上也相當有競爭力。除此之外也有不含感測器的 XIAO nRF52840,如果是要自己兜感測器與系統的 Maker 也可以參考。
XIAO nRF52840 Sense | Arduino Nano 33 BLE Sense | XIAO nRF52840 | Arduino Nano 33 BLE | |
---|---|---|---|---|
MCU | nRF52840 | nRF52840 | nRF52840 | nRF52840 |
Clock Speed | 64 MHz | 64 MHz | 64 MHz | 64 MHz |
Flash | 1 MB + 2 MB ext. | 1 MB | 1 MB + 2 MB ext. | 1 MB |
RAM | 256 KB | 256 KB | 256 KB | 256 KB |
GPIOs | 11 | 14 | 11 | 14 |
IMU | LSM6DS3TR-C | LSM9DS1 | – | – |
Microphone | MSM261D3526H1CPM | MP34DT05 | – | – |
Gesture, light | – | APDS9960 | – | – |
Pressure | – | LPS22HB | – | – |
Temperature, humidity | – | HTS221 | – | – |
Battery Management | BQ25101 | – | BQ25101 | – |
Price (USD) | 15.99 | 40.5 | 9.9 | 26.3 |
二、怎麼玩?
要使用 Arduino IDE (本篇使用 Arduino IDE 2.1.0 版本為例)開發 XIAO nRF52840 需要在「File」 > 「Preference」 中的 「Additional boards manger URLs」 (額外的開發板網址) 添加 Seeed Studio 開發板支援網址 https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
,之後在「Board Manager」開發板管理側邊欄輸入「nRF」即會出現 Seeed nRF52 mbed-enabled Boards 支援,點選「Install」等待安裝完成。注意這邊不要安裝錯了,否則在後面使用 TensorFlow Lite for MCU 可能會發生編譯不過的情形。
安裝完開發板支援將板子接到電腦,開發板選擇 Seeed XIAO nRF52840 Sense 以及其對應的 COM Port,開啟「Example」> 「01.Basics」 > 「Blink」 直接進行燒錄,藉此即可驗證開發環境已設定無誤。這塊板子上的內建 LED 是一個 RGB 三色的 LED,除了可以使用範例程式碼的定義「LED_BUILTIN」控制紅色 LED,另外兩個顏色還可以分別用「LED_GREEN」與「LED_BLUE」進行控制。
如同 XIAO 系列其他開發板,MCU 用鐵殼包覆住,對於要商品化的用家在無線射頻認證較為友善。兩側引腳扣除電源部分有 11 隻腳可以使用,即使數量不多,但涵蓋各類比與數位腳位,相信也是極為夠用了!
三、第一個 TinyML 實作
拿到 nRF52840 Sense 不玩 TinyML 實在說不過去,筆著自然是依循著 Seeed Studio Wiki 上的教學做一個 TensorFlow Lite for Microcontroller 範例,實作一個姿態識別專案,中間取樣部分有做些微的修改。
step 1: 安裝 Library
首先需要安裝相依的 Library,到 github 的 Seeed_Arduino_LSM6DS3 library 與 tflite-micro-arduino-examples library 專案頁面中,按下「Code」按鈕選擇「Download ZIP」,將整個 Repo 程式碼打包下載。再到 Arduino IDE 中點選功能列的「Sketch」 > 「Included Library」>「Add .ZIP Library…」分別選擇剛剛下載的 ZIP 檔,Arduino IDE 即會自動新增完成這兩項函式庫。
step 2: 截取 IMU 感測資料
開啟範例程式「File」> 「Example」>「Seeed Arduino LSM6DS3」>「IMU_Capture」擷取姿態動作數據,將程式燒錄進去 nRF52840 Sense,當 IMU 感測有動作時,即會連續取樣 120 筆 IMU 感測器的資料並從串列埠吐出。筆者將 nRF52840 用橡皮筋綁在食指的第一個指節,並且在桌板上畫出兩種不同的動作,分別為點擊「click」與左右搖擺手指「wave」的動作。
單一動作感測約莫十來次,將感測數據另存為 .csv 檔案,並在首列一定要是「aX,aY,aZ,gX,gY,gZ」,若缺少需要手動增加上去,否則會無法解析。
step 3: Colab 訓練 TensorFlow Lite for Microcontroller 模型
使用 Colab 開啟模型訓練的 ipython notebook (此腳本是由 Arduino TensorFlow Lite Tutorials 所編寫),將 Setup Python Environment 安裝 tensorflow 套件指令後方指定版本移除。
接著上傳剛剛從 IMU 感測資料,若要辨識n個動作,則會需要上傳 n 個檔案,筆者的範例則是將「click.csv」與「wave.csv」上傳到 colab。
Graph Data 段落會將上傳的 IMU 感測資料以視覺化的方式繪製成圖表,若想要看感測數據有何不同,可以在下圖紅框處修改成不同的 .csv 檔案名稱。
在 Parse and prepare the data 段落會載入所有 csv 檔案的數據資料,在 GESTURES 的陣列內容需要改為剛剛上傳的 csv 檔案名稱(不須副檔名),將所有檔案的列在此陣列內。
完成上述修改後就能續執行各段落程式碼,並且最終會產出一個 tesorflow lite 格式模型與一個 model.h 模型檔,將此檔按下載回本地端電腦開啟,後面將要把此檔案內容套匯入範例程式。
step 4: 將模型載入 XIAO nRF52840 推論
開啟範例程式「File」>「Example」> 「Seeed Arduino LSM6DS3」> 「IMU_Classifier」進行動作識別分類,範例中有一個「model.h」檔案,用剛剛下載的「model.h」內容將其取代,完成後重新上傳到 nRF52840 Sense,在開發板辨識到動作時,將會執行神經網路模型,並且將分類結果透過串列埠顯示。從筆者的結果可以看到,在很粗糙的擷取 IMU 資料情況下,即有相當不錯的辨識結果。若稍微在調整資料的一致性與多樣性,應該就可以達到很好的效果,加以調教整合也許就能變成手勢控制簡報等功能!
四、社群專案
網路上也不少使用 nRF52840 實踐 TinyML 的專案,名為 CiferTech 的 Maker 在 Hackster.io 上發表了一篇實作,使用 XIAO nRF52840 Sense 上的麥克風收音,並且辨識語音單詞,作為機器人動作的指令,整合度相當高,實際動作也相當的有趣。
Seeed Studio 官方 Wiki 上也有一篇教學使用 Edge Impulse 搭配 XIAO nRF52840 Sense 的六軸 IMU,製作一個姿態識別的 TinyML 專案。藉由 Edge Impulse 的工具線上捕捉 IMU 姿態數據並且進行標記與模型訓練,最終將訓練好的模型匯出到 Arduino 的程式碼中進行整合,操作難易度又比 TensorFlow (Lite for micro) 要更容易些!
除了上述之外,在網路社群中不少使用 Arduino Nano 33 BLE Sense 的 TinyML 專案,幾乎都能夠百分之百無痛移植到 XIAO nRF52840 Sense 上,資源算是相對豐富的!
五、小結-適合TinyML新手的入門開發板
社群上使用 nRF52840 這顆 MCU 的 TinyML 應用專案並不算少數,即便說 nRF52840 是玩 TinyML 首選的微控制器也並不為過。而在各廠商推出的開發板中,XIAO nRF52840 又是特別在價格上具有競爭力的板子,對於新手要入門 TinyML 使用,可說是再適合不過了!XIAO nRF52840 除了可以使用 Arduino IDE 開發之外, 同時也支援 CircuitPython 與 MicroPython ,藉由 python 語言進行開發,有興趣的 Maker 也可以玩看看唷!(´▽`ʃ♡ƪ)”