マイクロビットではさまざまな処理を行うことができますが、それぞれの処理を行うにはある程度の時間がかかります。
時間のかかる処理を何回も繰り返して行うと、その時間もだんだんと無視できなくなり、すぐに反応してほしいプログラムなどでは所望の動作をしなくなる可能性もあります。
ここでは、マイクロビットで実施できる主な処理について、かかる時間を実際に測定してみたいと思います。
今回は、私がよく使う「センサ値の読み取り」「入出力端子への入力/出力」「LEDの点灯/消灯」「無線の送受信」の処理時間を調べます。
「V1.5」「V2.2」の2台のマイクロビットで測定することにします。
測定に使うプログラムは以下のとおりです。
Aボタンを押すと、「処理」関数を8回実行し、それぞれでかかった時間を配列に格納します。
8回の実行が完了したら、格納しておいた処理時間をシリアル通信で書き出します。
ちなみに、「処理」関数の中が空のとき、処理時間は「V1.5」「V2.2」ともに「0ms」でした。
センサ値の読み取り
「処理」関数の内容は以下のとおりです。
結果は以下のとおりです。「V1.5」「V2.2」ともに、ほとんど時間はかかっていません。
処理内容 | V1.5 | V2.2 |
---|---|---|
センサ値の読み取り | 0〜2ms | 0ms |
入出力端子への入力/出力
入出力端子へ出力する場合の「処理」関数の内容は以下のとおりです。
入出力端子から入力する場合の「処理」関数の内容は以下のとおりです。
結果は以下のとおりです。「V1.5」「V2.2」ともに、ほとんど時間はかかっていません。
処理内容 | V1.5 | V2.2 |
---|---|---|
入出力端子へ出力 | 0〜1ms | 0ms |
入出力端子から入力 | 0〜1ms | 0〜1ms |
LEDの点灯/消灯
アイコンを表示する場合の「処理」関数の内容は以下のとおりです。
文字列を表示する場合の「処理」関数の内容は以下のとおりです。
矢印を表示する場合の「処理」関数の内容は以下のとおりです。
座標を指定して点灯させる場合の「処理」関数の内容は以下のとおりです。
棒グラフを表示する場合の「処理」関数の内容は以下のとおりです。
LED画面に自由に表示する場合の「処理」関数の内容は以下のとおりです。
結果は以下のとおりです。処理内容によっては非常に時間がかかっています。
処理内容 | V1.5 | V2.2 |
---|---|---|
アイコンを表示 | 598〜599ms | 600ms |
文字列を表示 | 748〜749ms | 752ms |
矢印を表示 | 598〜599ms | 600ms |
座標を指定して点灯 | 0〜1ms | 0ms |
棒グラフを表示 | 2〜9ms | 0〜3ms |
LED画面に表示 | 401〜402ms | 400ms |
表示を消す | 0〜1ms | 0ms |
無線の送受信
無線で数値を送信する場合の「処理」関数の内容は以下のとおりです。
無線で「KEYWORD=数値」を送信する場合の「処理」関数の内容は以下のとおりです。
無線で文字列を送信する場合の「処理」関数の内容は以下のとおりです。
無線で文字列を受信するプログラムは以下のようにしました。
無線で受信してから時間の計測を開始しているため、これでは所望の時間を測定できていないような気もしますが、よい方法を思いつかなかったので、まずはこれで調査することとしました。
結果は以下のとおりです。「V1.5」「V2.2」ともに、ほとんど時間はかかっていません。
処理内容 | V1.5 | V2.2 |
---|---|---|
無線で数値を送信 | 0〜7ms | 0〜2ms |
無線で「KEYWORD=数値」を送信 | 1〜7ms | 0〜3ms |
無線で文字列を送信 | 1〜8ms | 0〜1ms |
無線で文字列を受信 | 0〜6ms | 0ms |
まとめ
調査結果は以下のとおりです。
処理内容 | V1.5 | V2.2 |
---|---|---|
処理なし | 0ms | 0ms |
センサ値の読み取り | 0〜2ms | 0ms |
入出力端子へ出力 | 0〜1ms | 0ms |
入出力端子から入力 | 0〜1ms | 0〜1ms |
アイコンを表示 | 598〜599ms | 600ms |
文字列を表示 | 748〜749ms | 752ms |
矢印を表示 | 598〜599ms | 600ms |
座標を指定して点灯 | 0〜1ms | 0ms |
棒グラフを表示 | 2〜9ms | 0〜3ms |
LED画面に表示 | 401〜402ms | 400ms |
表示を消す | 0〜1ms | 0ms |
無線で数値を送信 | 0〜7ms | 0〜2ms |
無線で「KEYWORD=数値」を送信 | 1〜7ms | 0〜3ms |
無線で文字列を送信 | 1〜8ms | 0〜1ms |
無線で文字列を受信 | 0〜6ms | 0ms |
主な処理のうち、処理時間が無視できないぐらい大きいのは「LED表示」に関するもののみでした。
その中でも、表示に時間がかかる処理とかからない処理があるので、処理時間が気になるような用途では使用するブロックを工夫すればよいようです(「点灯(座標指定)」や「棒グラフを表示する」は処理時間が小さい)。
確認
今回の調査をしようと思ったそもそものきっかけは、「無線通信には時間がかかるのではないか?」というものでした。
2台のマイクロビットを無線の送信機と受信機にして、ロボカーを操縦するような使い方がありますが、無線通信に時間がかかってしまうと操作が間に合わなくなってしまい、特に高速で走るロボカーの場合は、所望のとおりに操作できないことになります。
先ほどまでの調査の結果より、無線の送受信にはほとんど時間がかからないことが分かりましたが、ここではより実使用に近い状態で時間を測定してみたいと思います。
送信機用のプログラムは以下のとおりです。
Aボタンを押すと、無線で数値を25回送信します。その際、1回送信するたびに10ms待ちます。つまり、一連の処理には「250ms+α」の時間がかかります。
一連の処理が終わると、かかった時間をLED画面に表示します。
受信機用のプログラムは以下のとおりです。
無線で数値を受信すると、受信した値に応じた座標のLEDを点灯させます。
数値を25回受信したら、全ての受信にかかった時間をLEDに表示します。
上記のプログラムを数回実行した結果、送信にかかった時間は「298〜305ms」、受信にかかった時間は「277〜313ms」でした。
待ち時間(250ms)を除くと、処理にかかった時間は数十ms、無線送受信1回あたりの処理時間は数msという結果になり、先ほどの調査結果が妥当であることが確認できました。
なお、私がマイクロビットの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
初心者向けから、比較的高度なものまで、さまざまな情報が記載されているだけでなく、子供向けの作例も多数掲載されていますので、「プログラミング教育」のための題材さがしなどにもおすすめです。