2018年9月中旬頃から、MakeCode for micro:bitで作成したプログラムをchibi:bitで動かしたときに、050エラーが発生するようになりました。この問題について気になったので、調べてみました。
この記事は、2018年の9月末の情報です。
2019年12月にポストした解決編もご覧ください。
https://qiita.com/toyowata/items/8301cb8efdbd852741ce
結論
素直に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 エラーは解消されませんでした。
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 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 エラーは、ここで定義されています。
実際にそのエラーコードを発生している場所はこちらです。
microbit-dalのv2.0.0-rc10と、その後にリリースv2.1.0-rc1は、かなりの量の差分があり、細かく調査することはできませんでしたが、おそらくCHANGELOG
に記載されている以下の変更が原因ではないかと思います。
- Autodetection algorithm for I2C based accelerometer/magnetometer sensors.
加速度センサなどのデバイスはchibi:bitでも同じものを使っていると思うので、なぜ実行時に挙動が異なるかは不明です。
もう少し何か分かれば追記したいと思います。
追記
(2018/10/10 追記)
Firefox 62以降でchibi:bit用開発ページは、以下の変更の影響でアクセス出来なくなりました。
Google Chrome等の他のブラウザを使うことで引き続き利用可能です。