はじめに
- 作成したクラシックマウスの解説。
- 今回はプログラミングの大まかな流れの話です。具体的なスケッチなどは次回以降です。
- 機体写真、動画などは「その1」をご参照。
プログラム:大まかな方針
初めてのクラシックマウスで、キットを使わずに製作しているので、高度な動きは狙えない。以下の方針で製作しています。
- 完走が目標
- とにかく完走が目標。時間内を目標としたいが、まずは時間がかかっても良いので完走が目標。
- 最短経路での走行などは考えない。2回も走るような時間もない。
- できるだけ自分でプログラムする。
- ライブラリは利用するが、機体の制御、探索などは自分でコードを書く。
- マイコンもそれほど経験がないので、高度なプログラミングは難しい。割込みは使わない形になっています。
- 壁にぶつからないように
- 壁にぶつかるとリカバリーが難しいので、なるべく車体が区画の中心になるようにしたい。
プログラムの流れ
ちゃんとしたフローチャートは書けないのですが、以下のような流れにしています。
- ある区画に到着する
- 前方に壁があれば、前後位置を調節する。
- 左、前、右の壁までの距離を測定する。
- 現区画の壁の有無を判定する。さらにもう一つ先の壁も判定する。
- 壁情報をもとに足立法を用いて、ゴールまでのステップ数を更新する。
- 進むべき方向を決定する。優先順位は直進→左折→右折→Uターンの順。
- 左右にターンする場合は、ターン後に前後位置を調整する。
- 車体の向きを(Gyroセンサーで)調整する。
- 次の区画に移動する。
- 左右の壁までの距離を測る。
- 左右に壁があり、壁に近いOR壁から遠い場合は、次の区画の中央に向かうように車体の向きを調整する。
- 左右に壁がない場合は、そのまま。
- 加速→減速しなから18cm前進する。
- 移動後に車体の向きを調整する。
センサー情報
- VL53L0Xは連続計測モードとしていますので、30ms毎に勝手に距離を測定してくれます。距離を計測したい場合はセンサーから計測結果を入手して利用しています。シングル計測を用いる場合に比べて、静止時間が短くなっているように思います。
- 30msの時間が気になりましたが、本機の移動速度はそれほど早くないので、大きな影響はないようです。
- MPU6050も、DMPが連続的に計測を行ってくれるようで、必要な時に情報を取れば、その時点での機体の向きが入手できます。
- Arduinoのコアは一つですが、各センサーがマイコンを持っているので、ある種の並行処理ができている感じでしょうか。どちらのセンサーも安価なのに、小型で相応の性能があって感心します。
割込みについて
- 本プログラムでは、作者の不慣れもあって、割込み処理は用いていません。距離センサーが30ms毎に距離を測定しているので、タイマー割込みで車体の制御を行えるような気もするのですが。
- また、DMPも割込み用のピンがあるので、こちらを用いても車体の制御ができるような気がします。
- 次の製作では、ここらへんにも挑戦したいと思っています。
以上