ししかわです。
前回はマイクロマウスのハードを組み立てました。
今回はPi:Co Classic3に付属のサンプルプログラムを動かしながら、
組み込みプログラミングについて学び、迷路の走破を目指します。
環境構築についてはPi:Coのマニュアルや先輩の記事を参考にさせていただきました。
Pi:Coにはステッピングモーターが2個搭載されています。ステッピングモーターとは「パルス波の数に比例して決まった角度回転するモーター」です。決まった数のパルス波を発生させれば、それに比例した距離をマウスが移動します。
逆に言えば「マウスがある距離をある速度で走るためには、ステッピングモーターに与えるパルス波を何回、どれくらいの頻度で発生させるか」を計算できればよいことになります。
とはいえ、このような処理を1から記述するのは大変です。
そこでPi:Coには「直進と超信地旋回を駆使しながら迷路を探索し、ゴールを見つける」そして「ゴールまでの最短経路を求めて、その経路を速く走る」という内容のサンプルプログラムが付属しています。
これをPi:Coに書き込めば、迷路を走破できるマウスがすぐに出来上がります!
早速動かしてみた結果がこちらです。
壁にぶつかってしまいました。原因は明らかで「壁の認識に失敗しているため」です。
マイクロマウス競技では、ロボットは迷路の情報をあらかじめ知ることができません。
そのため、壁に反射する光をセンサ(フォトトランジスタ)で検知して壁を認識しながら、
迷路の情報を組み立てる必要があります。
このとき「センサが受け取る光がどれくらい強ければ、そこに壁があるとみなすか」のしきい値は
環境によって多少変わるので、調整が必要です。
また、このセンサの値は直進時の進路の補正にも使います。
Pi:Coには左右と正面の壁を認識するセンサがついていますが、
例えば直進しているときに左右どちらかの壁に寄ってしまっていると、
壁に近いほうのセンサ値は高く、遠い方のセンサ値は低くなります。
そこで、センサ値がコースの中央を走るときの理想的な値に近づくように、左右のタイヤの速度を変更します。
このようにセンサからの入力を目標値と比較し、その結果を次の入力に反映させる制御をフィードバック制御といいます。
この他にも調整するパラメータは複数あります。
- センサで壁を認識する際のしきい値
- 通路の中央にマウスを置いたときの左右のセンサ値
- トレッド幅(左右のタイヤ間の距離)
- 回転時のタイヤの移動距離を求める際に使います
- タイヤの直径
- 移動距離を求める際に使います
などです。これらを定数としてサンプルプログラムに書き込みます。
試走と調整を繰り返し、最終的に迷路を完走できました!
ただし、今回使ったのは4×6マスの迷路です。
クラシックマウス競技の公式大会で使われるは16×16マス。
迷路が大きくなると、探索が終わらず時間切れになったり、
計算で求めた移動距離と実際の移動距離のズレが蓄積して、うまく走れない場合もあります。
ちなみに、マイクロマウスは全日本大会が毎年開催されています。
まずは各地方支部で行われる地区大会にエントリーし、迷路を完走できれば、
東京で開催される全国大会への出場権を獲得できます。
私をはじめアールティの社員は、研修の一環として全国の地区大会へ出場します。
次回は9/8(日)の東日本地区大会です。
次回からは大会に備えて「さらに速く走るための制御」を行っていきます。