背景
以前のロボットではマイコンを搭載しておりバグの温床になっていました。そのマイコンの仕事は以下のとおりです。
- 大会のルールに準拠した走行・停止を行う(後述)
- ラインセンサや速度、左右輪指示トルクなどを計測
- (一応)アナログコンピュータ無しで走行
このマイコンが行っていた1の動作をマイコンなどという甘えたデバイスなんか使わずに実行することを考えたいと思います。
大会のルール
マイクロマウス・ロボトレース競技はただライントレースするだけではなく、ゴール後に自動的に停止してゴールからスタートの間にとどまる必要があります。その目印として進行方向右側にスタート・ゴールマーカーが設置されています。光センサでマーカーを捉えれば良さそうです。
ところがコースには交差点が設定されているので、ゴールマーカー用のセンサは交差点をマーカーだと誤検知して停止してしまいます。コース上で停止してしまうとリタイアとなります。
ついでに、進行方向左側にもマーカーがあります。これはコーナーの曲率が変わる目印です(コーナーマーカー)。
以上より、大会で完走扱いされる最低限の要求は走行開始後2回目のスタート・ゴールマーカー(以降ゴールマーカー)で停止と言えそうです。
要求分析
スタート・ゴールマーカーの検出(=交差点との区別)
左右のマーカーは同時に存在しないので、交差点とは区別が可能そうです。では同時にセンサが検出した場合はスルーすればよいのでしょうか?
課題
これは実際走らせるとうまくいきません。なぜならば、少しでの斜めに交差点へ侵入したり、交差点自体が斜め(±5度まで許容)だからです。その場合、一瞬交差点以外を検出しゴールを誤検知してしまいます。
なお、この待ち時間は$想定されるズレ距離 <【待ち時間】< 10cm(次のマーカ・交差点までの距離)】$の関係にあり、速度に反比例した値となります。
対策1:少し待ってから判定する
下図のようにマーカーセンサの検出に遅れて状態の判別を行う方法です。交差点とゴールを区別するだけならば、左マーカーセンサが検出する前後一定時間(距離)以内で右マーカーセンサが反応したら交差点。右マーカーセンサが単独で反応したらスタート・ゴールと判定すればよいでしょう。
対策2:センサをずらす
もう一つの方法として、左マーカーセンサを物理的に前に搭載する方法があります。
左マーカーセンサが絶対先に検出できるようにズレていて、左マーカーセンサの検出後一定距離以内に反応した右マーカーセンサを無視すれば交差点とゴールマーカーのみを検出できます。
採用する対策
マイコンを使うのは甘えなので、回路で処理しやすい対策2を選びます。ワンショットタイマー1で遅延させて論理回路で処理すればゴールマーカーのみを検出できるからです。
アナログコンピュータ部分への速度指示
以前のロボットではSPI通信でDACと通信し、アナログコンピュータへ目標速度を電圧値で指示していました。回路のみでSPI通信させるのは面倒なので、DACの代わりにアナログ電圧を直接与えるように改造します。また、アナログコンピュータのF/Bとモータドライバの電流指示を0AにするH/L信号も(元々)あります。
速度指示
まずは速度制御の要件を整理し、状態遷移図を作成しました。
- ボタンを押すと走行開始
- ボタンを押すまでは勝手に走らない
- スタートマーカー検出までスロー走行
- スタート~ゴールの間で走行を開始するため
- スタートマーカーを見逃さないため
- 制御安定前に最大速度で走るのはリスクが有るため
- ゴールマーカーを見つけるまで最高速度走行
- タイムを競う競技のため速度を上げたい
- 速度はコースに合わせて別途調整
- ゴールを通過後一定時間で停止
- ロボットがゴールラインを完全に通過しないとゴール扱いとならないため
- スタート~ゴール内で停止しないと失格となるため
実装
ステートマシン
先程の状態遷移図は単純なのでボタン押下やマーカー検出、一定時間経過を一緒くたに4回数えれば良さそうです。
ロジックICにはカウンタという、H/Lの変化回数を数えるカウンタIC2があります。カウンタICは主に2進数カウンタ2と10進カウンタ2がありますが、0~9のカウントを各々個別のH/L信号で出力する10進カウンタのほうが後段の処理に使いやすいため74HC40172を採用しました。
なお、状態遷移のトリガであるボタン押下やマーカー検出、一定時間経過は全てクロック端子(14番ピン)へ接続することになります。
ゴールマーカー・交差点の処理
左右マーカーセンサはマーカーや交差点を検出するとLに落ちる信号を生成します。
その信号をワンショットタイマーで延長することで、ゴールを誤検出する問題に対策します。
ワンショットタイマー(タイマIC:555)
タイマIC:555は外部に抵抗やコンデンサを外付けすると発振器やタイマーとして動作する超有名なICで、以下のように抵抗やコンデンサを接続するとワンショットタイマーとして動作します。
まず、リセット後にトリガー(L)が入力されると、出力がHになるのと同時にコンデンサCtへ充電が開始されます。Ctの電圧が電源電圧Vccの2/3に達すると出力がLになるの同時にDIS端子により放電され0Vになります。
出力がHになる時間は抵抗RtとコンデンサCtから計算でき、
T_{one} \risingdotseq 1.1R_TC_T[s]
となります。
また、リセット端子が入力(L)されると出力が強制的にLになりコンデンサCtも放電されます。なお、トリガが入力され続けた場合はコンデンサの充電は止まらずに、出力はHを保ちます。
左マーカーセンサのマスク時間生成
ワンショットタイマーの回路のトリガに左マーカーセンサからの信号(/CORNER_WHITE)を入力し、センサが検出中orマスク時間中はHとなる出力(RESET_MODE_CLK)を生成。後段のためにデジタルトラジスタ3で反転(/RESET_MODE_CLK)させます。
なお、マスク時間は速度に応じて可変させる必要があるので、写真のような2連ボリューム4により速度設定用可変抵抗に連動させています。
マスク距離を約50[mm]、設定最高速度を1.5[m/s]。最低速度を0.75[m/s]とするとマスク距離の通過時間は、
\displaylines{
50 [mm]/1.5[m/s] = 33.3[ms] \\
50 [mm]/0.75[m/2] = 66.7[ms] \\
}
とりあえずCを4.7[μF]にしてみると、
\displaylines{
1.1 \times 4.7[ \mu F] \times (6 + 0)[k \Omega] &\risingdotseq 31.02[ms]\\
&= 46.53[mm] \\
&(@1.5[m/s]) \\
1.1 \times 4.7[ \mu F] \times (6 + 6.875)[k \Omega] &\risingdotseq 66.57[ms]\\
&\risingdotseq 49.9[mm] \\
&(@0.75[m/s])
}
6kΩの固定抵抗と6.875kΩ(22kΩと10kΩの並列抵抗)とすれば良いと計算されます。
ゴールマーカー・ボタンの入力回路
ワンショットタイマーの回路のトリガに右マーカーセンサとボタンからの信号(/GOAL_WHITE_/PUSH)を入力5し、リセットには先程のタイマー出力/RESET_MODE_CLK)を入力しています。出力は先のカウンタにつながっています(MODE_CLOCK)。
カウンタへの入力をワンショットタイマー出力とすることで、センサやスイッチの値が暴れて誤カウントするのを防止するとともに、左マーカーセンサが検出しタイマでマスクしている間はカウントが進まないようにしています。
(リセットがLである間、出力は強制的にL)
目標速度の選択とスロー走行
カウンタがMODE_CLOCKを1回もしくは3回数えるとスロー走行が有効になります。2回ではファスト走行が有効になります。
なお、回路図上はフォトカプラとなっていますが、実際はフォトモス(フォトリレー)です。フォトモスはLED側への通電により出力側のMOS-FETを絶縁しながらON-OFF制御します。
これを2つ組み合わせることで、絶縁しながらアナログの目標速度指示電圧を、0[m/s]、スロー走行(0.5[m/s]、ファスト走行(可変抵抗で可変)と切り替えられるようになってます。
ゴール後のスロー走行と停止
ゴール後のスロー走行では停止する必要もあります。そのために、ワンショットタイマーを用いてゴールマーカー検出後に遅延時間を発生させ、遅延出力(SLOW_TO)とスロー走行(GOAL_SLOW)が入っている間6だけスロー走行の指示電圧が入力されます。
遅延時間はスロー走行速度(0.5[m/s])とロボットの全長(約200[mm])から、
\displaylines{
200[mm]/0.5[m/s] = 400[ms] \\
1.1 \times 47[\mu F] \times 7.74[k \Omega] \risingdotseq 400[ms]
}
と計算されるので、タイマーの設定値は47[μF]と7.74[kΩ]としました。
ちなみに、走行中に設定速度を0[m/s]に落としたところ完全に停止はできず、回路の微妙な誤差で少しずつ進んでしまう現象が見られた。なので速度指示が入っている時以外はアンプ毎スイッチOFFにしてしまう対策を入れました7。
最終的な回路図
まとめ・感想
物理的な対策とタイマー回路、カウンタ等を組み合わせることでマイコンの代替ができました。その過程でタイマー回路の動作への理解が深まりました。
大会での動作を見るにバグはほとんどなかった一方、ちょっとしたロジック変更で回路の修正が必要になるので、正直まあまあ面倒に感じることもあったりなかったりしました。
まあ、甘えなかった結果なので受け入れています。
-
単安定マルチバイブレータ。ワンショットマルチバイブレータとも。一瞬でも入力があったら一定時間だけ出力を行う回路。 ↩
-
カウンタICには同期式・非同期式が存在するが、今回の用途ではデジタルなクロックは必要無いので非同期式を採用した。また、オリジナルの4000シリーズである4017ではなく74HC4017を採用したのは手持ち在庫の関係であり特に意味はない。 ↩ ↩2 ↩3 ↩4
-
H/Lの入力によりON/OFFを行う動作に特化したトランジスタ。必要な抵抗が内蔵されており部品点数が削減できる。 ↩
-
2つの可変抵抗の軸が内部で機械的に結合されている可変抵抗。ステレオのボリュームによく採用される。 ↩
-
いわゆるOR回路を構成。 ↩
-
いわゆるAND回路の構成。2つのデジタルトランジスタがONしてはじめてLEDへの通電が行われる。 ↩
-
アナログコンピュータ部の特定の入力端子にHを入力するとアナログコンピュータのF/Bやアンプが有効化される。 ↩