電気科の苦悩

色々やっています

お手軽!?19石ノーICライントレーサー

ライントレーサを作ろう

 12月上旬、とある行事に出ることになった。そのためには製作物を持っていかなければならず、その地点ではデルタループアンテナは形にはなっているものの、共振点がガバガバになっていて使い物にならなかった。失敗した無用の長物を持っていくよりは、ちゃんと動く何かが作りたくなったので、そこでライントレーサーを作ることにしました。

 ライントレーサーについてざっくりと説明をすると、例えば白線が黒地のコースに引かれていて、そのライン上をトレースするようなマシンと言えます。マイクロマウスみたいな感じです。(マイクロマウスの方が高度です)

 

 

コンセプトは?

 こういう動的なものはコンセプトが一番大事です。今まで何回かライントレーサやそれに類する物を作ってきましたが、それらはマイコンを使って制御していました。マイコンはプログラムで甘えてしまえるので、使いたくありません。それに加えて残り一週間程度しかなく、車体完成後にプログラムを書くのは間に合わないような気がするので、ハードの完成即ちライントレーサーの完成となるノーマイコンが最適でだと思いました。 

 しかし、ノーマイコンも割とありきたりです。すぐ思いつくライントレースのアルゴリズムはセンサーを2つ設置して両方白で前進、片方黒で片側に回転、両方黒で停止というもので、これはセンサーの電圧をディジタル変換すればすぐ実装できます。このディジタル変換で使うありきたりな手段がロジックIC7414または7404、これらのようなインバータかシュミットトリガ付きインバータをセンサ出力に噛ましてLow、Highレベル変換して利用する、というものです。ロジックICを使うのはかっこ悪いですよね?

 というわけで、ノーICもコンセプトとしました。ノーマイコンノーICライントレーサを作ります。

 

ライントレース理論

 最も簡単にライントレースを行う方法はフォトセンサを2つ付けて、センサの電圧値によってモータを制御する方法です。ここではフォトトランジスタの定番素子であるRPR-220を用いてライントレースの方法について考えてみます。なお、他の素子の場合、NMOSは2SK2232、PMOSは2SJ334を使っています。抵抗は適当に近い値を使いましょう。

 RPR-220はフォトダイオードとフォトトランジスタが一つにパッケージ化された素子です。次のように、2つの素子が入っているという事になります。

f:id:kstk25:20181216214834p:plain

片方のダイオード赤外線を発するダイオードで、赤外線が物体に当たってから反射し、もう片方のフォトトランジスタの受光部分に入射します。この受光部分は普通のトランジスタのベース部分と同様に考えることができ、コレクタ-エミッタ間に流れる電流を反射光の強さによって制御することが出来る事を意味します。

 次に、光の反射と物体の色について考えます。ライントレースで重要な事は白か黒を判別することなので、その2色で考えます。

 黒色は光を吸収する性質があり、これは光が全く反射しない事を意味します。逆に白では、光を反射する性質があります。

 以上2つの事実から、黒色に赤外線を入射させると光を吸収することでフォトトランジスタの受光部にトランジスタがオフ状態になる光が入射します。白色に入射させると、光を反射することでトランジスタがオン状態になる光が入射します。

 より整理をすると、黒色時はトランジスタがオフであり、コレクタ-エミッタ間電圧は高い電圧(電流が流れにくいのでほぼ電源電圧に等しい)となり、白色時はトランジスタがオンであり、ほとんどショートしているものとしてみなせるのでコレクタ-エミッタ間の電圧はおよそ0[V]となります。

 

f:id:kstk25:20181216220537p:plain

センサ回路の一例として上記のような回路が考えられます。可変抵抗によってセンサの感度を調節しますが、デフォルトの値である11kΩで十分動作するので調節する必要はありません。2つのフォトトランジスタのコレクタ-エミッタ間電圧を次段に送ることでライントレース用の信号を使います。

 白と黒の判定を電圧に変換することが上の回路により出来ました。次はこの電圧を利用してモータの制御をすることを考えます。

 このままモータの片側端子を接地したものに信号線をくっつければ、白だと電圧低でモータ停止、黒だと電圧高でモータ直進になるので、うまくやれば動きそうですが、モータを駆動させる電流を取り出すと、入出力インピーダンスの関係からセンサ回路部分に悪影響が出そうな気がします。そこで、センサの出力をバッファに入力し、駆動能力を向上させます。このバッファの所がAD変換をする部分であり、今回はインバータを用います。

 センサの出力をインバータ(NOTゲート)に入力すると、しきい値電圧よりも大きい入力ではLレベルが出力され、しきい値電圧よりも小さい入力ならばHレベルが出力されます。Lレベルは0 V、Hレベルは電源電圧に相当し、電源電圧はモータの定格を考慮して3.3 Vで設計します。インバータ部分はMOSFETを用いて自作します。そういう縛りなので・・・

f:id:kstk25:20181216223011p:plain

 Vcc側にpMOS、GND側にnMOSを配置することで、ソース電圧をVccかGNDにすることで、ゲート電圧がソース電圧に対してどのような関係になるのかを制御します。ゲートにHレベルが来ると下のNMOSがONになり、出力はLレベルとなり、Hレベルがゲートに来ると上のPMOSがONになり、出力はHレベルになります。このようにしてインバータを作成します。

 通常の場合はここに7404または7414などのインバータICを入れます。しかしインバータICの欠点は出力最大電流が74HC14APの場合25 mAと非常に小さく、後段にモータを接続してもモータを駆動させる電流未満となり動きません。なので、ICを挟んだあとはトランジスタでドライブさせて駆動能力を上げる事が普通です。

 自作インバータの素晴らしい所は出力電流が非常に高く設定できるという点です。この場合、回路図からモータをドライブさせる際にはVcc側に接続されてPMOSのソースからドレインに向かって電流が流れて出力されます。即ち、PMOSのドライブ能力によって左右されます。今回用いたPMOS(2SJ334)のドレイン電流の最大定格は30 Aなので、駆動能力は30Aになります。これは74HC14APを用いる時と比べるとおよそ1000倍の駆動能力になる訳です。

 しかし、回路図を見るとなぜか50Ω抵抗が挿入されています。これは回路図作成時にセンサの値がLレベルとHレベルの中間の値付近になった時、両方のトランジスタがオンとなり貫通電流がVccからGNDに流れるため、その制限として入れたものです。貫通電流の制限に確かになっているのですが、PMOSドライブ時にも電源側の50Ω抵抗が存在する影響で電流が制限され、モータをドライブできる電流を下回ってしまいました。従って、貫通電流対策としては、Vcc側の抵抗を除去し、GND側の抵抗のみを残した方が良かったことになります。

 これをセンサー2つなので、2回路用意したものが上回路で、それぞれSig1、Sig2としてモータに入力します。しかし、上記の原因によりPMOSでドライブ不可能になったため、NMOSでドライブさせることにします。ドライブ後の回路図は次のようになります。

f:id:kstk25:20181216230327p:plain

ライントレーサの進行方向を基準にして、Sig1が左、Sig2が右とする時、左センサ信号からは黒地を0 V、白地を3.3 Vで返してくるので、右センサが脱輪して黒を検知、左センサは白検知の場合、左センサの出力を右側のモータに接続すれば脱輪した右側のモータが回転し、両センサが白になるまで回転を続けます。同様に,右センサ出力を左モータに接続すれば、左側脱輪時に左モータが回転し、両側白になるまで回転し続けます。両センサが白を検知した場合、Sig1とSig2は3.3 V(Hレベル)であるため、NMOSは両方ONになり、モータは両方とも回転して直進動作となります。両方黒を検知した場合はNMOSがオフ状態となり、モータの片側電圧が浮くため、モータが停止します。即ちドントケアと同じ状態となります。両方黒の処理は後にでてくる問題を解決する糸口となります。

 以上の回路を構成することで、両側のセンサが黒地にならなければ正しくトレースすることができます。しかし角度が90度のようなキツいカーブに直面すると、途中まではトレースしますが、90度を曲がり切る前に脱輪して停止動作をとります。

 ライントレーサ大会では普通90度回転があるのでこのままでは完走できません。急いで修正をする必要があります。

 

90度回転を可能にする

 90度回転の実装のために、2つのセンサが黒地であるときの制御をトランジスタ論理回路を組むことで解決します。脱輪の原因は、旋回の方法に問題があったからです。旋回の実装時、片方のモータだけを動かすことで旋回させていたので、どうしても旋回の必要があるところで車体の位置がラインから外れてしまうという事が詳しい原因です。

 これを解決するためには旋回動作を車体がその場にとどまった状態で行えばよいということになります。例えば時計回りの回転の場合、左モータを正回転させて回転させているので、右モータは逆回転させれば車体はその場に留まった状態で回転することができます。このような旋回を超信地旋回と呼び、結局90度回転問題は超信地旋回を実装させるためにはどういう回路を組めば良いのか?という問題に変わります。 私はこの結論に至った時、マイコンを使えばよかったと後悔しました。しかし縛りプレイをしているのでどうしようもありません。頭を使って考えていきましょう。

  前の章で述べたように、両センサ黒判定時、つまり(左センサ,右センサ)とすると(0,0)の時の動作を超信地旋回にすればいいわけです。しかし、回路図的には片方のモータを接地している関係上、正回転しか出来ないわけで、そもそも黒地を検知すると停止動作をします。これを(0,0)入力時だけ片側モータを逆回転、もう片方を正回転させるという回路に変更します。

 (0,0)ではモータの片側端子は浮いています。つまり電圧が不定です。ここに(0,0)が入ったときだけ正回転するような信号線を追加します。(0,0)が入った時だけVccから電源を引き込むイメージをします。論理ゲートでそのような動作をする回路があります。それはNORゲートです。NORは(0,0)の時だけ1を出力します。この処理を実装するためにPMOSを2段に直列接続しています。従って、片側モータの回路を以下のように修正します。

f:id:kstk25:20181216234210p:plain

この回路により、(0,0)でも片方のモータを正回転させることができます。

 次に、もう片方のモータを逆回転させる回路を考えます。

f:id:kstk25:20181216234428p:plain

見るだけでげんなりする回路です。説明するのも面倒です。右側の回路でSig1とSig2のNORとORをとります。これとQ15のPMOSによって(0,0)だけ逆回転を実装するという事にしています。Q9,Q12の塊とQ8,Q11の塊に注目すると、これらの塊のゲートはPMOSとNMOSで共通になっており、HレベルでGNDが導通、LレベルでVccが導通することになっています。2つの塊のゲート入力の間にはNORとORの出力が入っている、つまり互いに否定の関係になっているので、片側のゲートがHレベルなら片側のゲートにはLレベルが入力され、モータの端子はVcc-GNDまたはGND-Vccの2パターンの電圧のかかり方が存在することになります。これによってモータの正回転と逆回転を実装しています。VR4はモータの回転速度を変更するための抵抗です。

 上記の2つの回路によって超信地旋回を実装しました。しかし大会当日に、時計回りに90度回転があるのか反時計回りに90度回転があるのかでトレース出来ない場合があることに気づき、少し改良をしてジャンパ線でモードの切り替えができるようにして出場しました。結果は完走できました。完走した人達の中では順位は最下位でしたが、個人的な目標を完走する事にしていたので満足しています。

 最後に回路の全体を載せます。実際に作る方はおかしな所を直して実装してみてください。不具合については自己責任でお願いします。何が起きても私は責任を取りません。

f:id:kstk25:20181216235503p:plain

 

 結果的にFETを19石使っているので、19石ライントレーサという訳です。フォトTrを含めると21石になります。