- 追加された行はこの色です。
- 削除された行はこの色です。
[[2017a/Member]]
ライントレース
#define senkai_left OnRev(OUT_C);OnFwd(OUT_A);//左旋回
目次
#contents
*課題について [#odf54201]
今回課題は、空き缶を収集し、ゴールに空き缶をなるべく高く積み上げる。
&br; 詳しい課題3については[[こちら>2017a/Mission3]]
*ロボット本体について [#h2ccc9a9]
2つのキットを合体させて作り、缶をアームでつかみ持ち上げる為に高さのあるロボットとなった。光センサーが3つついており、ライントレース用に下向きに2つ、缶を判別するために前向きに1つつけられている。
#ref(2017a/Member/rock/Mission3/zenntai.jpg,50%);
缶を抑えるため、タイヤを滑り止めとして使い、持ち上げやすくした。
#ref(2017a/Member/rock/Mission3/mae.JPG,50%);
黄色い棒により缶をつかんだ時に倒れることを防いでいる。また、アームを持ち上げるためのレールを持ち上げた時に傾かないようギアを上部に使い抑えている。また、通信部分本体を横にすると長いため縦にすることで場所をとらないようにした。
#ref(2017a/Member/rock/Mission3/yoko.jpg,50%);
**工夫した点 [#r738b858]
缶をつかむためのアームの下側に缶に引っかるようにギアをつけた。
#ref(2017a/Member/rock/Mission3/armsita.JPG,50%);
棒で缶が確実に中心にくるように棒を取り付けた。
#ref(2017a/Member/rock/Mission3/armnaka.jpg,50%);
*プログラムについて [#c15d8327]
**defineについて [#p8722fcd]
基本的な右左旋回、右左折、直進を定義した。
#define senkai_left OnRev(OUT_C);OnFwd(OUT_A);//左旋回
#define senkai_right OnFwd(OUT_C);OnRev(OUT_A); //右旋回
#define turn_left Off(OUT_C);OnFwd(OUT_A);//左折
#define turn_right OnFwd(OUT_C);Off(OUT_A);//右折
#define fwd OnFwd(OUT_AC);//直進
**void、サブルーチンについて [#g2d41d36]
直進するプログラム
void go_fwd(int time)
{
fwd;
Wait(time);
Off(OUT_AC);
}
交差点を右折するプログラム。旋回をすることで小さく曲がれるようにした。
sub usetu()
{
turn_right;
Wait(230);
Off(OUT_C);
senkai_right;
Wait(50);
Off(OUT_AC);
OnRev(OUT_AC);
Wait(30);
Off(OUT_AC);
}
#define usetu OnFwd(OUT_C);Off(OUT_A);Wait(180);Off(OUT_C);OnRev(OUT_AC); Wait(20);Off(OUT_AC);
sub sasetu()
{
turn_left;
Wait(190);
Off(OUT_A);
senkai_left;
Wait(40);
Off(OUT_AC);
}
PQRSの交差点では、90度に曲がるのではないため、時間を調整し斜めに車体を向けるようにした。
sub naname_usetu()
{
OnFwd(OUT_C);
Off(OUT_A);
Wait(200);
Off(OUT_C);
OnRev(OUT_AC);
Wait(40);
Off(OUT_AC);
}
缶を置いて離れるためのプログラム
sub owari()
{
turn_right;
Wait(70);
Off(OUT_AC);
Wait(450);
OnRev(OUT_AC);
Wait(200);
Off(OUT_AC);
}
左右の光センサーが白色の上なら直進、左側の光センサーが黒色に近づいたら左折、右側の光センサーが黒色に近づいたら右折、左側の光センサーが黒線上にきたら左旋回、右側の光センサーが黒線上にきたら右旋回、右側のセンサーが0.11秒黒線上なら交差点だと判断し、止まる。
sub line_trace()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //右
SetSensor(SENSOR_3, SENSOR_LIGHT); //左
ClearTimer(0);
SetSensor(SENSOR_1, SENSOR_LIGHT); //右
SetSensor(SENSOR_3, SENSOR_LIGHT); //左
ClearTimer(0);
PlaySound(SOUND_UP);
PlaySound(SOUND_CLICK);
while(FastTimer(0)<11){
if(SENSOR_1>=49&&SENSOR_3>=55){
fwd;
ClearTimer(0);
}else if(SENSOR_3>=50){
turn_right;
ClearTimer(0);
}else if(SENSOR_1>=40){
turn_left;
ClearTimer(0);
}else if(SENSOR_3>=48){
senkai_right;
ClearTimer(0);
}else if(SENSOR_1>=38){
senkai_left;
ClearTimer(0);
}else if(SENSOR_1>=35||SENSOR_3>=40){
Off(OUT_AC);
PlaySound(SOUND_LOW_BEEP);
}else{
PlaySound(SOUND_FAST_UP);
}
while(FastTimer(0)<11){
if(SENSOR_1>=49&&SENSOR_3>=55){
fwd;
ClearTimer(0);
}else if(SENSOR_3>=50){
turn_right;
ClearTimer(0);
}else if(SENSOR_1>=40){
turn_left;
ClearTimer(0);
}else if(SENSOR_3>=48){
senkai_right;
ClearTimer(0);
}else if(SENSOR_1>=38){
senkai_left;
ClearTimer(0);
}else if(SENSOR_3>=30){
Off(OUT_AC);
PlaySound(SOUND_LOW_BEEP);
}else{
fwd;
Wait(30);
Off(OUT_AC);
}
}
Off(OUT_AC);
PlaySound(SOUND_CLICK);
}
Off(OUT_AC);
PlaySound(SOUND_DOWN);
基本的には上のライントレースと変わらないが、2つ目のタイマーが設定した時間になっても止まるようにした。
void line_trace_2(int time)
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //右
SetSensor(SENSOR_3, SENSOR_LIGHT); //左
ClearTimer(0);
ClearTimer(1);
PlaySound(SOUND_CLICK);
while(FastTimer(0)<11&&FastTimer(1)<time){
if(SENSOR_1>=49&&SENSOR_3>=55){
fwd;
ClearTimer(0);
}else if(SENSOR_3>=50){
turn_right;
ClearTimer(0);
}else if(SENSOR_1>=40){
turn_left;
ClearTimer(0);
}else if(SENSOR_3>=48){
senkai_right;
ClearTimer(0);
}else if(SENSOR_1>=38){
senkai_left;
ClearTimer(0);
}else if(SENSOR_1>=30){
Off(OUT_AC);
PlaySound(SOUND_LOW_BEEP);
}else{
fwd;
Wait(30);
Off(OUT_AC);
}
}
Off(OUT_AC);
}
**タイヤ側のプログラム [#mdc70070]
定義したもので構成したので短く書くことが出来た。
task main()
{
Wait(50);
fwd;
Wait(50);
Off(OUT_AC);
repeat(2){
go_fwd(50);
line_trace();
Wait(50);
usetu;
Wait(100);
}
fwd;
Wait(50);
Off(OUT_AC);
PlaySound(SOUND_CLICK);
usetu();
repeat(2){
line_trace();
Wait(50);
naname_usetu();
Wait(50);
}
line_trace_2(230);
Wait(500);
senkai_left;
Wait(200);
Off(OUT_AC);
go_fwd(30);
line_trace();
Wait(450);
sasetu();
line_trace();
owari();
}
**アーム側のプログラム [#rc2508b5]
アームのプログラムについてはこちら[[miso>2017a/Member/miso/Mission3]]を見てください。
*結果 [#c1625a78]
順路としてA→E→P→S→G→H→Tを通った。EGHの空き缶を3段積み重ねることができたため、3+6+9=18点となった。
#ref(2017a/Member/rock/Mission3/kekka.JPG,50%);
&br; 実際に積み上げている様子はこちらhttps://www.youtube.com/watch?v=I_fwqzWXyB0
*まとめ [#gf4a75fc]
今回の課題はロボット本体、プログラムを作るのも作戦を考えなければならなかったので時間がすごくかかった。缶を3段積み上げることにしてから、どこの缶を取ろうかと考え続けた。時間をもっとかければより多くの点を取れたかもしれないが電池もどんどん消費してしまうので難しいところである。チームメンバーそれぞれ得意なところで力を発揮できたと思う。時間がないなか妥協はあったが、力を合わせ完成できたことはこれからの大きな糧になると思う。
*チームメンバーのページ [#w212580a]
[[miso>2017a/Member/miso/Mission3]]
&br; [[ejj>2017a/Member/ejj/Mission3]]
&br; [[sawa>2017a/Member/sawa/Mission3]]