Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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 エラーは解消されませんでした。

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 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等の他のブラウザを使うことで引き続き利用可能です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away