赤外線センサーの値を読む
ラインセンサーはライントレースを行う時に必須のもので、白と黒を判別するためのものです。
半田面 | センサー側 |
 |
 |
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%となる係数
となり、具体的には、以下のような式になります。
左のモーターのスピード = 比例ゲイン×(左のセンサ値 - 左の黒値) / (左の白値 - 左の黒値)+基本最低スピード
右のモーターのスピード = 比例ゲイン×(右のセンサ値 - 右の黒値) / (右の白値 - 右の黒値)+基本最低スピード
となります。
注:白値はセンサーで白を検出する最大値
黒値はセンサーで黒ほ検出する最少値
|
課題
- 上記の式に応じた比例制御プログラムを作りなさい。
- ロボットが一番早くコースを周回できるようにスピード、比例ゲインを設定しなさい。
- 一番早かったときのラップタイムを記録しなさい。
微分制御考え方
ラインセンサーは2つ用いることにします。それぞれ、黒いラインを挟んで設置されていることとします。
比例制御だけでは、比例ゲインを小さめに設定すれば安定した走りになりますが、急なカーブが曲がれなくなります。大きめにすると、カーブは曲がれますが、ロボットが振られてしまいます。
さらに安定した走りを目指すために微分制御(D制御、differential)を導入します。
同じ灰色の値でも、直線での補正値は少なくてもよいですが、カーブの時は多くする必要があります。ここで、直線かカーブであるかの判断は前回のセンサーの計測値との差を仮定します。つまり、一定時間後に大きく変化したときはカーブであると判断します。カーブかどうかは別問題として、変化量が大きければ制御量を増やします。これを微分制御と言います。
これを数式にしてみると、次のようになります。
回転量 = 比例ゲイン×偏差×turn値の幅が±100%となる係数×変化量係数
となり、具体的には、以下のような式になります。
回転量 = 比例ゲイン×(センサ値 - 黒値) / (白値 - 黒値)+ 微分ゲイン×(センサ値 - ひとつ前のセンサ値)
となります。
課題
- 上記の式に応じた比例制御+微分制御(PD制御)プログラムを作りなさい。
- ロボットが一番早くコースを周回できるようにスピード、比例ゲイン、微分ゲインを設定しなさい。
- 一番早かったときのラップタイムを記録しなさい。
積分制御考え方
ラインセンサーは2つ用いることにします。それぞれ、黒いラインを挟んで設置されていることとします。
PD制御ではそれなりに追従していきますが、応答を速くするように設定すると、それに敏感すぎてぎこちない動作になります。そこで、今までの動作の積分値を用いて少し慣らす項を追加します。この項を積分制御と言います。
これを数式にしてみると、次のようになります。
回転量 = 積分ゲイン*回転量の積分値
となり、具体的には、以下のような式になります。
回転量 = 比例ゲイン×(センサ値 - 黒値) / (白値 - 黒値)+ 微分ゲイン×(センサ値 - ひとつ前のセンサ値)+積分ゲイン*回転量の積分値
となります。
課題
- 上記の式に応じた比例制御+微分制御+積分制御(PID制御)プログラムを作りなさい。
- ロボットが一番早くコースを周回できるようにスピード、比例ゲイン、微分ゲイン、積分ゲインを設定しなさい。
- 一番早かったときのラップタイムを記録しなさい。
動作している動画を見る。