microbit
chibibit
MakeCode

chibi:bitの050エラー問題を調べてみた

2018年9月中旬頃から、MakeCode for micro:bitで作成したプログラムをchibi:bitで動かしたときに、050エラーが発生するようになりました。この問題について気になったので、調べてみました。

この記事は、2018年の9月末の情報です。


結論

素直にchibi:bit専用の開発環境を使いましょう。この環境で作成したプログラムでは、050 エラーは出ませんし、特に問題なく動作します。

http://chibibit.io/ide/

追記もご覧下さい。

以下の記事は、私が調べたことを書いただけなので、技術的な興味があれば参考にしてください。


MakeCode のバージョン

MakeCode本家で提供しているサービス https://makecode.microbit.org を使うと、chibi:bitに書き込んだプログラムは実行時に 050 エラーが出て停止します。一方、chibi:bit用のサービス http://chibibit.io/ide/ を使った場合は、特に問題なくプログラムが実行されます。

設定メニュー(歯車のアイコン)から「このアプリについて…」を選択すると、以下のように表示されました。

makecode.microbit.orgのバージョン: 0.13.47

Microsoft MakeCodeのバージョン: 0.14.22
C++ runtimeのバージョン: v2.0.0-rc11

makecode.microbit.orgのバージョン: 0.14.52

Microsoft MakeCodeのバージョン: 0.19.16
C++ runtimeのバージョン: v2.1.0

MakeCodeや、ランタイムで使用されるライブラリのバージョンが異なっているようです。これらのサービスのバージョンをユーザがブラウザ内から直接設定・変更することは出来ないので、別の方法で調べてみます。


DAPLink interface firmware

最初に思いついたのは、DAPLinkファームウェアでした。micro:bitとchibi:bitには、ハードウェア的な差異はほぼ無いはずですが、DAPLink interfaceが異なっているので、最初はこれを疑いました。以下のレポジトリから、最新のリリースを取ってきてchibi:bit用のDAPLink interface firmwareを書き込みましたが、050 エラーは解消されませんでした。

https://github.com/ARMmbed/DAPLink/releases/tag/v0250


C++ランタイム

次にC++ランタイムのバージョンが異なるので、この部分を調べてみました。micro:bitは、microbit-dalというランタイムライブラリを使用しています。これは主に、UKのLancaster大学が開発・メンテナンスしているオープンソースのプロジェクトです。

https://github.com/lancaster-university/microbit-dal

MakeCodeでJavaScriptのプログラムを作る場合も、このランタイムライブラリが使用されます。このライブラリを使ったC++サンプルコードがあるので、それをコマンドラインからビルドしてみます。ビルド環境には、Macを使用しました。

まず、以下の情報を参考にしてビルドツールをインストールします。

http://docs.yottabuild.org/#installing-on-osx

https://lancaster-university.github.io/microbit-docs/offline-toolchains/#installation-on-mac-osx

次に、サンプルのソースコードをダウンロードしてビルドを行います。microbit-dalを含んだ必要なモジュールは、サンプルコードのビルド時にダウンロードされます。

$ git clone https://github.com/lancaster-university/microbit-samples

$ cd microbit-samples
$ yt target bbc-microbit-classic-gcc
$ yt build

ビルドが完了したら、HEXファイルをchibi:bitに書き込みます。

$ cp build/bbc-microbit-classic-gcc/source/microbit-samples-combined.hex /Volumes/CHIBIBIT/

リセットボタンを押してプログラムを起動すると、050エラーが発生しました。

次に、chibibit.io で使用されている C++ランタイムと同じバージョンを使ってみます。エディタで module.json を編集します。

変更前:

"microbit": "lancaster-university/microbit#v2.1.0"

変更後:

"microbit": "lancaster-university/microbit#v2.0.0-rc11”

microbit-dalモジュールは、microbitモジュールからリンクされており、上記設定でmicrobit-dal v2.0.0-rc10が使用されます。

https://github.com/lancaster-university/microbit-dal/releases/tag/v2.0.0-rc10

変更後、再度モジュールをリロードしたいので、ビルドディレクトリとモジュールのディレクトリを削除します。

$ rm -rf rm -rf build/ yotta_modules/

ビルドして、HEXファイルをコピーします。

$ yt build

$ cp build/bbc-microbit-classic-gcc/source/microbit-samples-combined.hex /Volumes/CHIBIBIT/

リセットして実行します。今度は問題なくプログラムが実行され、LEDにHELLO WORLD! :)が表示されました。

これで、問題はMakeCodeとchibibit.io から使われている C++ランタイムのバージョンの差異にあることが推測されます。

因みに、050 エラーは、ここで定義されています。

https://github.com/lancaster-university/microbit-dal/blob/f385db52d5ba32cd7895d7cd2056a7f28e2bb157/inc/core/ErrorNo.h#L87

実際にそのエラーコードを発生している場所はこちらです。

https://github.com/lancaster-university/microbit-dal/blob/14f4c0e64e1e0aa180d7cb478d4f395057c4bb11/source/drivers/MicroBitAccelerometer.cpp#L115

microbit-dalのv2.0.0-rc10と、その後にリリースv2.1.0-rc1は、かなりの量の差分があり、細かく調査することはできませんでしたが、おそらくCHANGELOGに記載されている以下の変更が原因ではないかと思います。

 - Autodetection algorithm for I2C based accelerometer/magnetometer sensors.

https://github.com/lancaster-university/microbit-dal/compare/v2.1.0-rc1...master#diff-d3bb3391c79904494c60ee2ac2f33070R9

加速度センサなどのデバイスはchibi:bitでも同じものを使っていると思うので、なぜ実行時に挙動が異なるかは不明です。

もう少し何か分かれば追記したいと思います。


追記


(2018/10/10 追記)

Firefox 62以降でchibi:bit用開発ページは、以下の変更の影響でアクセス出来なくなりました。

https://www.fxsitecompat.com/ja/docs/2018/application-cache-can-no-longer-be-used-on-insecure-sites/

Google Chrome等の他のブラウザを使うことで引き続き利用可能です。