Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!

一、Seeed Studio XIAO nRF52840 Sense

Seeed Studio 推出的 XIAO(小)系列開發板,形同其名尺寸相當小巧,全系列尺寸皆僅 21 x 17.5 mm,比一個十元硬幣都還要小!(°ロ°٥) XIAO 系列有多種 MCU 可以供選擇,包含 SAMD21ESP32-C3RP2040nRF52840 等,其中最讓筆者驚豔的則是 XIAO nRF52840 Sense 這塊開發板了!原因在於其硬體規格和 Arduino Nano 33 BLE Sense 相當接近,同樣具備 IMU 與麥克風但價格僅為後者的四成!這也代表了只要花費更少的錢,就能玩到使用 Arduino Nano 33 BLE Sense 的 TinyML 專案了!

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
XIAO nRF52840 尺寸比十元硬幣還小!

筆者同時將 Arduino 與 XIAO 系列使用 nRF52840 的開發板規格整理如下表,可看到雖然 XIAO nRF52840 Sense 感測器的種類並不如 Arduino Nano 33 BLE Sense,但有經常作為 TinyML 感測的 IMU 與麥克風,同時有電池管理 IC,使其能夠單靠電池進行供電使用,價錢上也相當有競爭力。除此之外也有不含感測器的 XIAO nRF52840,如果是要自己兜感測器與系統的 Maker 也可以參考。

XIAO nRF52840 SenseArduino Nano 33 BLE SenseXIAO nRF52840Arduino Nano 33 BLE
MCUnRF52840nRF52840nRF52840nRF52840
Clock Speed64 MHz64 MHz64 MHz64 MHz
Flash1 MB + 2 MB ext.1 MB1 MB + 2 MB ext.1 MB
RAM256 KB256 KB256 KB256 KB
GPIOs11141114
IMULSM6DS3TR-CLSM9DS1
MicrophoneMSM261D3526H1CPMMP34DT05
Gesture, lightAPDS9960
PressureLPS22HB
Temperature, humidityHTS221
Battery ManagementBQ25101BQ25101
Price (USD)15.9940.59.926.3
nRF52840 開發板比較表

二、怎麼玩?

要使用 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 可能會發生編譯不過的情形。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
Arduino IDE 2 增加額外開發板支援
Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
安裝 Seeed nRF52 mbed-enabled 開發板支援

安裝完開發板支援將板子接到電腦,開發板選擇 Seeed XIAO nRF52840 Sense 以及其對應的 COM Port,開啟「Example」> 「01.Basics」 > 「Blink」 直接進行燒錄,藉此即可驗證開發環境已設定無誤。這塊板子上的內建 LED 是一個 RGB 三色的 LED,除了可以使用範例程式碼的定義「LED_BUILTIN」控制紅色 LED,另外兩個顏色還可以分別用「LED_GREEN」與「LED_BLUE」進行控制。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
XIAO nRF52840 Sense 板上元件指示

如同 XIAO 系列其他開發板,MCU 用鐵殼包覆住,對於要商品化的用家在無線射頻認證較為友善。兩側引腳扣除電源部分有 11 隻腳可以使用,即使數量不多,但涵蓋各類比與數位腳位,相信也是極為夠用了!

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
XIAO nRF52840 Sense Pinout 引腳圖 (圖片來源: Seeed Studio)

三、第一個 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 即會自動新增完成這兩項函式庫。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
下載相依 Arduino Library
Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
從 Arduino IDE 加入 .ZIP Library

step 2: 截取 IMU 感測資料

開啟範例程式「File」> 「Example」>「Seeed Arduino LSM6DS3」>「IMU_Capture」擷取姿態動作數據,將程式燒錄進去 nRF52840 Sense,當 IMU 感測有動作時,即會連續取樣 120 筆 IMU 感測器的資料並從串列埠吐出。筆者將 nRF52840 用橡皮筋綁在食指的第一個指節,並且在桌板上畫出兩種不同的動作,分別為點擊「click」與左右搖擺手指「wave」的動作。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
IMU 感測食指點擊動作
Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
IMU 感測食指左右搖擺動作

單一動作感測約莫十來次,將感測數據另存為 .csv 檔案,並在首列一定要是「aX,aY,aZ,gX,gY,gZ」,若缺少需要手動增加上去,否則會無法解析。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
分別將感測數據資料儲存為「click.cvs」與「wave.cvs」

step 3: Colab 訓練 TensorFlow Lite for Microcontroller 模型

使用 Colab 開啟模型訓練的 ipython notebook (此腳本是由 Arduino TensorFlow Lite Tutorials 所編寫),將 Setup Python Environment 安裝 tensorflow 套件指令後方指定版本移除。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
刪除 tensorflow 套件指定版本

接著上傳剛剛從 IMU 感測資料,若要辨識n個動作,則會需要上傳 n 個檔案,筆者的範例則是將「click.csv」與「wave.csv」上傳到 colab。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!

Graph Data 段落會將上傳的 IMU 感測資料以視覺化的方式繪製成圖表,若想要看感測數據有何不同,可以在下圖紅框處修改成不同的 .csv 檔案名稱。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
將數據資料繪製成圖表
筆者執行 click 動作的感測數據
Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
筆者執行 wave 動作的感測數據

在 Parse and prepare the data 段落會載入所有 csv 檔案的數據資料,在 GESTURES 的陣列內容需要改為剛剛上傳的 csv 檔案名稱(不須副檔名),將所有檔案的列在此陣列內。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
修改 GESTURES 陣列內容

完成上述修改後就能續執行各段落程式碼,並且最終會產出一個 tesorflow lite 格式模型與一個 model.h 模型檔,將此檔按下載回本地端電腦開啟,後面將要把此檔案內容套匯入範例程式。

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
最終取得 model.h 模型檔

step 4: 將模型載入 XIAO nRF52840 推論

開啟範例程式「File」>「Example」> 「Seeed Arduino LSM6DS3」> 「IMU_Classifier」進行動作識別分類,範例中有一個「model.h」檔案,用剛剛下載的「model.h」內容將其取代,完成後重新上傳到 nRF52840 Sense,在開發板辨識到動作時,將會執行神經網路模型,並且將分類結果透過串列埠顯示。從筆者的結果可以看到,在很粗糙的擷取 IMU 資料情況下,即有相當不錯的辨識結果。若稍微在調整資料的一致性與多樣性,應該就可以達到很好的效果,加以調教整合也許就能變成手勢控制簡報等功能!

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!

四、社群專案

網路上也不少使用 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) 要更容易些!

Maker 玩 AI系列(六):XIAO nRF52840 Sense-入門 TinyML 就靠它!
使用 Edge Impulse 截取與訓練 XIAO nRF52840 TinyML 模型(圖片來源:Seeed Studio

除了上述之外,在網路社群中不少使用 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 也可以玩看看唷!(´▽`ʃ♡ƪ)”