- 追加された行はこの色です。
- 削除された行はこの色です。
&size(20){目次};
#contents
*課題について [#m065738c]
**課題の内容 [#g83bcdda]
#ref(./2017a-mission2.jpg,100%,misson2)
「経路を黒い線にそって動くロボットを作成せよ」という課題である。
課題の内容に関して詳しくはこちら[[課題2>2017a/Mission2]]
私の選んだコースは【E地点右折コース】である
課題の内容に関して詳しくはこちら[[課題2>2017a/Mission2]]~
私の選んだコースは【E地点右折コース】である。
*ロボット本体について [#c15a6c7d]
ロボット本体に関しては、なるべく小型化し、センサーとタイヤの位置が絶妙になるよう試行錯誤した。~
できるだけシンプルで小型にすることで小回りがきくようになった。
*プログラムについて [#j87a8741]
プログラムについてはだれが見てもわかりやすく、できるだけシンプルにするよう心掛けた。
**define、sub、voidなどの説明 [#uf19c654]
右左折や旋回などの基本的な動き、基本的な値には%%%define%%%を用いた。~
ラインをたどるなどの小さなプログラムのかたまりには%%%sub%%%を用い、引数を使う場合には%%%void%%%を使用した。~
この3つを使い分けることによって、シンプルなプログラムにすることができた。
***define [#c6937f6a]
#define LS_THRESHOLD 45 //光センサのしきい値
#define LINE_TIME 30 //交差点の感知時間
#define senkai_right OnFwd(OUT_A);OnRev(OUT_C);//右旋回
#define senkai_left OnFwd(OUT_C);OnRev(OUT_A); //左旋回
#define turn_right OnFwd(OUT_A);Off(OUT_C);//右折
#define turn_left Off(OUT_A);OnFwd(OUT_C);//左折
#define fwd OnFwd(OUT_AC);//直進
***void [#x6265257]
void LINE_right(int time) //線の右側を走る
{
ClearTimer(0);
while(FastTimer(0) < time){
if(SENSOR_2 > LS_THRESHOLD) {
turn_left;
ClearTimer(0);
}else{
turn_right;
}
Wait(1); }
Off(OUT_AC);
ClearTimer(0);
}
void LINE_left(int time) //線の左側を走る
{
ClearTimer(0);
while(FastTimer(0) < time){
if(SENSOR_2 > LS_THRESHOLD) {
turn_right;
ClearTimer(0);
}else{
turn_left;
}
Wait(1); }
Off(OUT_AC);
ClearTimer(0);
}
***sub [#j88ab527]
sub SEARCH_LINE_turnright() //センサーが線を見つけるまで右に曲がる
{
while(SENSOR_2 > LS_THRESHOLD) {
turn_right;
Wait(1);
}
}
sub SEARCH_LINE_turnleft() //センサーが線を見つけるまで左に曲がる
{
while(SENSOR_2 > LS_THRESHOLD) {
turn_left;
Wait(1);
}
}
sub SEARCH_WHITE_turnright() //線から出るまで右に曲がる
{
while(SENSOR_2 < LS_THRESHOLD) {
turn_right;
Wait(1);
}
}
sub SEARCH_WHITE_turnleft() //線から出るまで左に曲がる
{
while(SENSOR_2 < LS_THRESHOLD) {
turn_left;
Wait(1);
}
}
sub SEARCH_WHITE_forward() //線から出るまで直進
{
while(SENSOR_2 < LS_THRESHOLD) {
fwd;
Wait(1);
}
}
sub Stop() //交差点で音を鳴らして一時停止
{
PlaySound(SOUND_DOWN);
Wait(100);
}
**ライントレースのプログラム [#o8968fa1]
ライントレースをする本体のプログラムは、交差点のアルファベットと順番を随時メモしていくことで途中にわかりずらくなることを防いだ。シンプルかつ分かりやすいプログラムになったので満足だった。
task main()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetPower(OUT_AC,3);
LINE_right(LINE_TIME); //1
PlaySound(SOUND_UP);//E
SEARCH_WHITE_forward(); //2
SEARCH_LINE_turnright();
LINE_left(LINE_TIME);
Stop(); //P
SEARCH_WHITE_forward();
SEARCH_LINE_turnleft();
SEARCH_WHITE_turnleft();
LINE_left(LINE_TIME); //3
PlaySound(SOUND_UP);//Q
SEARCH_WHITE_turnright();
LINE_left(LINE_TIME);//4
PlaySound(SOUND_UP);//R
SEARCH_WHITE_forward();
LINE_right(LINE_TIME);//5
Stop(); //T
SEARCH_WHITE_forward();
LINE_right(LINE_TIME); //6
Stop(); //T
SEARCH_WHITE_forward();
LINE_right(LINE_TIME); //7
PlaySound(SOUND_UP); //H
SEARCH_WHITE_forward();
SEARCH_LINE_turnright();
//8
ClearTimer(0); while(FastTimer(0) < (LINE_TIME * 3)) {
if(SENSOR_2 < LS_THRESHOLD) { turn_right; ClearTimer(0); }
else{ turn_left; }
Wait(1);
}
SEARCH_LINE_turnleft();
ClearTimer(0); while(FastTimer(0) < (LINE_TIME * 3)) {
if(SENSOR_2 < LS_THRESHOLD) { turn_left; ClearTimer(0);}
else{ turn_right; }
Wait(1);
}
SEARCH_LINE_turnright();
SEARCH_WHITE_turnright();
LINE_right(LINE_TIME);
PlaySound(SOUND_UP); //G
SEARCH_WHITE_forward();
SEARCH_LINE_turnright();
LINE_left(LINE_TIME); //9
Stop(); //S
SEARCH_WHITE_forward();
SEARCH_LINE_turnleft();
SEARCH_WHITE_turnleft();
LINE_left(LINE_TIME); //10
PlaySound(SOUND_UP); //P
SEARCH_WHITE_turnright();
LINE_left(LINE_TIME); //10
PlaySound(SOUND_UP); //Q
SEARCH_WHITE_forward();
SEARCH_LINE_turnleft();
LINE_right(LINE_TIME); //11
PlaySound(SOUND_UP); //F
SEARCH_WHITE_forward();
SEARCH_LINE_turnright();
SEARCH_WHITE_turnright();
LINE_right(LINE_TIME); //12,E
Stop(); //A
}
*結果 [#mcade650]
完成したプログラムを用いてロボットを実際に動かした動画については下のURLを参照してください。~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓~
https://youtu.be/C5nUh8Q5C4A
*まとめ [#uac0b444]