車が走行中に前方をレーダーで監視し、
事故が起こりそうになったら自動停車するシステムは
すでに実用化されています。
車両に搭載された「レーダー」や「カメラ」で対象をAIなどで認識し、適切な回避動作をするようプログラムが組んであります。
今回はそこまで高度なことはできないので、車の前方に何かを発見したら緊急停止する仕組みを作ってみます。
現実の車にも同じセンサーが使われています。
今回の最終ミッションは、
・ボタンを押したら前進
・障害物を検知したら車を止める
です。
今回はコンピュータらしいプログラム方法「条件判断」を学びます。
例えば、朝のルーチンとして次のような行動をするとします。
朝起きて
のどが渇いていたら
水を飲む
朝ごはんを食べる
赤字で示した部分が
「判断」と「条件によって分岐した動作」です。
コンピュータのプログラムも同じように、判断し、処理を変更することが可能です。
micro:bitのプログラムブロックにも「条件判断」は2種類が用意されています。
1 もしXXXならば、◯◯◯する。
2 もしXXXならば、◯◯◯する
でない場合は、 △△△する。
という形式です。
(2の形式は、更に「でない場合は・・・」を多数連結することができます。)
「条件に一致したら」を「真(しん)」
「条件に一致しなかったら」を「偽(ぎ)」
と表現します。
六角形の<真>の部分に、判断したい条件を設置します。
理論はともかく、実際にプログラムを作って確かめてみましょう。
超音波センサーから障害物までの距離が
短い場合は「赤」LEDのを点灯
長い場合は「消灯」
するプログラムを作ります。
「ずっと」ブロックの中へ(※)
「論理」群から「もし<真>なら・・でなければ・・」を
組み込みます。
それぞれの「△△△する」の空いている場所へ
「Tinybit」群から「ヘッドライトの色 消」を組み込み、
上側を「赤」など適当な色
下側を「消」のまま
にします。
一番下に「一時停止」を入れ、数字を200に変更します。
※「基本」群の中にあります。
<真> の部分に「条件」を書きます。
「論理」群から「比べる」ブロック
< 0 < 0 >を選んで、右側に仮置きします。
( 一時停止が200ミリ秒になっているのは、超音波センサーの仕様で200ms間を置くように書かれているためです。)
仮置きした< 0 < 0 >に更に加工します。
「Tiny:bit」群から「microbit V2 超音波センサー(cm)」をドラッグし
六角形< 0 0 >ブロックの左側に組み込みます。
六角形< >内の右側の「0」を10に変更します。
マウスで数字をクリックしキーボードから入力してください。
「距離が10cmより短かったら」という意味になります。
(正確には未満です。)
できあがった<距離が10cmより短かったら>条件のブロックを
マウスでドラッグし
「もし<真>なら」の近くまで持っていきます。
「もし」後部に赤色の●、条件ブロックの先頭に●が出現して
黄色の線で結ばれたら、マウスボタンを離します。
マススドラッグは条件六角形の左端を掴むと簡単です。
左のように六角形<>の中に組み込まれたら完成です。
プログラムは
ヘッドライトを
センサーからの距離が20cmより近かったら赤色
それ以外なら
センサーからの距離が20cmより近かったら消す
にする。
この動作をずっと繰り返します。
Tiny:bitへプログラムを転送して確かめてみましょう
ほぼ10cmを境に点灯・消灯しています。
防犯センサーにも使えますね!
今度はライトの点灯・消灯ではなく
車の前進・停止にプログラムを書き換えていきましょう。
条件判断部分(六角形のパーツ)を除いて
全てのブロックを廃棄してください。
「基本」群から
「最初だけ」と「ずっと」ブロックをドラッグ&ドロップします。
「入力」群から
「ボタンAが押されたとき」を配置します。
「ボタンAが押されたとき」を右クリックし
「複製する」をクリックします。
複製したブロックの「A▽」部分をクリックし
「B」に変更します。
ブロックの位置を揃えてみました。
(無理に同じにしなくてもOKです。)
ちょっと説明を急ぎます。
左の画面はクリックすると拡大表示されます。
「Tiny:bit」群から
・「車の制御 前進」ブロックを「最初だけ」と「ボタンBが押されたら」へ組み込みます。
続けてこの2個を「車の制御 停止」に変更します。
・「車速 前進 速度 0」ブロックを「ボタンAが押されたら」へ組み込みます。
続けて数字「0」を「50」に変更します。
今度は「ずっと」ブロックが対象です。
「論理」群から「もし<真>なら」ブロックを
「ずっと」ブロックの中に組み込みます。
先程やったと同じ方法で
条件式を作成し値を10にします。
「ボタンBが押されたとき」の中にある
「車の制御 停止」ブロックを右クリックし
「複製する」をクリックします。
複製された「車の制御 停止」ブロックを
「もし」ブロックの中に組み込みます。
最後の1ステップです。
「基本」群から
「一時停止 (ミリ秒)100」ブロックを
「ずっと」ブロックの一番下側へ組み込み
数値を「100」から「200」に変更してください。
これで完成です。
プログラムをTiny:bitへ書き込んでください。
ヘッドライトの色を点けるとそれらしくなって楽しいですね。
センサーの数値が10未満で停止するようにしていますが、
車のコンディションによってはギリギリで止まることもあるようです。
その場合は15cmとか20cmに数値を変えてみてください。
【動作の説明】
・Aボタンが押されるまでは車は停車しています。
・Bボタンが押されると車は止まります。
「ずっと」ブロックの中で、停車させるかを判断します。
もし、センサーで距離が15cm未満になったら、停車
でなければ、200msほど待ちます。
お疲れ様でした。
プログラムはこちらで取得できます。
ここまで勉強したプログラミングテクニックをフル活用して、いろんな動作をプログラミングしてみましょう。
・右折左折をして目的地に到着する
・まっすぐ走らせる
・障害物を見つけたら停止して、後退、別のルートを通って回避する
・停止・発進にヘッドライトを連動させる
:
いろいろ試行錯誤してみてください。
時間があれば次の「障害物回避走行」にチャレンジ!
ーーー この実習は終わりです ーーー
メーカーサイトのサンプルプログラムでは、「ずっと」ブロックの中でプログラムを組むようになっています。
ですが、それだとプログラムを書き込んだ途端に車が走り始めてしまいます。
間違えるとロボカーが机から投身自殺をすることになるので、「ボタンが押されたら」に作り直しました。
ちょっとプログラムが複雑化するのですが、安心安全がプログラムには重要です。
ロボットアームの電源を入れた途端に動き出すのは危険ですよね!
プログラムは、
想定外や誤りがない
ついで、
(他人にも)判りやすく無駄がない
のが良いプログラムだと思っています。