micro:bit v2 で Bluetooth 5 系の恩恵を受けたいので、S140 を強引につかってみた


micro:bit v2 が2020年11月末に発売されましたね。

せっかく nrf52833 が搭載されているし、Bluetooth 5系の恩恵をうけたいなと思っていましたが、S113(Bluetooth 5 だけどちょっと実装がすくなめ系) が採用されています。microl:bit v2 のデータシート等には S140 対応とかいてあったりもするのに、ちょっと肩透かしをくらった感じです。

各種 commit log をさかのぼってみてみると、S140 でもすすんでいたような開発環境が、リリース直前の 2020年10月ごろに S113 に変更されているようです。

なにか問題があったのか、下位互換を保つためにいったんこの状態となったのか。。。

さて BLE の電波が 1km 届くこともあるかも!? な Coded PHY とか試してみたいなぁと、むりくり S140 をつかってみました。

コンパイル時に、次のレポジトリが利用されているのですが、現時点で S113 が採用されているので、S140 だった時代に戻してみましょう。

このレポジトリを、fork しましょう。

それをてきとうなワーキングディレクトリに、clone してきましょう

$ git clone https://github.com/[YourGitHubName]/codal-microbit-v2.git
$ cd codal-microbit-v2

次のコミットをさかのぼりたいので

現時点では、ファイルの衝突を避けながら、2つさかのぼってみました。

$ git checkout -b s140
$ git revert f828efa6949c50ded757a286768e139887d9f7ca -n
$ git revert a4f0d11558ae195076fb6fe6b291af8bf83733c2 -n
$ git commit -a

こんなかんじで。

どうやら、このへんもさかのぼりたい感じですね。

なので、ここを参照しているところも先に変更しておきましょう。

codal-microbit-v2.git の target.json 内の

--- a/target.json
+++ b/target.json
@@ -68,8 +68,8 @@
         },
         {
             "name":"codal-microbit-nrf5sdk",
-            "url":"https://github.com/microbit-foundation/codal-microbit-nrf5sdk",
-            "branch":"master",
+            "url":"https://github.com/[YourGitHubName]/codal-microbit-nrf5sdk",
+            "branch":"s140",
             "type":"git"
         }
     ]

target-locked.json を

--- a/target-locked.json
+++ b/target-locked.json
@@ -61,10 +61,10 @@
             "url": "https://github.com/lancaster-university/codal-nrf52"
         },
         {
-            "branch": "691869a8261e08b283deb0e2267fae3c00c17dae",
+            "branch": "[your commit id]",
             "name": "codal-microbit-nrf5sdk",
             "type": "git",
-            "url": "https://github.com/microbit-foundation/codal-microbit-nrf5sdk"
+            "url": "https://github.com/[YourGitHubName]/codal-microbit-nrf5sdk"
         }
     ],

に修正します。

コミットして、プッシュしておきましょう。

$ git commit -a -m 'change codal-microbit-nrf5sdk branch'
$ git push --set-upstream origin s140

それでは、codal-microbit-nrf5sdk も fork しましょう。

$ cd ..
$ git clone https://github.com/[YourGitHubName]/codal-microbit-nrf5sdk.git
$ cd codal-microbit-nrf5sdk

このへんをさかのぼる感じかしら

$ git revert 691869a8261e08b283deb0e2267fae3c00c17dae -m 1
$ git push --set-upstream origin s140

ここまで準備ができたら、makecode のコンパイル環境を用意します。

docker が必要なようです。それは適宜おねがいします。

シンプルにするなら、pxt-microbit ってレポジトリをとってくるだけでオッケーです。

このあたりを参考にしてくださいね。

$ npm install -g pxt
$ npm install
$ pxt serve
.
.
.
TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received null

私の環境では、ときどき上記エラーがでて、完了しないこともありました。でうまくうごきませんでした。

npm audit fix などためすと動いたり、やっぱり動かなかったり、node や npm のバージョンをいろいろ変更したりしましたが、これだ!!という解決が見えず。うまくいったり、うまくいかなかったり。。。

あまりにも不安定で、解決が見えないのですが、どうやら本家の環境で頻繁にパッチがあたっているような感じもアリ、それも原因じゃないかなとも感じ、この件についてはいったん調査は終了しました。

さて、本題に戻ります。

pxt-microbit 内の pxtarget.json が、コンパイル時の関連設定ぽいので、ここをいじります。

codal-microbit.git はこのあたりを修正して、s140 ブランチを使うようにします。

--- a/pxtarget.json
+++ b/pxtarget.json
@@ -160,8 +161,8 @@
                 "buildEngine": "codal",
                 "codalTarget": {
                     "name": "codal-microbit-v2",
-                    "url": "https://github.com/lancaster-university/codal-microbit-v2",
-                    "branch": "v0.2.21",
+                    "url": "https://github.com/[YourGitHubName]/codal-microbit-v2",
+                    "branch": "s140",
                     "type": "git"
                 },

さて、うごくかな。

$ pxt build -l

いけたかな。どうかな。どうやらいけたっぽいぞ。

これで、S140 がつかえました!!

そっちのソースコードはたくさんになるので、また別の機会に。

micro:bit v2 から発射されている BLE アドバタイズ をスマホで確認

実はへんなところに落とし穴が。Android め!!

上記の確認は、Pixel 5 という最新 Google 謹製スマホに、nRF Connect という BLE の電波スキャンツールをつかって、micro:bit からだしているアドバタイズ電波の動作内容の確認をしていたのですが、ここにすんごい落とし穴があったのです。

BLEアドバタイズの設定に、Primary と Secondary と2種類あるのですが、なんと、Pixel 5 は Primary に LE Coded PHY な設定がされている電波を認識してくれないという仕様(というかバグというか)があるらしいのです。

これにはなかなか気づけず、micro:bit 側の挙動がおかしいのかと、しばらくはまってしまいました。

プライマリを 1M にして、セカンダリを Coded にすると、無事発見してくれました。

google の issue tracker にも、「なんだよ、くそかよ」みたいな書き込みがみられています(苦笑)

もし、みなさんも、このへんをお試しの際は、スマホ側の仕様についても機種ごとにお気を付けくださいませ。

memo

ローカルビルドの(-l や --local オプションでビルド)、コンパイル環境を docker で自動的に準備してくれて、あれこれ作業する主たるディレクトリは、/libs/blocksprj/built 内のようです。

そのあたりに S140 にへんこうしたファイルとかが設定されていたら、いいかんじです。

TELEC (技適)

この Softdevice 変更は、TELEC認証からはずれる可能性があります。
電波暗室な環境・自己責任で、お試しください。

もし、「SoftDeviceいれかえてもTELEC認証大丈夫だよ」「ぜったいだめだよ」など、そのあたりに詳しいかたいらっしゃいましたら、コメントなどでご教示いただけると助かります。

追記:microbit.org に問い合わせてみました。そのレイヤーについては入れ替えてもTELEC的に問題はないはずだよ。ということでした。nordic について超詳しい方にも念のため聞いてみました。まず問題はないはずということでした。ひとつ勉強になりました。