BBC micro:bitを「ビジュアル」プログラムするのにMakeCodeエディタを使っています。気になっていたものにSimulatorがあります。LEDを操作するようなブロックを積むと勝手にそれが光る様子を画面で再現してくれるアレです。意図的に止めなければ漏れなくいつも動作中。でも使い方、よくわかりません。どこまでシミュレートしてくれるの?
※「ブロックを積みながら」投稿順 index はこちら
Microsoft MakeCodeエディタを開くと画面の左上にmicro:bitの「絵」があり、右面でプログラムを編集していくとそれに反応して「動き」ます。これがシミュレータの「顔」。現物micro:bitにプログラムを書き込まなくても動いた雰囲気が分かるもの。面白いのだけれど、何がどこまで使えるのか?Microsoft MakeCode for micro:bit のSimulatorに関する説明文書(これが公式なんだと思う)は以下にあります。
いろいろ使い方が書いてあるんじゃないかと思って見にいってちょっとガッカリです。もっと別なところに詳細なドキュメントがあるのか?見つからないので、以下は当方が勝手にMakeCodeエディタ上で試行錯誤して「経験」した結果をまとめたものであります。
シミュレータの動作モード?
このシミュレータは、使っているブロックによって「動作モード」を切り替えるスタイルになっているようです。名前が無いと説明しずらいので、代表的な「動作モード」に勝手に以下のように名づけました。
-
- ノーマルモード
- コンソールモード
- v2モード
今回は2番目の勝手命名「コンソールモード」に注目して行きたいと思います。
ノーマルモードは、MakeCodeエディタを空のプロジェクトで起動した状態で現れる初期のモードとしました。Matrix LEDを光らせるようなブロックを配置すると画像の中のLEDもそれに応じて光らせたりすることができる基本のモードです。
micro:bitの画像の下には、ボタンがならんていますが、シミュレータの制御に関わる重要ボタンが2つ、左側に表示されています。
-
- 左端の四角のアイコン:シミュレータの実行を一時停止させるときに使う。止めるとアイコンは三角に変わる。三角アイコンを押すと実行再開。
- 左から2つ目の矢印グルグルアイコン:シミュレータにRESETかけて、最初からやり直すときに使う。
さて、上のノーマルモードでは現れてきませんが、シリアル出力に何か書き込むようなブロックを配置すると、以下のようなコンソールモード(勝手命名)になり、micro:bitの画像の下のアイコン群のさらに下に “Show console”というボタンが現れてきます。このボタンを押したときの使い方に本日はフォーカスしてみます。
また、BBC micro:bit v2でないと実行できないブロックを配置すると、勝手命名「v2モード」に入ります。目印は画像右下のv2マークです。また、温度計とか、マイクとか、タッチに反応する金色ロゴとかも現れます。前述のコンソールモードとは両立します。
このように、配置したブロックにより挙動は変わります。ここまでの「3モード」以外にもセンサなど使うとシミュレータに機能が追加されるようです。その変化も含めたシミュレーションなんだと思います。それでは Show console ボタンを押したときに現れるモードを中心に調べていきます。
シミュレータの扱う時間単位
シミュレータの画面上の「動き」の速度は、現物のmicro:bitの挙動と実時間で「似た」速度であるように感じられます(個人の感想です。)実際、どのような時間単位で走っているのか、以下のようなコードで観察してみました。ここでポイントは、以下です。
-
- シリアル出力する(そうすると console が使えるようになる)
- 変数を定義する(シミュレータ上の変数の変化の様子が時系列で観察できる)
さて上記のコードに対して、Show consoleボタンを押すとプログラム面が隠れ、以下の「コンソール画面」が現れます。中央上の Go backボタンを押すとプログラム面の表示に戻ります。コンソール画面の右上には、シミュレータの実行、停止ボタン(下の画像は停止中)、シミュレーション結果のCSV出力ボタン、クリップボードへのコピーボタンがあります。その下にあるのは、変数の時間変化グラフです。そして右側下部がシリアル出力の結果がそのまま見えるコンソール画面です。
実際にシミュレーションの結果をCSVファイルに出力させてみました(さすがMicrosoftです、CSV出力すると特に指定してもいないのにデフォルトでExcel立ち上がりました。)CSVファイルは「時刻と各変数の値が1行に列挙」されている形式です。変数の値に変化が起きたところでレコードを記録しているので、時刻の刻みは一定ではないです。なお時刻は浮動小数点数です。出力したファイルには650回ほどのt0という名の変数変化の履歴が「時間」とともに出力されていました。変化のインターバルを算出してみると以下のようです。
-
- 平均0.047
- 最大0.63
- 最小0.004
foreverループ内には待ちが入っておらず最速でクルクル回っている筈ですが、以前調べたとおり、foreverループ内には20ミリ秒の待ちが暗黙で含まれています。そして実機実測では最速でも1ループ0.025秒程度(v1.5の場合)かかっていました。今回はループ内にコンソール出力も入っていることから、0.047「秒」の実行時間というのはあり得る感じではあります。以下のように考えました。
CSV出力される時間単位は実時間の秒のつもり(たぶん。。。)
実機でも発生するループ毎の時間バラツキもシミュレートされている感じです。しかし、バラツキ多めに盛っている感じです。特に最小値は?ですが。まあシミュレーションなので少ないよりは良いかと。
比較のためにループの中に100m秒の待ちを入れてみました。こんな感じ。
今回出力のCSVファイルには、200回ほどのt0変数の変化が記録されており、時間間隔を計算したら以下のようでした。
-
- 平均0.134
- 最大0.264
- 最小0.097
プログラム上で100ミリ秒足したら、シミュレーション平均で90ミリ秒くらい長くなりました。まあまあ、CSV上の時刻が秒単位と考えるてもいい感じかな。
入出力端子
さて時間単位が分かったので、今度はmicro:bitのエッジ・コネクタの端子に信号を出力してみます。まずは、P8端子に出力。
シミュレーションの結果が以下に。どういうわけかt0変数の時系列グラフの色が変化しました。さっきも微妙に変わってたし。意味があると思うのだけれど。。。
一方、端子出力は下の矢印のところ、P8端子部分に反映されてました。オレンジに色づいているP8端子、ピコピコしている感じ。
端子出力が、ちゃんとシミュレータの「顔」に反映しているようです。それでは、入力はどうか?P16端子を入力にして、入力値をp16vという変数に代入した上でシリアル出力してみます。代入しているので変数グラフにも表れる筈。
結果は以下のようです。P16端子もオレンジ色になり、p16v変数の時系列グラフも現れました。P16端子を「クリック」すると、値が変化します。代入先のp16vのグラフにも反映。しかし、
P16端子の反応、とっても悪いです。
クリックに反応するのは何回もやっていてタマタマ。なお、左クリックで端子の値がトグルします。右クリックには反応なし。
エッジコネクタからの入力、サポートしているみたいだけれど使えない雰囲気。
もしやと思い、ボード上のボタンAにイベント待ちを仕掛けてみました。こんな感じ。
上のシミュレーションが以下に。ボタンAを左クリックすると確実かつ素早く反応が返ります。エッジコネクタからの端子入力とは別世界の待遇。ボタンAの押された回数で変数t1をカウントアップしているので、t1のグラフが立派に反応しています。
細かい事言うと、変数グラフやコンソール出力の縦幅を調整する方法が見当たりません。上のケースは、フルHDの画面なのですが、変数3個を1画面内でフルに並べることが不可。ま、スクロールすれば見えるのですが。高さ調整してもっと沢山並べたいのだけれど。。。