娘が小学生の頃、ロボゼミというロボット作りに通っていました。
環境はStuduinoというArduino系のマイコン+Scratchによるノーコードプログラミングです。
最終課題の競技用のロボットを作っていた際、助言を求められて伝えた思い出から。
言語は何であれプログラムは小さい部品化すべし。
ルール (ライントレース+障害物をどけるロボットを作る)
- 赤外線フォトリフレクタセンサーを使用して黒い線をライントレースする
- 赤外線フォトリフレクタセンサーをもう一つ使用してライン上の障害物を検知
白ブロックは左へどけたら10点、黒ブロックは右へどけたら10点
ただし最後の白ブロックだけは右へどける - 白ブロックを左にどける際、中央のエリアに入れたら100点
結果的にパーフェクト達成
最後の白ブロックを掴み損ねており、それをどう判断するかですが
右にどけているのでこれはこれで結果オーライ。結果的にパーフェクト達成です。
ロボットに限らずプログラムは部品化すべし
娘に助言を求められたとき、プログラムは長い1本のプログラムでした。
ライントレースを〇秒実行し、掴んで左に離す、といった具合。
そこでプログラムを部品化することを助言しました。
- 5個のブロックに対して5種類のタイミングプログラムをする必要がある(冗長になる)
- 1本の方式は、一カ所でタイミングに失敗したらその後も全部失敗する可能性が高い(緻密になる)
- 緻密で冗長になったプログラムはちょっとしたことでミス(バグ)がおきやすい
最終的には競技の直前に完成させたようです。小学生らしさが残るコーディングがほほえましいので、それはそれでそのまま紹介します。
Studuinoによる最終的なプログラム
娘が小学五年当時に作ったそのままで紹介します。
基本モジュール
- アームのサーボモーター(D9,D10)の初期値90度にセットする
- カウンタko(個)の初期値0にセットする
- フォトリフレクタ(A4)の値が黒を検知したら10点ゲットのモジュール(10)を実行
- そうではなく白を検知した場合はカウンタを1カウントアップ、
3つ目の白だったら10点ゲットのモジュール(10)を実行、それ以外は100点ゲットのモジュール(100)を実行 - そのどちらでもない場合はライントレースを続ける
rainモジュール
大人風にはlineモジュールとするところですが、rainとなっているところが小学生っぽくて気に入っています(笑)。
- 進むときの速度を初期値に与える
- ラインを見失ったら左方向に回転しながら進みラインを探る
見失っていない時は右方向に回転しながら、ラインを見失うまで進む
この繰り返してで、車体を左右に小刻みに振りながらライン上を進み続けます。
tukamuモジュール
これもまた、tsukamuではなくtukamuとなっているところが微笑ましいです(笑)。
- アームを前に倒す
- アームの左右を締める
- アームを上げる
10モジュール
10点ゲット(線の右側にブロックをどける)
- tukamuもジュールを実行してブロックを掴む
- 車体を右に回転させる
- 停止
- アームを開き、ブロックを離す
- 車体を左に回転させる
100モジュール
100点ゲット(中央のエリアにブロックを運ぶ)
たぶん後半にある「ずっと」のコードは一部、実行されない無駄がありそうですが、全体の動きとしては問題なしでしょう。
- 車体を左に向ける
- 中央エリアの壁を検知するまで前進
- 検知したらアームを開いてブロックを離し、アームを上げる
- その後はバックをする
(何らかの意図でライン検知による条件分岐をさせていますが、たぶん作用していないと思われます)
まとめ
何はともあれ、プログラムを部品化する助言だけでやり遂げたのが素晴らしいです。
- 個々のプログラムは短いほうがバグが入り込む余地が少ない
- 個々のプログラムはシンプルな方が汎用性が上がる
- 汎用性が高いプログラムを部品として再利用することで似たことを何度もコーディングしなくて済む
- 結果、全体としてもコード量が少なく済み、メンテもしやすくバグの入り込む余地が少なくなる
コメント