1: 2010-10-05 (火) 18:22:05 eid7gud | 現: 2010-10-13 (水) 10:30:00 eid7gud | ||
---|---|---|---|
Line 1: | Line 1: | ||
TITLE:FDIII-HC Starter Kit Guide Chapter9.2 | TITLE:FDIII-HC Starter Kit Guide Chapter9.2 | ||
- | *プログラミング [#y7235230] | + | *プログラミング① [#y7235230] |
**赤外線反射センサの値を見る [#z35247e6] | **赤外線反射センサの値を見る [#z35247e6] | ||
- | 先ず白い地面と黒い地面で赤外線反射センサの値がどのように変化するかを確認します。 | + | 先ず地面が白い場合と黒い場合で赤外線反射センサの値がどのように変化するかを確認します。 |
- | GCC Developer Liteを起動します。以下を入力します。 | + | GCC Developer Liteを起動し、以下を入力します。 |
#include <fd.h> | #include <fd.h> | ||
#define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} | #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} | ||
+ | |||
void main (void) { | void main (void) { | ||
uint8_t ReadData; | uint8_t ReadData; | ||
+ | |||
fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); | fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); | ||
+ | |||
fd_DXSetEndlessTurn (1, 1); | fd_DXSetEndlessTurn (1, 1); | ||
fd_DXSetEndlessTurn (2, 1); | fd_DXSetEndlessTurn (2, 1); | ||
+ | |||
while (1) { | while (1) { | ||
fd_DXReadByteData (100, 28, &ReadData); | fd_DXReadByteData (100, 28, &ReadData); | ||
fd_printf ("%3d\r", RightData); | fd_printf ("%3d\r", RightData); | ||
+ | KEY_QUIT; | ||
} | } | ||
} | } | ||
Line 29: | Line 31: | ||
如何でしょうか?~ | 如何でしょうか?~ | ||
おそらく赤外線反射センサを白い地面の上に置いても、黒い地面の上に置いても値は255と表示されるでしょう。~ | おそらく赤外線反射センサを白い地面の上に置いても、黒い地面の上に置いても値は255と表示されるでしょう。~ | ||
- | 地面との距離が近過ぎて、地面が白くても黒くても値が最大の255に鳴ってしまっています。 | + | 地面との距離が近過ぎて、地面が白くても黒くても最大値の255になってしまいます。 |
それではセンサを地面から15cmくらい離してみてください。~ | それではセンサを地面から15cmくらい離してみてください。~ | ||
- | 白い地面の上にいる時と黒い地面の上にいる時で値が変わるのが分かるでしょうか?~ | + | 白い地面の上にいる時と黒い地面の上にいる時で値が変わるのが分かるでしょうか? |
+ | |||
+ | ならばセンサを地上から15cm離した位置に固定すれば良いということになりますが、キリンのように首が長いロボットを作るのは大変ですし、バランスも悪いです。 | ||
+ | |||
+ | **赤外線の照射量を調整する [#ld2003c2] | ||
+ | |||
+ | 先ず赤外線反射センサの原理を説明します。 | ||
+ | |||
+ | AX-S1を見ると3方向にそれぞれ2つの丸い物が並んで付いています。その2つの丸いものを良く見ると片方は黒く、片方は透明です。~ | ||
+ | 黒い方から赤外線が照射されます。照射された赤外線は直進し、その先に物体があると反射します。~ | ||
+ | 反射して戻ってきた赤外線の量を透明の方が測定します。~ | ||
+ | これによって、対象との距離や色を判別します。 | ||
+ | |||
+ | #ref(line_2.png, 100%); | ||
+ | #ref(line_3.png, 100%); | ||
+ | この測定された赤外線の量を0~255の値に変換した値を、今私たちは見ています。 | ||
+ | |||
+ | 跳ね返ってくる赤外線の量が多すぎて飽和してしまっているのであれば、照射する赤外線の量を減らせば良いのです。 | ||
+ | 物理的に赤外線照射部を隠すのが一番簡単でしょう。 | ||
+ | |||
+ | #ref("line_4.png"); | ||
+ | |||
+ | 黒いビニールテープで少しだけ隙間残して赤外線照射部を隠しました。 | ||
+ | どれくらい隠すかは、赤外線反射センサの値を見ながら調節してください。~ | ||
+ | 上図の場合、白い地面では約120、黒い地面では約20という値になりました。~ | ||
+ | これで白い地面の上にいるか、黒い地面の上にいるかを判断することができるようになりました。 | ||
+ | |||
+ | **ライントレースの方法 [#if587e8b] | ||
+ | |||
+ | ライントレースは黒いラインに沿って進みます。 | ||
+ | それを実現するために、最初は赤外線反射センサが黒いラインの上にあり、もし白い地面の上に来たら黒いラインへ戻るようにタイヤを動かせば良い、という発想がおそらく最初に浮かぶでしょう。~ | ||
+ | |||
+ | #ref("line_5.png"); | ||
+ | |||
+ | 図のように黒いラインから右に外れたら左へ、左に外れたら右へ進めば良いのですが、右に外れたか左に外れたかをどうやって判断すれば良いでしょうか?~ | ||
+ | |||
+ | 赤外線反射センサ1つでは不可能でしょう。 | ||
+ | 勿論2つあれば可能ですが、今回はどうにか1つでライントレースをしたいです。 | ||
+ | |||
+ | 赤外線反射センサ1つでライントレースをする方法としては、「黒いラインをトレース」するのではなく、「黒と白の境界線をトレース」すれば良いのです。 | ||
+ | 例えば左側の白い地面は忘れ、黒いラインの右側の境界線をトレースするとします。 | ||
+ | |||
+ | #ref("line_6.png"); | ||
+ | |||
+ | 図のように地面が白い時は左に、黒い時は右に進むことで黒と白の境界線をトレースすることができます。 | ||
+ | |||
+ | **プログラムの作成 [#c31fd408] | ||
+ | Chapter1から進んできた方ならプログラムの作成はもう簡単でしょう。~ | ||
+ | そうでない方はChapter8を先に読まれることをお勧めします。 | ||
+ | |||
+ | if (ReadData < 70) { | ||
+ | fd_DXWriteWordData (1, 32, 0); | ||
+ | fd_DXWriteWordData (2, 32, 400); | ||
+ | } else { | ||
+ | fd_DXWriteWordData (1, 32, (1 << 10) + 400); | ||
+ | fd_DXWriteWordData (2, 32, 0); | ||
+ | } | ||
+ | |||
+ | while文の中に上記を入力します。 | ||
+ | |||
+ | もしセンサの値が50未満(地面が黒)なら左のタイヤだけを回転させ右へ、それ以外(地面が白)なら右のタイヤだけを回転させ左へ進みます。 | ||
+ | |||
+ | **プログラム完成 [#w337fe6d] | ||
+ | |||
+ | 以上でプログラムは完成です。 | ||
+ | |||
+ | #include <fd.h> | ||
+ | #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} | ||
+ | |||
+ | void main (void) { | ||
+ | uint8_t ReadData; | ||
+ | |||
+ | fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); | ||
+ | |||
+ | fd_DXSetEndlessTurn (1, 1); | ||
+ | fd_DXSetEndlessTurn (2, 1); | ||
+ | |||
+ | while (1) { | ||
+ | fd_DXReadByteData (100, 28, &ReadData); | ||
+ | fd_printf ("%3d\r", ReadData); | ||
+ | if (ReadData < 70) { | ||
+ | fd_DXWriteWordData (1, 32, 0); | ||
+ | fd_DXWriteWordData (2, 32, 400); | ||
+ | } else { | ||
+ | fd_DXWriteWordData (1, 32, (1 << 10) + 400); | ||
+ | fd_DXWriteWordData (2, 32, 0); | ||
+ | } | ||
+ | KEY_QUIT; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ムービーではスピードを速く設定しています。 | ||
+ | |||
+ | #html(<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/OfmgpByU0xA?fs=1&hl=ja_JP&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/OfmgpByU0xA?fs=1&hl=ja_JP&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>); | ||
+ | |||
+ | |||
+ | [[次のチャプターへ>FDIII-HC Starter Kit Guide Chapter9.3]]~ | ||
+ | |||
+ | [[FDIII-HC Starter Kit Guide]]に戻る |