micro:bit(マイクロビット)は手のひらサイズの小さなコンピューター。いろいろな機能
が備
わっていて、自分でプログラミングをすることができるよ。ブログラミングは「MakeCode(メイクコード) for micro:bit」を使えば、初心者でもかんたんにできるんだ。
『子供の科学』本誌
の連載
「micro:bitでレッツプログラミング!」では、micro:bitを使った「探検
ウォッチ」というツールを使って、その機能
をプログラミングでつくったけれど、この連載が「スタプロ」にお引っ越し。Web連載でも、探検ウォッチのいろいろな機能をプログラミングでつくっていくぞ!
これまでの本誌連載のバックナンバーは、micro:bit特設サイトで公開しているよ(コカネットの無料会員登録が必要)。本誌の連載を見たことがないという人は、まずこちらを見てみてね。Web連載は、本誌の連載の続きになっているから、基本的なことがわからなくなったら本誌のバックナンバーを振
り返ろう。
今回は、探検ウォッチをつけている人同士が、一定時間近くにいるとアラームが鳴る「濃厚接触判定
アラーム」をいよいよ完成させるぞ。これまでは、micro:bitの無線
機能を使って距離
を測り、タイマーを使って15分という時間を測るプログラムをつくったよ。それらを組み合わせて、プログラムをつくっていこう。完成したら探検ウォッチに書き込んで、身に着けて試してみよう。
1 1メートルの距離を測定する
「濃厚接触判定アラームをつくろう①」で、2台のmicro:bitを使って、電波
の強さが距離で変化することがグラフで分かるプログラムをつくったね。
micro:bitに書き込んで試
してみると、グラフの変化でmicro:bit同士の距離の変化がわかる。グラフの高さがディスプレイの半分くらいだと、電波の強さが最大値86の半分で43だと想定
できるね。それより大きくなる、つまり近づいたらタイマーのカウント開始としよう。このように、その値を境
にして上下で条件や判定
などが違ってくる値のことを、閾値
というぞ。
1メートルくらい離れているときに、閾値が43くらいにするためには、無線の送信強度を変えるとよさそうだ。
「無線送信実験」のプログラムの「最初だけ」ブロックに「無線」カテゴリーの「無線の送信強度を設定(7)」ブロックを追加しよう。無線の送信強度を変えつつ、micro:bitに書き込んで試してみてほしい。
著者が試したところ、送信強度を1にすると、micro:bit同士の距離がだいたい1メートルくらいで、でグラフの高さがディスプレイの半分くらいになった。
この実験をふまえて、前回つくった「濃厚接触判定アラーム」プログラムで、無線電波を発信するコードを追加しよう。
変更箇所
は2か所。「最初だけ」ブロックでは、無線のグループ(①)と無線の送信強度(②)を設定する。
「ずっと」ブロックでは「無線で数値を送信」を設定するぞ(③)。
前回つくったプログラムでは、ボタンAを押したら1メートル以内にいることにした。これを無線で受信したときに切り替えるので、「ボタンAが押されたとき」ブロックのプログラムを変更しよう。
「無線」カテゴリーの「無線で受信した時“receivedNumber”」ブロックを使うよ(④)。このプログラムでは「論理
」カテゴリーの「もし“真”なら~でければ~」ブロックを使い、次のようにコードをつくるよ。
「受信した信号強度+128」が「43」より大きければ(⑤)、変数「1m以内」を1にする(⑥)。そうでなければ変数「1m以内」を0にする(⑦)。
ここまで出来たら、1回テストをしてみよう。シミュレーターが2台表示されるので、これまで使っていた1画面のエディターでも試せる。
シミュレーターで表示されているmicro:bitのアンテナマークの部分を、マウスカーソルで触
れることで電波の強度を調整
してみよう。他方のLEDディスプレイが、時計やスマイルのアイコンに切り替わればOKだ。
近くにいるという状況にしてタイマーが動くか、近づいたり離れたりしてもタイマーが継続
されるか、などさまざまな状態を試してみよう。シミュレーターでもしっかり動作の確認をしてみよう。
2 探検ウォッチで使いやすいプログラムにする
シミュレーターで試してうまくいくようなら、micro:bitに書き込んで試してみよう(micro:bitは2台以上必要だ)。
ただし、使っている間に電池が切れてしまうと困るので、書き込む前に、プログラムで電池の消費
を抑
える工夫もしてみよう。
例えば、「ずっと」ブロックのプログラムでは、離れている時間を計測している間、LEDディスプレイに時計のアイコンを表示するなど、動作の確認をするためのアイコンをたくさん入れているよね。これを外したり、かんたんな表示にするだけで変わるよ。
とはいえ、アイコンが表示されないと、ちゃんとプログラムが実行されているかわからないので困るかもしれない。その場合は、「LED」カテゴリーの「点灯x(0) y(0)」ブロックや、「基本」カテゴリーの「表示を消す」ブロックなどを代わりに使ってみよう。LEDを1つ点灯するだけなので、アイコン表示より電力消費を抑えられそうだ。15分を計測中は「点灯x(0) y(0)」ブロックでLEDを点灯させて(⑧)、一時的に離れている時間を計測中は「表示を消す」ブロックでLEDを消灯させているよ(⑨)。
LEDを消灯するに「表示を消す」ブロックを使ったのは、この後、濃厚接触のアラートを鳴らしたときに「こまり顔」のアイコンを表示させているからだよ。アラート鳴らした後、この「こまり顔」アイコンも消したいので、「表示を消す」ブロックにしたんだ。
そして「ずっと」ブロックのプログラムの最後に「一時停止(ミリ秒)」ブロックも入れてみよう(⑩)。電波の送信の回数を減らして、電力消費を少なくすることができる。
ここまで出来たら、実際にmicro:bitに書き込んで試してみよう。また、実機
でのテストが終わったら、忘れずに時間の設定を3分から15分に変えておこう。「最初だけ」ブロックのプログラムで、変数「15分(ミリ秒)」のコードで計算している部分の値を変えるだけだ。
3 濃厚接触判定アラームが完成だ!
これで、濃厚接触判定アラームが完成だ。このプログラムを書き込んだ探検ウォッチをたくさんの人がつけていたら、15分以上近くにいたらアラートが鳴るので、密
を避
けることが出来るね。
今回は2台の探検ウォッチで試しているけど、探検ウォッチを持っている人が3人以上集まれるようなら、どの相手との距離を測るのか、検知できる距離に変化があるのかなども試してみよう。
例えば3台になると、一方の電波は1メートル以内にいると検知すると同時に、他方の電波は1メートル以上離れていると判断されることになる。だいたいは、両方の電波について交互に検知されて処理が行われるけど、タイマーがリセットされなかったほうが濃厚接触と判断されるだろう。
また、今回距離の検知に使っている無線電波(Bluetooth Low Energy)は間
に障害物
などがなければ精度よく距離を検知できるが、水分を多く含む人の体や、ガラス、金属など通り抜けるのが苦手なものもある。障害物を経た電波は弱い状態で受信されて、実際の距離より遠いとプログラムが判断してしまうことにもなる。
こうしたことは実際に大勢
で実験してみないと気づかないことも多いし、あらかじめ想定してつくることも難
しいだろう。ぜひ友だちと教室などで集まって、密集
を避けつつも実験をして、プログラムをよりよくしたり、もっと便利な機能を考えて追加してみてね!
(文/倉本大資 撮影/青柳敏史)