🌀

XIAO BLEをArduino開発するときの2種のボードライブラリの違い

2023/01/11に公開

https://wiki.seeedstudio.com/XIAO_BLE/

Seeed Studio XIAO nRF52840 assembles many functions in one tiny board and sometimes may not perform the best of them. Hence, Seeed has published two Arduino libraries to let it maximum the power of each function.

翻弄されたのに他に困ってそうな人をあまり見かけなかったのでメモ。

いろいろな経緯があって2分化したのだと思うけど、どの機能を優先的に使いたいのかによって現状いずれか1つのライブラリを選ばなければならず、できるだけ多くの機能を使おうとするとけっこうな苦難を強いられます。ので参考用に、自分で試してわかった範囲だけ書いてみています。

https://forum.seeedstudio.com/t/xiao-ble-sense-cannot-communicate-with-imu-sensor/265629/2

I think that the XIAO BLE boards are terrific pieces of hardware, but the Seeed development software releases are VERRRRRY frustrating.

同意しかない

ピン定義一覧

同じ定数名なのに定義されているピン番号がそれぞれのボードライブラリで異なっているものがある点に要注意

ピン番号 共通 nRF52 Boards mbed-enabled Boards
0 (2) PIN_A0 A0 D0 P0_02
1 (3) PIN_A1 A1 D1 P0_03
2 (28) PIN_A2 A2 D2 P0_28 PIN_SPI_SS SDCARD_SS_PIN SS
3 (29) PIN_A3 A3 D3 P0_29
4 (4) PIN_A4 A4 D4 PIN_WIRE_SDA SDA P0_04
5 (5) PIN_A5 A5 D5 PIN_WIRE_SCL SCL P0_05
6 (43) D6 PIN_SERIAL1_TX P1_11 PIN_SERIAL_TX LED_BLUE PIN_VBAT
7 (44) D7 PIN_SERIAL1_RX SS P1_12 PIN_SERIAL_RX
8 (45) D8 PIN_SPI_SCK P1_13 SCK
9 (46) D9 PIN_SPI_MISO P1_14 MISO
10 (47) PIN_SPI_MOSI P1_15 MOSI
11* (26) LED_BUILTIN LED_RED P0_26 LEDR
12* (6) LED_BLUE P0_30 LEDG
13* (30) LED_GREEN P0_6 LEDB
14* (14) VBAT_ENABLE P1_8 PIN_LSM6DS3TR_C_POWER
15* (40) PIN_LSM6DS3TR_C_POWER P0_27 PIN_WIRE_SCL1
16* (27) PIN_WIRE1_SCL P0_7 PIN_WIRE_SDA1
17* (7) PIN_WIRE1_SDA P0_11 PIN_LSM6DS3TR_C_INT1
18* (11) PIN_LSM6DS3TR_C_INT1 P1_10 PIN_PDM_PWR
19* (42) PIN_PDM_PWR P1_0 PIN_PDM_CLK
20* (32) PIN_PDM_CLK P0_16 PIN_PDM_DIN
21* (16) PIN_PDM_DIN P0_13
22* (13) P0_17
23* (17) P0_21 PIN_QSPI_SCK
24* (21) PIN_QSPI_SCK P0_25 PIN_QSPI_CS
25* (25) PIN_SPI1_MISO PIN_QSPI_CS P0_20 PIN_QSPI_IO0
26* (20) PIN_SPI1_MOSI PIN_QSPI_IO0 P0_24 LED_RED PIN_QSPI_IO1
27* (24) PIN_QSPI_IO1 P0_22 PIN_QSPI_IO2
28* (22) PIN_QSPI_IO2 P0_23 PIN_QSPI_IO3
29* (23) PIN_SPI1_SCK PIN_QSPI_IO3 P0_9 D29
30* (9) PIN_NFC1 P0_10 LED_GREEN D30
31* (10) PIN_NFC2 P0_14
32* (31) PIN_VBAT P0_31
  • ピン番号の * …… 内部でセンサ等に接続されておりGPIOとしては利用できない
  • LED_RED LED_GREEN LED_BLUE はいずれのライブラリでも利用でき、それぞれ赤緑青と正しい色のLEDを制御できるが、それぞれのライブラリで内部的な数値定義は異なっていることに注意
    • アノードコモンのフルカラーLEDのため各端子はカソードに接続されており、よって点灯の際は digitalWrite(LED_RED, LOW) 消灯の際は digitalWrite(LED_RED, HIGH) となることにも注意

mbed-enabledでないほうが VBAT_ENABLE 以降ズレているのでは……? と思い修正してみましたが逆に動かなくなったライブラリがありました。
上記の表は基本的に variant.h を見ながら書いたものです。それ以外のファイルでピン番号そのものが別の番号として定義されている箇所があろうと思われますが、当方Arduinoのボードライブラリの構成に関しての知識が足りないため、ここではこれ以上追求しないことにします。(パッと見はズレているがこれで正しい

Seeed nRF52 Boards

IDE

  • Arduino IDEの2系ではPythonのClickがコンパイル時に内部的にエラーを出すバグのため使えない

https://www.bioerrorlog.work/entry/click-runtime-error

  • 1系では問題なく使える

BLE

  • Adafruit製Bluefruitライブラリを利用
  • バッテリ残量など、定番のサービスがいくつかビルトインされていて手軽に呼び出せたり、アドバタイズ間隔を細かく調整できたりと比較的高機能
  • FreeRTOSベースのためイベント駆動が基本
  • スケッチ例がとにかく多くて助かる
  • ただしクセが強い(青色LED制御が奪われたりする)
    • Bluefruit.autoConnLed(false) でLEDを取り返せる

ファイルシステム(不揮発性メモリ)

  • Adafruit_LittleFS をラップした InternalFileSystem というものが利用可能
  • クセが強い(file.write() 終了後に赤色LEDが点灯する)

スリープ

  • 公式Wikiの Power Consumption Verification の項を参照

https://wiki.seeedstudio.com/XIAO_BLE/#power-consumption-verification

  • こちら側のライブラリを使ったうえで、スケッチ例にも載っていない以下のサンプルを動かして確認せよとのこと

https://github.com/0hotpotman0/BLE_52840_Core/blob/main/libraries/Bluefruit52Lib/examples/Hardware/deep_Sleep/deep_Sleep.ino

  • 実際にはまだ試してないけど flash.deepPowerDown()sd_power_system_off() あたりのAPIがdeep sleepに関係してそう

6軸IMU(Sense)

  • そのままではまともに使えない(ボードライブラリ内のexampleにもない)
  • Seeed Arduino LSM6DS3 はコンパイルは通るけど実際には値を取得できない
    • The IMU function will perform better when we use the "Seeed nrf52 mbed-enabled Boards Library", so we highly recommon that.

      公式Wikiにはこのように書かれているが、素の Seeed nRF52 Boards ではbetterどころか何のパフォーマンスもしないので要注意

  • Seeed Arduino LSM6DS3 を使う場合は 「LSM6DS3.cpp」内の WireWire1 に置き換えると動作するのを確認
    • 若干気持ち悪いので自作ライブラリとしてコピーして書き換えるのがおすすめです
      以下出典

https://forum.seeedstudio.com/t/xiao-ble-sense-cannot-communicate-with-imu-sensor/265629/13

It may not be the right way, but I am using the IMU implemented in “Seeed XIAO nRF52840 Sense” on “Seeed nRF52 Borads 1.0.0” (non mbed) in the following way

Board library: Seeed nRF52 Borads 1.0.0 (non mbed)
Board : Seeed nRF52 Borads / Seeed XIAO nRF52840 Sense
IMU library: Seeed_Arduino_LSM6DS3
–>Replace “Wire” in LSM6DS3.cpp with “Wire1”.
“#define Wire Wire1” does not work as expected, so I rewrote Wire to Wire1.

  • Arduino_LSM6DS3 という汎用ライブラリでは動作せず(試していないが上述の Wire1 書き換えを行えば動くのではないか)

PDMマイク(Sense)

  • APIは同じで内部的に若干異なるライブラリ
  • スケッチ例が1つだけある

その他

  • Adafruit_TinyUSB.h をインクルードしていないとシリアルを使っていなくてもなぜか main.cpp でシリアルがないよ!とかいうエラーが出てしまう
    • Arduino IDE 1.8.19 で確認
    • 一部スケッチ例ではライブラリの内部でインクルードされているのでメインではインクルードしてなくても動作するのを確認
  • シリアルを利用する場合は以下のように yield() で接続を待ってあげる必要あり(RTOSが走っているため delay() なんかだとシリアルと同じスレッドで効いてくれない気がする)
    Serial.begin(115200);
    while (!Serial) yield();
    Serial.println("Hello");
    

Seeed nRF52 mbed-enabled Boards

IDE

  • Arduino IDEの1系でも2系でもどちらでも動く

BLE

  • ArduinoBLEを利用
  • APIがわかりやすく、慣れている人にとっては使いやすい
  • loop() 内で BLE.poll() を呼び出す必要があるなど、レガシーな設計

ファイルシステム(不揮発性メモリ)

  • Spi_Flush というライブラリフォルダっぽいものがボード定義の中にあるけど実際にライブラリは無く、スケッチ例だけが残っている

https://github.com/Seeed-Studio/ArduinoCore-mbed/tree/master/libraries/Spi_Flash

  • arduino/ArduinoCore-mbed からForkしたライブラリだけどオリジナルのリポジトリには跡形も残ってない
  • なのでボード選択時にこんなエラーが出る:
    Invalid library found in /Users/*****/Library/Arduino15/packages/Seeeduino/hardware/mbed/2.9.0/libraries/Spi_Flash: no headers files (.h) found in /Users/*****/Library/Arduino15/packages/Seeeduino/hardware/mbed/2.9.0/libraries/Spi_Flash
    
  • かろうじて使えるものを探すなら以下のライブラリがある(一応使えた)

https://github.com/khoih-prog/FS_Nano33BLE

  • ただしなぜか昨年末でアーカイブされてしまっている
  • スケッチ例では正常に動くが、手元でArduinoBLEなどと組み合わせた自前のスケッチを作成して書き込むと何かのはずみでLittleFSがブートローダ領域にはみだしてしまい文鎮化する(自分の設計が悪いのだとは思っているが……)

スリープ

  • スケッチ例を見る限りではこちら側のライブラリで使えるAPIは無さそう

6軸IMU(Sense)

  • Seeed Arduino LSM6DS3 がボードライブラリ内にデフォルトで組み込まれている

https://wiki.seeedstudio.com/XIAO-BLE-Sense-IMU-Usage/

  • Arduino_LSM6DS3 という汎用ライブラリでは初期化に失敗する

PDMマイク(Sense)

  • APIは同じで内部的に若干異なるライブラリ
  • スケッチ例が2つある

その他

  • Arduinoファミリーの扱いに慣れた人であればこちらの mbed-enabled のほうがだいぶんマトモなので強くおすすめ

Discussion