1: 2011-07-14 (木) 14:28:13 yoshida[5] [6] | 現: 2011-07-15 (金) 19:26:15 yoshida[5] [7] | ||
---|---|---|---|
Line 1: | Line 1: | ||
TITLE:ライントレースロボットのプログラミング | TITLE:ライントレースロボットのプログラミング | ||
- | **プログラムの改造 [#g710f954] | + | **プログラムの修正 [#g710f954] |
+ | 相撲ロボットのプログラムのままではライントレースすることはできませんので、プログラムの修正を行います。 | ||
***赤外線反射センサの値を確認 [#k8495ea4] | ***赤外線反射センサの値を確認 [#k8495ea4] | ||
赤外線反射センサで地面の白と黒を判断するので、センサの値がどのように変化するのかを確認します。~ | 赤外線反射センサで地面の白と黒を判断するので、センサの値がどのように変化するのかを確認します。~ | ||
Line 23: | Line 25: | ||
}} | }} | ||
[[DX_ReadByteData>FDIIILIB#t86b5caf]]で赤外線反射センサの値を取得し、[[fd_printf>FDIIILIB#p02de6dd]]で値を表示しています。~ | [[DX_ReadByteData>FDIIILIB#t86b5caf]]で赤外線反射センサの値を取得し、[[fd_printf>FDIIILIB#p02de6dd]]で値を表示しています。~ | ||
- | プログラムをビルドして、FDIII-HCに書込んで実行してみましょう。 | + | ファイル名をIRSensor.cとして保存し、プログラムをビルドして、実行してみましょう。 |
赤外線反射センサと地面の距離が近ければ地面の色に関わらず値は255となっているのではないでしょうか。距離を離すと地面の色によりセンサの値が変わることが分かります。~ | 赤外線反射センサと地面の距離が近ければ地面の色に関わらず値は255となっているのではないでしょうか。距離を離すと地面の色によりセンサの値が変わることが分かります。~ | ||
Line 50: | Line 52: | ||
上図の場合、白い地面では約120、黒い地面では約20という値になりました。~ | 上図の場合、白い地面では約120、黒い地面では約20という値になりました。~ | ||
これで白い地面の上にいるか、黒い地面の上にいるかを判断することができるようになりました。 | これで白い地面の上にいるか、黒い地面の上にいるかを判断することができるようになりました。 | ||
+ | |||
+ | **ライントレース方法 [#x9980cd4] | ||
+ | |||
+ | ライントレースは黒いラインに沿って進みます。 | ||
+ | 赤外線反射センサは黒いラインの上から始まりますので、もし白い地面を検知したら黒いラインへ戻るようにタイヤを動かすことで、ライントレースすることが可能です。 | ||
+ | |||
+ | #ref("line_5.png"); | ||
+ | |||
+ | 図のように黒いラインから右に外れたら左へ、左に外れたら右へ進めば良いのですが、残念ながら赤外線反射センサが1つしかありませんので、実は右に外れたのか、左に外れたのかを判断することができません。~ | ||
+ | 勿論赤外線反射センサが2つあれば判断することは可能ですが、今回は1つしかありませんの別の方法でライントレースすることを考えます。 | ||
+ | |||
+ | 赤外線反射センサ1つでライントレースをする方法としては、「黒いラインをトレース」するのではなく、「黒と白の境界線をトレース」すれば良いのです。 | ||
+ | 例えば左側の白い地面は忘れ、黒いラインの右側の境界線をトレースするとします。 | ||
+ | |||
+ | #ref("line_6.png"); | ||
+ | |||
+ | 図のように地面が白い時は左に、黒い時は右に進むことで黒と白の境界線をトレースすることができます。 | ||
+ | |||
+ | **プログラムの修正 [#scec695a] | ||
+ | [[赤外線の照射量を調整する>#q5c2328c]]で、赤外線反射センサの値は白い地面では約120、黒い地面では約20と計測できましたので、白い地面と黒い地面の閾値は中間の値(70)としますが、赤外線の照射量の抑止程度によりセンサ値は異なりますので、ここでのセンサの値は参考にしないでください。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | #include <fd.h> | ||
+ | // アクチュエータ操作 | ||
+ | void Direction (short left, short right) { | ||
+ | fd_DXSetSpeed (1, -right); | ||
+ | fd_DXSetSpeed (2, left); | ||
+ | } | ||
+ | // メイン関数 | ||
+ | void main (void) { | ||
+ | uint8_t GroundData; | ||
+ | |||
+ | fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); | ||
+ | fd_SetUVThreshold (7.4); | ||
+ | DX_ChangeBaudrate (1000000); | ||
+ | |||
+ | fd_DXSetEndlessTurn (1, true); | ||
+ | fd_DXSetEndlessTurn (2, true); | ||
+ | |||
+ | while (!fd_GetPB () && !fd_rx_buff ()) { | ||
+ | DX_ReadByteData (100, 28, &GroundData, 10, NULL); | ||
+ | fd_printf ("ground: %3d\r", GroundData); | ||
+ | if (GroundData < 70) { // 黒検知 | ||
+ | Direction (400, 100); // 右斜め前方 | ||
+ | } else { | ||
+ | Direction (100, 400); // 左斜め前方 | ||
+ | } | ||
+ | fd_Wait (10); | ||
+ | } | ||
+ | Direction (0, 0); // 停止 | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | 赤外線反射センサの値が閾値未満であれば地面を黒として、右斜め前方へ進みます。センサの値が閾値以上であれば地面を白として、左斜め前方へ進みます。 | ||
+ | |||
+ | このプログラムでは急なカーブやループには対応できず、ラインを逸脱したり見当違いの方向へ走ってしまう可能性がありますので、プログラムの更なる改造を行います。 | ||
+ | |||
+ | [[次のチャプターへ>FDIIICHAPTER9.3]] | ||
+ | |||
+ | [[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]に戻る |
(This host) = http://www.besttechnology.co.jp