モダンOSのお砂場(24) Mbedでmicro:bit、BLEペアリング成功への道

Joseph Halfmoon

前回、Arm社のMbedオンライン環境で、BBC micro:bit用のオブジェクトファイルが生成できることを確かめました。特に MicroBitクラス を使ってプログラムするとMakeCodeエディタのブロックと同等な機能を呼び出すことができるので楽ちんです。今回は早速、主題でありますBluetoothをMbed環境から使ってみましたがペアリングにちょっと手こずりました。

※「モダンOSのお砂場」投稿順Indexはこちら

今回、オンラインのMbed環境でのプログラミングで実現したかった事は、以下の投稿で行ったBluetooth LEDサービスと Buttonサービスの利用実験と「同等」の動作です。

ブロックを積みながら(10) micro:bit、複数BLE serviceの共存の限界

スマホ側の「アプリ」の作成にはお手軽なDroidScriptを使用しました。そのスマホ側のコードは残っています。スマホ側のコードにはまったく手を入れず、micro:bit側だけをMbed環境で「MakeCodeと同等に」再プログラムすればスマホの「アプリ」からmicro:bitを制御できる筈。

英Lancaster大のドキュメントを参照すれば、Bluetooth Low Energy でのサービスの起動は極めて簡単にできます。(ドキュメントページの上部にBluetoothのプルダウンメニューがあり、そこから各BLEサービス毎の説明ページに飛ぶことができます。)プログラムの骨格だけを抜き出せばこんな感じ。

#include "MicroBit.h"

MicroBit uBit;

int main()
{
    uBit.init();
    new MicroBitLEDService(*uBit.ble, uBit.display);
    new MicroBitButtonService(*uBit.ble);
    release_fiber();
}
ペアリングできるよう設定変更

Mbedオンラインコンパイラによるビルドは時間もかからず成功しました。さて「例によって」ですが、micro:bitのフラッシュROMを再プログラミングしてしまったので Bluetooth のペアリング作業を再度実施しないとなりません。まずはドキュメントもちゃんと読まずに、スマホにインストールしてある micro:bit アプリでのペアリングを試みました。「いつもの手順」でペアリングモードには入れるのですが、何度やっても成功しません。そこでLancaster大のドキュメントの中でペアリング関係について記述している読んでみる(いつもながらの泥縄式)と、ペアリングの様子を写したビデオが置いてあるではないですか。早速視聴させていただくと、6桁のPasskeyを使い、Androidの標準機能を使ってペアリングしていました。MakeCodeが生成するオブジェクトとはデフォルト設定が違うのね、という理解をいたしました。そしてビデオを参考にやってみましたがやっぱりダメです。どうもちゃんとBLE通信できていない感じがします。スマホで観察していると micro:bit 側の問題みたいです。どうしたものか。しかし分かっている人は分かっているのでありました。以下のYouTubeビデオは数年前の古いものですが、まさにこの問題に正面から取り組まれています。

Using the ARM mbed IDE to select Bluetooth services to include in your BBC micro:bit application

上記のビデオで、何度もペアリング失敗を繰り返し(まさに私が今やっていた状況とソックリ)ながら、ペアリング成功できるようにビルドの設定を変更していっているのです。設定を変更するためのキモは以下のロケーションにあるヘッダファイル MicroBitConfig.h でした。Thank you very much!

headerfilelocation
MicroBitConfig.hの修正をせずにペアリングに失敗していたとき、micro:bitのLEDマトリックス上に意味不明なパターンが表示されていました。結局、それはメモリ(RAM)的な不足が原因になっているようです。ビデオでは何度もトライして適切な設定にたどりついてました(結論にたどり着くまでちょっと長いです。)が、私は「ビデオの結論」をありがたくそのまま頂戴し、ヘッダファイルの設定のうち以下の行を以下の値に変更してみました。なお「以下の行」はファイルのあちこちに分散しています。またビデオでは他の行も変更しています。

#define MICROBIT_NESTED_HEAP_SIZE 0.50
#define MICROBIT_SD_GATT_TABLE_SIZE 0x700
#define MICROBIT_BLE_DFU_SERVICE 0

ペアリング操作を開始すると、micro:bit上に6桁のPasskeyが、LEDマトリックスの上に1文字毎表示されます。一文字毎短時間で表示が変わっていくので、老人には6桁の記憶が危ういです。また、その場でのスマホ入力も追いつきません。何度か再表示されますがあまり時間をかけると切れてしまうので、最初の周期で3桁記憶して入力、次の周期で残りの3桁、という感じでなんとかOKとなりました。

ペアリングさえできてしまえば、後は何の問題もありませなんだ。作成済のスマホアプリ(DroidScript使用)で動作OK(アイキャッチ画像のとおり。)Mbedのオンライン・コンパイラで生成したオブジェクトでBluetooth使えることが確認できました。

ビルド結果を見るとまだRAMに余裕ありそうです。MakeCodeでは実行時エラーで出来なかった「BLEサービス全部のせ」もできそうな感じです(といって、上記のビデオで既にやられていました。)

モダンOSのお砂場(23) Arm MbedでBBC micro:bitプログラミング へ戻る

モダンOSのお砂場(25) MbedとMicroBit、threadとfiber へ進む へ進む