15 ライントレースロボットを作ってみよう

赤外線センサーの値を読む

ラインセンサーはライントレースを行う時に必須のもので、白と黒を判別するためのものです。
半田面センサー側

GNDはグラウンド(0V, ゼロV)、VCCは5Vに繋ぐことになっていますが、3.3Vでも動作するようなので、ADコンバーター入力コネクタにある電源につなげます。OUTはADコンバーター入力につなげます。これはビスとナットを用いて配線します。
配線は隣とか異なるところに接触しないように絶縁テープなどで絶縁を必ずします。手を抜いて、裸の線をブラブラさせておくと、ショートして壊れます。
このセンサーからの信号は電圧で送られてきます。センサーの種類によって、白が大きい値だったり、黒が大きい値だったりしますから、それはプログラム側で判断しなければなりません。
センサーの回路図は以下のようになっています。
回路の簡単な説明

PI1は赤外線LEDです。これは電源から150Ωの抵抗を介して電流が流れて、一定の目に見えない赤外線で光ります。その左側にある対になっている素子はフォトトランジスタと言い、光が入力されると電流が流れる仕組みになっています。もし、赤外線が入力されていない場合(反射光が無い場合、黒のラインを見つけたとか)は、VR1とR2の抵抗に流れる電流がほとんど無いので、TR1のベース電圧は0に近くなります。すると、このトランジスタはスイッチオフ状態になり、R4には電流が流れず0Vに近い電圧になります。
次に、フォトトランジスタに光が入力されると電流が流れ、この電流をIとすると(VR1+R2)Iの電圧降下が生じます。この電圧によりTR1のベースにIbが流れ、R4にはIE=hfe×Ibの電流が流れ、R4の両端にはOUT=IER4の電圧が生じます。この電圧はフォトトランジスタに入射する光の量に比例します。
黒は0V、光が強いと最大Vccの値になることが分ります。

考え方

ラインセンサーは2つ用いることにします。それぞれ、黒いラインを挟んで設置されていることとします。
左図で、下から動いてきたとします。直線部分では両センサーとも白を検出しているはずです。カーブは右側に曲がっているので、右のセンサーが黒を検出します。この場合、ロボットは右に曲がらなければいけないので、右の車輪のスピードを遅くします。遅くしすぎると曲がりすぎて、またコースを外れる可能性があるので、うまく設定します。
黒から脱出したころに遅くした右の車輪のスピードを元に戻します。
楕円コースの場合、この内側のセンサーのみでうまくすれば、ずっと回っていられます。しかしながら、曲率がいつも同じではないので、そう簡単にはいきません。
そのため、もう一つのセンサーが黒を検出したら左の車輪を遅くするようにプログラムします。


次のプログラムは、ロボットの個体差で正しく動かない場合があります(というか、動くはずがないと思うこと)。その場合は定数を適切に直してください。また、上記のアルゴリズムを少し現実に即したように書き換えています。
どこが少し違うか読んで理解してください。
意味も分からず、動いて万歳という人が最近目立つので、必ず理解してください。ここが基礎なので、基礎が出来ていないと、この先で訳が分からなくなります。

単純ライントレース

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 


比例制御の考え方

ラインセンサーは2つ用いることにします。それぞれ、黒いラインを挟んで設置されていることとします。
左図で、左下から動いてきたとします。図の赤点はセンサーの位置とします。直線部分では両センサーとも白を検出しています。カーブは右側に曲がっているので、ラインに入ってしまうと右のセンサーが黒を検出します。黒を検出してしまっては少し動作が遅れてしまい、結局ギザギザな動作になります。ですから、黒のラインに突入する前に動作を始めればスムースな動作が行われます。しかし、モーターのスピードが速い、遅いの二者択一だったら結局は同じことです。
ラインセンサーの値は明るさに応じて数字が返ってきます。センサーの前に白と黒のエッジがあるとすれば、灰色と検出しますし、白が多くて黒が少しならば、黒っぽい白と検出します。ですから、黒っぽさの比率でスピードを決めてあげれば、もう少しスムースな制御が出来そうな気がします。これを比例制御(P制御、proportion)
これを数式にしてみると、次のようになります。

回転量 = 比例ゲイン×偏差×turn値の幅が±100%となる係数

となり、具体的には、以下のような式になります。

左のモーターのスピード = 比例ゲイン×(左のセンサ値 - 左の黒値) / (左の白値 - 左の黒値)+基本最低スピード
右のモーターのスピード = 比例ゲイン×(右のセンサ値 - 右の黒値) / (右の白値 - 右の黒値)+基本最低スピード

となります。

注:白値はセンサーで白を検出する最大値
  黒値はセンサーで黒ほ検出する最少値

課題
  1. 上記の式に応じた比例制御プログラムを作りなさい。
  2. ロボットが一番早くコースを周回できるようにスピード、比例ゲインを設定しなさい。
  3. 一番早かったときのラップタイムを記録しなさい。

微分制御考え方

ラインセンサーは2つ用いることにします。それぞれ、黒いラインを挟んで設置されていることとします。
比例制御だけでは、比例ゲインを小さめに設定すれば安定した走りになりますが、急なカーブが曲がれなくなります。大きめにすると、カーブは曲がれますが、ロボットが振られてしまいます。
さらに安定した走りを目指すために微分制御(D制御、differential)を導入します。
同じ灰色の値でも、直線での補正値は少なくてもよいですが、カーブの時は多くする必要があります。ここで、直線かカーブであるかの判断は前回のセンサーの計測値との差を仮定します。つまり、一定時間後に大きく変化したときはカーブであると判断します。カーブかどうかは別問題として、変化量が大きければ制御量を増やします。これを微分制御と言います。
これを数式にしてみると、次のようになります。

回転量 = 比例ゲイン×偏差×turn値の幅が±100%となる係数×変化量係数

となり、具体的には、以下のような式になります。

回転量 = 比例ゲイン×(センサ値 - 黒値) / (白値 - 黒値)+ 微分ゲイン×(センサ値 - ひとつ前のセンサ値)

となります。

課題
  1. 上記の式に応じた比例制御+微分制御(PD制御)プログラムを作りなさい。
  2. ロボットが一番早くコースを周回できるようにスピード、比例ゲイン、微分ゲインを設定しなさい。
  3. 一番早かったときのラップタイムを記録しなさい。

積分制御考え方

ラインセンサーは2つ用いることにします。それぞれ、黒いラインを挟んで設置されていることとします。
PD制御ではそれなりに追従していきますが、応答を速くするように設定すると、それに敏感すぎてぎこちない動作になります。そこで、今までの動作の積分値を用いて少し慣らす項を追加します。この項を積分制御と言います。
これを数式にしてみると、次のようになります。

回転量 = 積分ゲイン*回転量の積分値

となり、具体的には、以下のような式になります。

回転量 = 比例ゲイン×(センサ値 - 黒値) / (白値 - 黒値)+ 微分ゲイン×(センサ値 - ひとつ前のセンサ値)+積分ゲイン*回転量の積分値

となります。

課題
  1. 上記の式に応じた比例制御+微分制御+積分制御(PID制御)プログラムを作りなさい。
  2. ロボットが一番早くコースを周回できるようにスピード、比例ゲイン、微分ゲイン、積分ゲインを設定しなさい。
  3. 一番早かったときのラップタイムを記録しなさい。
動作している動画を見る。