パワーポイントには、まだまだネタが残っているのですが、ミスリードによって構築されたと思しき戦術に対する必勝法的なものは、オープン大会で対戦なり、観戦なりして頂けば一目瞭然ですので、そちらを楽しみにして頂く事として、”アウトオブバウンズ”対策について解説して一旦、ミスリードシリーズは締めたいと思います。
ポーリング
プログラムが一巡する途中でセンサ状態を確認する方法です。
ざっくりとしたフローチャートですが、こんな感じです。
ロボットは、この図の"ボールを追いかける"処理の間はセンサを見ていない事になります。
ラインセンサをみるタイミング(場所と範囲)をオレンジ色で示した図です。
この図はラインを確認できた場合です。
この図は閾値が正しければラインを確認できた場合です。
この図が、ラインを確認できなかった場合です。
この例の通り、ラインを確認できずに外にでて行ったり、きちんとアウトオブバウンズ処理ができたりする、”時々症状”になるので初心者には原因特定しにくいトラブルの代表です。
対処法は下図の様にセンサの間隔を詰めることです。
センサの間隔を詰める方法は?
①速度を落とす
②センサの数を増やして2段構え、3段構えの構造にして読み落としを防ぐ
③タイマ割込みを使って割込み処理でセンサを確認する
スピード命の皆さんには速度を落とすと言う選択肢は無いでしょうから②について説明します。
スピードを上げれば、制動距離は長くなります。
アウトオブバウンズにならない為には、制動距離がロボットの大きさを超えることはできません。
この動画の様に、厳密な制動距離は”ラインセンサとロボットの端”の距離になります。
(※デバッグ中の動画の為、デバッグ用LEDと電圧計が点灯しています。)
読み落としを防ぐと言うアプローチは悪くありまんが、結局のところ確実にラインを捉えられるn個目のセンサ取付位置とロボットの端までの距離が制動距離となるので、最大速度を出したいと言う要求仕様に対して矛盾を抱えている方法と言えます。
③は前出のポーリング方式とは異なる割込み方式によるセンサ確認方法です。
タイマ割込み処理によってセンサの読み取り間隔を一定かつ、読み取りミスが起きない間隔に設定する事ができるのでアプローチとしては悪くありませんが、割込み関数内でアナログセンサを確認するにはA/D変換時間は最低メイン関数を止めていますのでタイマ割込みの間隔とメイン関数の処理能力はトレードオフの関係になります。
ですので”出るのが怖いから”と言ってタイマ割込みの能力の限界(最小時間)を攻めるのではなく、必要な割込み間隔を算出する必要があります。
自分のロボットの最高速度で”1秒間に何ミリ進むか”を測定すれば、白線の幅がルール規定にて幅20mmとなっているので、センサがライン上にある時間が計算できます。
単位時間移動距離 | 2000 | mm |
速度 | 7.2 | km/h |
2 | m/s | |
白線幅 | 20 | mm |
時間 | 10 | ms |
このように図示すると分かりやすいのでお勧めです。
ラインセンサの判定閾値を超える時間内に必ず読み取れる様に割込み処理できればOKです。図の様に2回読み取りができれば、それ以上タイマ割込みの間隔を詰める必要はありません。
アウトオブバウンズ対策の最適解
Arduinoを使用しているなら、”アナログ比較器割込み”一択ですね。
この図はOYA-G 2021モデル仕様書の一部ですがArduino UNO 、NANOでは”6”にセンサ閾値電圧を与えて、”7”にラインセンサ出力を接続します。
この方法は外部割込み端子の利用とかハードウエア割込みとか言われる方法で、マイコンのコアとは別の”アナログ比較器”と言うハードウエアが独立してラインセンサの閾値越えを監視しますのでメイン関数の処理能力低下は一切ありません。
この方法では、コートとラインのセンサ出力をテスターなどで測定して閾値を決め、ボリュームで”6”ピンへの電圧を調整する必要がありますが、ラインセンサは端っこに1個つけるだけで絶対にラインを見落とさないので、制動距離も最大にできます。
ですので安心してトップスピードが出せるロボットに仕上がります。
アナログ比較器割込み非搭載のマイコンでも外部割込み端子はありますので、コンパレータやオペアンプと組み合わせることで同じことができます。
ちなみに前出の動画はアナログ比較器割込みで電磁ブレーキを作動させる動作確認をしているところです。
出典:Atmega328データシート