micro:bitで方位センサを作ってみよう
カリキュラム
https://gyazo.com/8bdafc934330064bee9d273c75bbbc8c
ここでは,micro:bitに組み込まれている地磁気センサを利用したプログラムを作ってみます.このプログラミング活動は,方位磁針を使う理科や社会などに組み入れることができます.角度の考え方を用いますので4年以上が適切な実施学年です. 要既習
なお,ここで作る方位センサは,外で使うなどのためにコンピュータとの接続を切り離すと,micro:bitに電源は供給されなくなり動かなくなりますので,そのような場合は電池ボックスを接続してください.
地磁気センサを使ったプログラムの実行
地磁気センサを使ったプログラムを作りmicro:bitに転送してプログラムの実行が開始された時,LEDに「TILT TO FILL SCREEN」に表示された後,いくつかのLEDのドットが点灯した状態になることがあります.これは地磁気センサの初期化(キャリブレーション)を行えという指示です.この表示がされたら,micro:bitを色々な方向に傾けて,全てのLEDのドットが点灯するようにします.全てのLEDのドットが点灯するとニコニコマークが表示され,転送したプログラムが実行されます.
シミュレータ上での実行
地磁気センサを使うプログラムを作った場合,micro:bitにプログラムを転送する前にプログラムの動きを確認するためのシミュレータでは,上部に表示される方位マークと方位が表示されます.これをドラッグ操作で動かすことで,micro:bitを色々な方向に向けた時の地磁気センサの状態をシミュレートして,プログラムが正しく動いているかを確認することができます.
https://gyazo.com/4094fe8902ffa03304041b2692f0dfb2
hr.icon
方位センサを作ってみよう
北を向いたら知らせてくれるようにしてみよう
まず最初にmicro:bitを北に向けるとLEDにNを表示して教えてくれるプログラムを作ってみます.
何かの条件によってプログラムの動きを変えることを条件分岐と呼びます.条件分岐を実現するためのブロックが条件分岐ブロックhttps://gyazo.com/8feb8e277a020c37ffc25dc203534b94です.上の六角形の部分に真偽値を置くと,真値である時は上側の窪みに置かれたブロックが,偽値である時は下の窪みに置かれたブロックが実行されます.この真偽値を置く部分には,多くの場合,条件を表す条件式を置きます.条件式はその式が成り立っていれば真,成り立たっていなければ偽となります. 今回は,北を向いたらが条件となります.今開いているプロジェクトでは「コンパス」カテゴリの中に「北向き」ブロックが用意されています.このブロックはmicro:bitが北を向いていると真値,向いていないと偽値になるブロックなので,これを条件分岐ブロックの六角形のところに置くことで,北を向いているか向いていないかで異なるブロックを実行することができます. では,作ってみましょう.
正解例を示します.
https://gyazo.com/0f069e1aac6056fe2e987fb02658ccfe
他の東西南を向いた時も知らせてくれるようにしよう
引き続き,次は,他の東西南を向いた時も文字を表示して,その方向を向いていることを教えてくれるプログラムを作ってみます.
まず東を向いた時を追加してみます.単純に東を向いた時にLEDにEを表示するブロックは
https://gyazo.com/e7f4dfe6360d459a4f3228a583128242となることはもうわかると思います.これをどのように入れたら良いでしょうか.たとえば,北向きについてのブロックの下に置くと,
https://gyazo.com/4dc622de09ea14f9ac80bd35fd6efae4
となります.これで大丈夫でしょうか? 上から順番に見ていくと北向きならNを表示します.それ以外なら表示を消します.次に東向きならEを表示します.これだと東向きの場合,消す,Eを表示する,消すが繰り返されて,Eの表示が点滅してしまいますね.さたに,このプログラムには少し無駄があります.というのは北向きである時も,東向きであるかどうかを調べています.北向きであることがわかっているのですから,その瞬間はもう東向きであることを調べる必要がないはずです.東向きであるかどうかを調べるのは北向きでない時だけです.なので,東向きであるかどうかを調べる部分は,北向きであるかどうかを調べている条件分岐ブロックの「でなければ」の中に入れるべきです.ただ,単純に入れるだけだと,先と同じように東向きの時Eを表示して,それを消して,またEを表示してという動きになって,チカチカと点滅するような表示になってしまいます. https://gyazo.com/43895e35b864c9114a54f19bf7f5e850
表示を消すのは北向きでもなく東向きでもない時です.このような時はどのようにしたら良いかというと,「もし<東向き>なら」ブロックの下にある+マークを押して,そこに出てくる「でなければ」のところに「表示を消す」ブロックを移します.
https://gyazo.com/58e4f42755221ef6c651aa525c7c9b4b
これで北向きの時はNを表示し,そうではない時は東向きかどうかを調べ,東向きの時はEを表示し,そうでもなかったら表示を消してくれます.このような方法を条件分岐の入れ子と言います. さらに多条件分岐ブロックを用いるとよりすっきりしたプログラムになります.前回の「北」を向いたらNを表示するプログラムの条件分岐ブロックの一番下に+マークを押すと.真ん中に「でなければもし」と真偽値を入れる部分と,ブロックを入れるための窪みが出現します.ここに「東」を向いたらEを表示する処理を入れれば同じ動きのプログラムになります. https://gyazo.com/f639f61f78a04ce76bc1cd4a92feffbd
では,同じようにして,南向きの時にはSを,西向きの時にはWを表示するプログラムを作ってみましょう.
正解例を示します.
https://gyazo.com/ee3c2ba34b71299e395a10a4cb8f3a64
hr.icon
方角ブロックを使って方位センサを作ってみよう
ここでは,先に作ったプログラムと同じ動きをするプログラムを,「入力」カテゴリの中にある変数ブロック「方角(°)」使って,作ってみます. 変数ブロックには文字列や数などの値を入れることができ,文字列を入れるべき場所や数を入れるべき場所に置くと,変数ブロックに入っている文字列や数を置いたたのと同じ動きになります. 「方角(°)」ブロックはmicro:bitが向いている方角を表す北が0度の右回りの角度が入っています.つまり北が0,東が90,南が180,西が270です.
https://gyazo.com/e2e57a3c7faa2ecb066e9dd69d3e9099
南方位センサを作ってみよう
まず,南に向けたらSを表示するプログラムを作ってみます.プロジェクト方位センサを開いてください. https://gyazo.com/ad76c7fa74ca779f303b7f30a0ceeb1c
micro:bitが南を向いたとき,つまり「方角(°)」の値が180となったときにLEDパネルにSを表示します.逆に,南を向いていないときにはLEDに何も表示しないことが必要です.
先ほどは南向きかどうかの真偽を出してくれるブロックを使いましたが,今回は「方角(°)」が180であるかどうかを判定する必要があります.このような判定をするのが条件式です.条件式はその式が成り立つとき真値,成り立たないとき偽値になり,条件分岐ブロックの六角形の部分に入れることができます. 今回は二つの数が同じかどうかを調べることになります.このときの条件式は等式ブロックhttps://gyazo.com/e07deff96182ae5012959e4bfd2d2cd5を使います.左側と右側の◯に入れた数が等しいとき成り立つ結果となります.では,作ってみましょう. 正解例を示します
https://gyazo.com/d4f30c4f04e1569fd8235a5fbaa9ff73
だいたい南方位センサにする
このプログラムを動かしても,なかなかSが表示されなかったのではないでしょうか.それは矢印が表示されるのはピッタリ真南を向いた時だけのため,手がぶれて少しでもずれると表示が消えてしまうからです.
そこで,正確さは損ないますが,だいたい南を向いたときに矢印が表示されるようにして,この問題を解消してみます.この「だいたい」の考え方ですが,方角の値として±10度,つまり170度から190度の間だったら南を向いているということにしてみます.
この時の条件式はどのようになるでしょうか.170度から190度の間という条件は,170度以上かつ190度以下と二つの条件を「かつ」でくっつけた条件といえます. このように二つの条件の両方が成り立つときを成り立つ結果とする場合,二つの条件式を論理積ブロックhttps://gyazo.com/a44ad1950d7cceec7689c8b34147174dの左と右の六角形の部分に入れた条件式ブロックを作ります. また,二つの数の大小を調べる条件式は,不等式ブロックhttps://gyazo.com/d0304f39b7d01c6bb891250a2406ccedを使います.右側の◯に入れた数が左側の◯に入れた数以上の場合成り立つ結果となります.この不等号が入る部分は≧以外に>,<,≦にすることができます. それでは,プログラムを作ってみましょう.
正解例を示します.
https://gyazo.com/031d29e797998eb417468ca43968cc60
北方位センサを作る
同様に,micro:bitを北に向けたら,その旨を教えてくれる南方位センサを作ってみます.
micro:bitが北向きになった時の地磁気センサの値は0になります.南向きと同じように大体北向きのときとするにはどうしたら良いでしょうか.北よりちょっと東側は1,2,3,...という値になります.北よりちょっと西側は359,358,357,...という値になります.ですので±10°の範囲は350度〜0度〜10度ということになります.南のときと違い,これは350度以上かつ10度以下ではないですね.350度の方向から北向きになる360度のところで0度になります.逆に10度の方向から北向きの0度になったところからさらに西側を向くと359....になります.数直線で表すと次のようになり,これは350度以上または10度以下という条件になることがわかりますか.
https://gyazo.com/8a7a98d4ebad4a154e8931c1def122c0
このように二つの条件のどちらかが成り立つときを成り立つ結果とする場合,二つの条件式を論理和ブロックhttps://gyazo.com/8e0dd6b41fea849d583e95e593140263の左と右の六角形の部分に入れた条件式ブロックを作ります. では,プログラムを作ってみましょう.
正解例を示します.
https://gyazo.com/c9c52bdb680b4966969643a1b84f0d9e
なお,350度〜0度〜10度の範囲は,10度〜350度ではない範囲という表現もできます.ある条件式が成り立っていないときに成り立つ結果となる否定式ブロックhttps://gyazo.com/c22413a628d03a00263624017e34d601を使うと,今回の条件式は次のようにすることもできます. https://gyazo.com/8ca086a8fa52a654251fed2db51186bb
東西南北方位センサを作る
ここまでの説明で,だいたい北を向いたらNが,だいたい東を向いたらEが,だいたい南を向いたらSが,だいたい西を向いたらWが表示されるプログラムが作れるのではないでしょうか.挑戦してみてください.
正解例を示します.
https://gyazo.com/8c7cac516049f4a5b1d308e8288f7f93
hr.icon
北方位ガイドを作る
最後に,micro:bitのLEDに常に北の方向を示す矢印を表示するプログラムを作ってみます.
つまり,
https://gyazo.com/f021f8f5dc628af2a136e6cafa4bffe0
上のように表示する矢印を変化させることになります.どこからどこまでの範囲でどのような矢印を表示するかを考えなければなりません.ここでは,次のような対応にします.北,東,南,西を向いたときを正確に知ることができるように,その方位を向いていることにする範囲を狭くしてあります.
https://gyazo.com/7a6da9b861b09dcb88cc12a089dd6255
プロジェクト方位ガイドを開いて,プログラムを作ってみましょう. https://gyazo.com/2dd92abdbab2c66cb357fbadd0a8b928
正解例の最初の部分だけ示します.条件式の境界の部分に気を付けることが必要です.たとえば10度がきちんとどちらかの条件式を成り立たせるように気をつけてください.
https://gyazo.com/497680f5f087b2b6f047a3edd5499021
https://gyazo.com/8bdafc934330064bee9d273c75bbbc8c
Copyrights 2020- Naoki Kato, IML at CICT, TGU