micro:bit 番外編 MakeCode Compassの自動調整

2021.10.27 Coskx Lab  

1 はじめに

MakeCodeで磁気センサを使用すると,プログラム起動時にLED画面に「TILT TO FILL SCREEN」が表示されることがあります。この表示が現れたら,その後に続くLED画面で,micro:bitをいろいろな姿勢にします。全てのLEDが点灯したら,磁気センサの較正(キャリブレーション)が終了し,磁気センサが正しく動作するようになります。(実はそれほど正しいとは限りません。そのことはここでは追求しません。)
一度キャリブレーションが終了すると,同じプログラムでは次回からはキャリブレーションは求められなくなります。
ところで,複数のプロジェクトを試していると,気まぐれのようにキャリブレーションを求められることがあります。キャリブレーションを実行すると,せっかくそれまで採取したデータで調整してきたプログラムが,新たなキャリブレーションで台無しになることがあります。
ここでは,「気まぐれキャリブレーション」を誘発しない方法を考えます。


2 キャリブレーション起動に関する検討

MakeCode初期画面で「新しいプロジェクト」で新しいプログラムA(磁気センサ使用)を作成します。



プログラムAをmicro:bitに転送し,最初に実行したときにキャリブレーションを求められます。(求められないこともあります。)
リセットボタンで再起動してもキャリブレーションは求められません。
プログラムAを修正し,再度micro:bitに転送し実行しても,キャリブレーションは求められません。
「プログラムAを修正し,micro:bitに転送し実行する」作業を何回繰り返しても,キャリブレーションは求められません。

ここで,MakeCodeで「新しいプロジェクト」で新しいプログラムB(磁気センサ使用)を作成し,プログラムBをmicro:bitに転送し,最初に実行したときにキャリブレーションを求められます。(求められないこともあります。)
リセットボタンでプログラムBを再起動してもキャリブレーションは求められません。プログラムBに関する作業をいろいろ繰り返してもプログラムAのときと同じように,キャリブレーションは求められません。

プログラムBを試している段階で再度プログラムAをmicro:bitに転送し,最初に実行したときにキャリブレーションを求められます。(求められないこともあります。)
プログラムAとプログラムBを交互にmicro:bitに転送して実行すると,キャリブレーションを求められます。(求められないこともあります。)

ここまでの経験をまとめると次のようになります。

・磁気センサを使用しているプログラムで一度キャリブレーションが行われると,その結果はmicro:bitに保存されます。
・同じプログラムであれば,その後の実行ではキャリブレーションは求められません。
・しかし,別の磁気センサを使用しているプログラムが実行されると,新たにキャリブレーションを求められることがあります。その時は保存されている以前のキャリブレーション結果は消えて,新しい結果が保存されます。

どのようなときに,キャリブレーションを求められるのか,その規則性は明らかではありません。


3 複製でプログラムを作るとキャリブレーションは求められない

プログラムA(磁気センサ使用)に関する作業を行っていて,すでにキャリブレーションは求められない状態になっているとします。
MakeCode初期画面で「すべて表示する」を開いて,既存のプログラムAを選択し,「複製する」ボタンを選びます。すると,新しいプロジェクト名を求められるので別のプロジェクト名を付けて,これをプログラムCとします。
プログラムC(磁気センサ使用)を適当に修正して,micro:bitに転送し,最初に実行しても,キャリブレーションは求められません。

プログラムAとプログラムCを交互にmicro:bitに転送して実行しても,キャリブレーションは求められません。







ここでの経験をまとめると次のようになります。

・複製で新らしいプログラム(磁気センサ使用)を作った場合,micro:bit舞台裏の「磁気センサキャリブレーション」制御機能から見ると,新しいプログラムには見えず,複製元のプログラムと同じものとみなされます。
そのため,この新しいプログラムが起動してもキャリブレーションは起動しなくなります。複製元のプログラムと,複製から作った新しいプログラムを交互に転送・起動しても,キャリブレーションは起動しなくなります。

4 裏技 キャリブレーションを求められない全く新しくプログラムを作る

プログラムA(磁気センサ使用)に関する作業を行っていて,すでにキャリブレーションは求められない状態になっているとします。
この状況下でプログラムAと交互に転送・起動してもキャリブレーションを求められない全く新しくプログラムを作ることを考えます。
と言っても,複製して,きれいさっぱり最初の状態に戻すだけです。

MakeCode初期画面で「すべて表示する」を開いて,既存のプログラムAを選択し,「複製する」ボタンを選びます。
新しいプロジェクト名を求められるので別のプロジェクト名を付けて,これをプログラムDとします。
これを何も書いてない状態に戻します。
方法1 ブロック表示画面で,全てのブロックを消去します。
    続いて変数に関しても全て消去します。
方法2 JavaScript画面で全てのJavaScriptプログラムを消去します。
    (JavaScript画面で CTRL-A CTRL-X で全消去)
    ブロック表示画面に戻ると,変数も消えています。
何も書かれていない状態になったので,新たなプログラムを作ることができます。

導入した拡張機能も消したい場合は,JavaScript画面に切り替えると,左側のシミュレータの下に,青い「エクスプローラー」というボタンがあるのでこれをクリックすると,下の方に導入した拡張機能が見つかります。
消去ボタン(ゴミ箱)があるので,それをクリックすると拡張機能を消すことができます。




おまけ 見つかった拡張機能をクリックすると拡張機能が展開し,その中にmain.tsというのが見つかるので,それをクリックすると,拡張機能のJavaScriptプログラム(TypeScriptプログラム)を見ることができます。
これを読み解くと舞台裏で何をやっているのかがわかります。

5 まとめ

気まぐれのように思えるキャリブレーションの起動規則を検討しましたが,起動規則ははっきりしません。
「複製」で新しいプログラムを作ると,キャリブレーションがかってに起動することはないようです。(今のところ例外は体験していません。)