2016a/Member/yui/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*目次 [#cdeb80d5]
#contents
*課題 [#e2ed52bc]
risを使い光センサーによりライントレースを行う。
コースは模造紙にマジックペンで以下のように描いて作る。
&ref(2016a-mission2.png);
私がロボットを走らせるコースは
A地点からB地点へ
A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点
である
*本体について [#x624b260]
&ref(attachment00(3).jpg);
課題1のときから大きく構造は変えていないがいくつか工夫はした。まずはタイヤである。2つ取り外し、スムーズに移動できるようになった。
&ref(attachment01(2).jpg);
ふたつ目は光センサーの取り付け位置である。遠すぎると、少しの小回りで大きく動いてしまうため誤動作が多かった。そのため最初はなるべく本体に近づけて固定しようと工夫した。課題1のときはあったでっぱりを取り外しそこにセンサーを取り付けた。すると誤動作は少なくなったが今度は微調整が増え、なかなか進まなくなった、そこで「多少は離さないとセンサーが動かなすぎて進んでいかない」という先生の助言に従い適度に本体から離してみたところ、大幅にスピードアップできた。
*プログラミング [#n4da8cb7]
**定義 [#w84e84e0]
初めに以下の定義をした
#define turn_left Off(OUT_A); OnFwd(OUT_C);//左折
#define turn_leftS OnRev(OUT_A); OnFwd(OUT_C); //左旋回
#define turn_right OnFwd(OUT_A); Off(OUT_C);//右折
#define turn_rightS OnFwd(OUT_A); OnRev(OUT_C);//右旋回
#define go_forward OnFwd(OUT_AC);//直進
**サブルーチン [#ed4b7539]
メインのタスクを簡単にするためにいくつかサブルーチンを作った
***ラインを辿るために [#c1b860ce]
私たちの班は、黒線と白い部分の境目をトレースするという方法をとった。
境目の明るさを測り。それよりも明るくなったら黒線の方へ、暗くなったら白い方へ微調整し、進んで行く。
これがそのサブルーチンである
sub line_follow()
{
ClearTimer(0); // まずはタイマーをリセットする(理由は後述)
while(FastTimer(0)<25)//whileのカッコで囲まれた動作は
{ //タイマーが一定の時間を超えるまで行われる
if(SENSOR_2<45){//もし、センサーがラインの境目よりはるかに暗いと判断した時
turn_leftS;// 左旋回→これが交差点判別に使われる(後述)
}
else if(SENSOR_2<47){//もし、センサーがラインの境目より少し暗いと判断した時
turn_left;// 左折
ClearTimer(0);//タイマーをリセットする
}
else if(SENSOR_2<54){//もし、センサーがラインの境目の明るさだと判断した時
go_forward; //直進
ClearTimer(0);//タイマーをリセットする
}
else if(SENSOR_2<57){//もし、センサーがラインの境目より少し明るいと判断した時
turn_right; //右折
ClearTimer(0);//タイマーをリセットする
}
else { //もし、センサーがラインの境目よりかなり明るいと判断した時
turn_rightS; //右旋回
ClearTimer(0);//
}
}
Off(OUT_AC);//whileの範囲を超えたら電源が落ちる
}
ラインの左側をトレースしたため暗くなったら左折、明るくなったら右折をすればよい。
どこからが明るく、どこからが暗いのか具体的な値を決めるために、試行錯誤を繰り返した。
***交差点を認識するために [#xf892129]
私達の班では、交差点では比較的長く左折してもセンサーが明るく反応しなくなると考えた
そこでタイマーを用い、一定時間左旋回(交差点はかなり暗いため)をしたら交差点と認識するようにプログラミングした、そのため上のサブルーチンを見れば分かる通り、左旋回以外の動作をしたあとにはタイマーをリセットしている。左旋回が連続して長く続くとタイマーの数字が増え、一定の値を超えたら停止するようにした。
***交差点を超える [#b97abbf4]
交差点上ではライントレースができないそのため以下のサブルーチンを作った
sub go_forwardS()//交差点を直進
{
turn_rightS;//右旋回(僅かに左に傾いているため)
Wait(10);
go_forward;//直進
Wait(30);
}
sub turn_leftSS()//交差点を左折
{
while(SENSOR_2<47)//明るくなるまで左折
{
turn_leftS;
}
}
**task main [#w6b00b69]
いよいよメインの動作についてだ
task main()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーをセット
line_follow(); //AP間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
go_forwardS(); //交差点を直進
line_follow(); //PQ間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
go_forwardS(); //交差点を直進
line_follow(); //QQ間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
go_forwardS(); //交差点を直進
line_follow(); //QR間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
turn_leftSS(); //交差点を左折
line_follow(); //RB間のラインを辿る
go_forward; //最後の枠を超える
Wait(100);
Off(OUT_AC); //停止
PlaySound(SOUND_UP) ; //クリア時のサウンド。所要時間41秒
}
サブルーチンのおかげでかなり簡略化されている。が、サウンド→停止→サウンドがセットの動作になっているので、これも交差点での動作としてサブルーチンを作れば更にtask mainを短くできたのではないかと今更思った。
*まとめ [#k2c8a417]
きちんとゴールまでたどり着くことができた。
センサーの位置でスピードが劇的に変わったので驚いた。
ただしまれに誤動作をおこし、ゴールにたどりつけないこともあった。10回に1回程度なのでなかなk原因を探れず改善に至れなかったのが心残りだ。そして課題1のときと同じくロボットの脆さも問題だ。
しかし課題1のときよりも楽しんで取り組めたと思う。
終了行:
*目次 [#cdeb80d5]
#contents
*課題 [#e2ed52bc]
risを使い光センサーによりライントレースを行う。
コースは模造紙にマジックペンで以下のように描いて作る。
&ref(2016a-mission2.png);
私がロボットを走らせるコースは
A地点からB地点へ
A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点
である
*本体について [#x624b260]
&ref(attachment00(3).jpg);
課題1のときから大きく構造は変えていないがいくつか工夫はした。まずはタイヤである。2つ取り外し、スムーズに移動できるようになった。
&ref(attachment01(2).jpg);
ふたつ目は光センサーの取り付け位置である。遠すぎると、少しの小回りで大きく動いてしまうため誤動作が多かった。そのため最初はなるべく本体に近づけて固定しようと工夫した。課題1のときはあったでっぱりを取り外しそこにセンサーを取り付けた。すると誤動作は少なくなったが今度は微調整が増え、なかなか進まなくなった、そこで「多少は離さないとセンサーが動かなすぎて進んでいかない」という先生の助言に従い適度に本体から離してみたところ、大幅にスピードアップできた。
*プログラミング [#n4da8cb7]
**定義 [#w84e84e0]
初めに以下の定義をした
#define turn_left Off(OUT_A); OnFwd(OUT_C);//左折
#define turn_leftS OnRev(OUT_A); OnFwd(OUT_C); //左旋回
#define turn_right OnFwd(OUT_A); Off(OUT_C);//右折
#define turn_rightS OnFwd(OUT_A); OnRev(OUT_C);//右旋回
#define go_forward OnFwd(OUT_AC);//直進
**サブルーチン [#ed4b7539]
メインのタスクを簡単にするためにいくつかサブルーチンを作った
***ラインを辿るために [#c1b860ce]
私たちの班は、黒線と白い部分の境目をトレースするという方法をとった。
境目の明るさを測り。それよりも明るくなったら黒線の方へ、暗くなったら白い方へ微調整し、進んで行く。
これがそのサブルーチンである
sub line_follow()
{
ClearTimer(0); // まずはタイマーをリセットする(理由は後述)
while(FastTimer(0)<25)//whileのカッコで囲まれた動作は
{ //タイマーが一定の時間を超えるまで行われる
if(SENSOR_2<45){//もし、センサーがラインの境目よりはるかに暗いと判断した時
turn_leftS;// 左旋回→これが交差点判別に使われる(後述)
}
else if(SENSOR_2<47){//もし、センサーがラインの境目より少し暗いと判断した時
turn_left;// 左折
ClearTimer(0);//タイマーをリセットする
}
else if(SENSOR_2<54){//もし、センサーがラインの境目の明るさだと判断した時
go_forward; //直進
ClearTimer(0);//タイマーをリセットする
}
else if(SENSOR_2<57){//もし、センサーがラインの境目より少し明るいと判断した時
turn_right; //右折
ClearTimer(0);//タイマーをリセットする
}
else { //もし、センサーがラインの境目よりかなり明るいと判断した時
turn_rightS; //右旋回
ClearTimer(0);//
}
}
Off(OUT_AC);//whileの範囲を超えたら電源が落ちる
}
ラインの左側をトレースしたため暗くなったら左折、明るくなったら右折をすればよい。
どこからが明るく、どこからが暗いのか具体的な値を決めるために、試行錯誤を繰り返した。
***交差点を認識するために [#xf892129]
私達の班では、交差点では比較的長く左折してもセンサーが明るく反応しなくなると考えた
そこでタイマーを用い、一定時間左旋回(交差点はかなり暗いため)をしたら交差点と認識するようにプログラミングした、そのため上のサブルーチンを見れば分かる通り、左旋回以外の動作をしたあとにはタイマーをリセットしている。左旋回が連続して長く続くとタイマーの数字が増え、一定の値を超えたら停止するようにした。
***交差点を超える [#b97abbf4]
交差点上ではライントレースができないそのため以下のサブルーチンを作った
sub go_forwardS()//交差点を直進
{
turn_rightS;//右旋回(僅かに左に傾いているため)
Wait(10);
go_forward;//直進
Wait(30);
}
sub turn_leftSS()//交差点を左折
{
while(SENSOR_2<47)//明るくなるまで左折
{
turn_leftS;
}
}
**task main [#w6b00b69]
いよいよメインの動作についてだ
task main()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーをセット
line_follow(); //AP間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
go_forwardS(); //交差点を直進
line_follow(); //PQ間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
go_forwardS(); //交差点を直進
line_follow(); //QQ間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
go_forwardS(); //交差点を直進
line_follow(); //QR間のラインを辿る
PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす
Wait(100); //交差点では一秒停止
PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす
turn_leftSS(); //交差点を左折
line_follow(); //RB間のラインを辿る
go_forward; //最後の枠を超える
Wait(100);
Off(OUT_AC); //停止
PlaySound(SOUND_UP) ; //クリア時のサウンド。所要時間41秒
}
サブルーチンのおかげでかなり簡略化されている。が、サウンド→停止→サウンドがセットの動作になっているので、これも交差点での動作としてサブルーチンを作れば更にtask mainを短くできたのではないかと今更思った。
*まとめ [#k2c8a417]
きちんとゴールまでたどり着くことができた。
センサーの位置でスピードが劇的に変わったので驚いた。
ただしまれに誤動作をおこし、ゴールにたどりつけないこともあった。10回に1回程度なのでなかなk原因を探れず改善に至れなかったのが心残りだ。そして課題1のときと同じくロボットの脆さも問題だ。
しかし課題1のときよりも楽しんで取り組めたと思う。
ページ名: