2: 2010-10-05 (火) 19:53:19 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); | ||
Line 30: | Line 31: | ||
如何でしょうか?~ | 如何でしょうか?~ | ||
おそらく赤外線反射センサを白い地面の上に置いても、黒い地面の上に置いても値は255と表示されるでしょう。~ | おそらく赤外線反射センサを白い地面の上に置いても、黒い地面の上に置いても値は255と表示されるでしょう。~ | ||
- | 地面との距離が近過ぎて、地面が白くても黒くても、最大値の255になってしまいます。 | + | 地面との距離が近過ぎて、地面が白くても黒くても最大値の255になってしまいます。 |
それではセンサを地面から15cmくらい離してみてください。~ | それではセンサを地面から15cmくらい離してみてください。~ | ||
- | 白い地面の上にいる時と黒い地面の上にいる時で値が変わるのが分かるでしょうか?~ | + | 白い地面の上にいる時と黒い地面の上にいる時で値が変わるのが分かるでしょうか? |
ならばセンサを地上から15cm離した位置に固定すれば良いということになりますが、キリンのように首が長いロボットを作るのは大変ですし、バランスも悪いです。 | ならばセンサを地上から15cm離した位置に固定すれば良いということになりますが、キリンのように首が長いロボットを作るのは大変ですし、バランスも悪いです。 | ||
Line 40: | Line 42: | ||
先ず赤外線反射センサの原理を説明します。 | 先ず赤外線反射センサの原理を説明します。 | ||
- | AX-S1を見ると3箇所に2つの丸い物が並んでいます。その2つの丸いものを良く見ると片方は黒く、片方は透明です。~ | + | AX-S1を見ると3方向にそれぞれ2つの丸い物が並んで付いています。その2つの丸いものを良く見ると片方は黒く、片方は透明です。~ |
黒い方から赤外線が照射されます。照射された赤外線は直進し、その先に物体があると反射します。~ | 黒い方から赤外線が照射されます。照射された赤外線は直進し、その先に物体があると反射します。~ | ||
反射して戻ってきた赤外線の量を透明の方が測定します。~ | 反射して戻ってきた赤外線の量を透明の方が測定します。~ | ||
Line 49: | Line 51: | ||
この測定された赤外線の量を0~255の値に変換した値を、今私たちは見ています。 | この測定された赤外線の量を0~255の値に変換した値を、今私たちは見ています。 | ||
- | 跳ね返ってくる赤外線の量が多すぎて飽和してしまっているのであれば、元々照射する赤外線の量を減らせば良いのです。 | + | 跳ね返ってくる赤外線の量が多すぎて飽和してしまっているのであれば、照射する赤外線の量を減らせば良いのです。 |
物理的に赤外線照射部を隠すのが一番簡単でしょう。 | 物理的に赤外線照射部を隠すのが一番簡単でしょう。 | ||
#ref("line_4.png"); | #ref("line_4.png"); | ||
- | 黒いビニールテープで赤外線照射部を隠し、少しだけ隙間を開けました。 | + | 黒いビニールテープで少しだけ隙間残して赤外線照射部を隠しました。 |
- | 隠す量は値を見ながら調節してください。~ | + | どれくらい隠すかは、赤外線反射センサの値を見ながら調節してください。~ |
- | 上図の場合、白い地面では約120、黒い地面では約10という値になりました。~ | + | 上図の場合、白い地面では約120、黒い地面では約20という値になりました。~ |
- | これで今白い地面の上か黒い地面の上かを判断することができるようになりました。 | + | これで白い地面の上にいるか、黒い地面の上にいるかを判断することができるようになりました。 |
**ライントレースの方法 [#if587e8b] | **ライントレースの方法 [#if587e8b] | ||
Line 64: | Line 66: | ||
それを実現するために、最初は赤外線反射センサが黒いラインの上にあり、もし白い地面の上に来たら黒いラインへ戻るようにタイヤを動かせば良い、という発想がおそらく最初に浮かぶでしょう。~ | それを実現するために、最初は赤外線反射センサが黒いラインの上にあり、もし白い地面の上に来たら黒いラインへ戻るようにタイヤを動かせば良い、という発想がおそらく最初に浮かぶでしょう。~ | ||
- | #ref("line_4"); | + | #ref("line_5.png"); |
図のように黒いラインから右に外れたら左へ、左に外れたら右へ進めば良いのですが、右に外れたか左に外れたかをどうやって判断すれば良いでしょうか?~ | 図のように黒いラインから右に外れたら左へ、左に外れたら右へ進めば良いのですが、右に外れたか左に外れたかをどうやって判断すれば良いでしょうか?~ | ||
Line 74: | Line 76: | ||
例えば左側の白い地面は忘れ、黒いラインの右側の境界線をトレースするとします。 | 例えば左側の白い地面は忘れ、黒いラインの右側の境界線をトレースするとします。 | ||
- | #ref("line_4"); | + | #ref("line_6.png"); |
- | 図のように地面が白い時は左に、黒い時は右に進みます。 | + | 図のように地面が白い時は左に、黒い時は右に進むことで黒と白の境界線をトレースすることができます。 |
**プログラムの作成 [#c31fd408] | **プログラムの作成 [#c31fd408] | ||
- | プログラムの作成はもう簡単だと思います。 | + | Chapter1から進んできた方ならプログラムの作成はもう簡単でしょう。~ |
+ | そうでない方はChapter8を先に読まれることをお勧めします。 | ||
- | if (ReadData < 50) { | + | if (ReadData < 70) { |
fd_DXWriteWordData (1, 32, 0); | fd_DXWriteWordData (1, 32, 0); | ||
fd_DXWriteWordData (2, 32, 400); | fd_DXWriteWordData (2, 32, 400); | ||
} else { | } else { | ||
- | fd_DXWriteWordData (1, 32, 400+1023); | + | fd_DXWriteWordData (1, 32, (1 << 10) + 400); |
fd_DXWriteWordData (2, 32, 0); | fd_DXWriteWordData (2, 32, 0); | ||
} | } | ||
Line 99: | Line 102: | ||
#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", ReadData); | fd_printf ("%3d\r", ReadData); | ||
- | if (ReadData < 50) { | + | if (ReadData < 70) { |
fd_DXWriteWordData (1, 32, 0); | fd_DXWriteWordData (1, 32, 0); | ||
fd_DXWriteWordData (2, 32, 400); | fd_DXWriteWordData (2, 32, 400); | ||
} else { | } else { | ||
- | fd_DXWriteWordData (1, 32, 400+1023); | + | fd_DXWriteWordData (1, 32, (1 << 10) + 400); |
fd_DXWriteWordData (2, 32, 0); | fd_DXWriteWordData (2, 32, 0); | ||
} | } | ||
Line 121: | Line 124: | ||
} | } | ||
} | } | ||
+ | |||
+ | ムービーではスピードを速く設定しています。 | ||
+ | |||
+ | #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>); | ||