- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016b/Member]]ロボ
目次
#contents
#初めに
今回の課題は線にそって動くロボットを作ることであった。
*初めに [#qea44f38]
課題は上図の黒線にそって動くライントレースロボットを制作するというものです。ライントレースをする際には、光センサを1つ用います。
#ref(2016b/Member/yusaku/Mission2/image3(5).JPG,100%,rainn)
経路としてはB地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をC地点においたゴールへシュートする (二人目)
経路としてはB地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をC地点においたゴールへシュートします。
Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート
Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュートという順で動かします。
*ライントレースとは? [#g9efcc16]
ライントレースとは、床面に描かれた線をロボットがセンサで読み取り、線に沿って動くことを言います。
*ライントレースロボットの説明 [#lb57215a]
歯車を噛ませて、アームを上下させてボールをつかませる機体を作りました。
アームの中に上手くボールが入ればボールを安定してゴールに運ぶことができます。
#ref(2016b/Member/yusaku/Mission2/image3(1).JPG,100%,robo)#ref(2016b/Member/yusaku/Mission2/image3(2).JPG,100%,hikari)
歯車を上手く噛みあわせるのには苦労しました。
また、アームの下に光センサーをつけました。
光センサは、ライントレースする際に明暗を判断をするためにあります。
#ref(2016b/Member/yusaku/Mission2/image3(2).JPG,100%,hikari)
最初の段階では、タイヤが4つ付いていましたがカーブや交差点で小回りがきくように2つにして、後ろにバンパーを取り付けました。
アームの横にブロックで壁を作り、ボールを別の場所に逃げさせないようにしました。
#ref(2016b/Member/yusaku/Mission2/image3(3).JPG,100%,taiya)
*プログラムの説明 [#l31c896d]
**定義 [#r2a20255]
光センサーに反応させて黒い線に沿って進むように定義しました。
#define RIGHT OnFwd(OUT_A); Off(OUT_C);
#define LEFT OnFwd(OUT_C); Off(OUT_A);
#define WAIT Off(OUT_A); Off(OUT_C);
#define turn_right OnRev(OUT_C);OnFwd(OUT_A);
下のプログラムは交差点を判別した時にどのように動かすかを定義したものです。
#define GO(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);
#define right(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);
#define left(t) OnFwd(OUT_C);Wait(t);Off(OUT_C);
**ライントレースの基本のプログラム [#ad10a849]
下のプログラムはライントレースの基本的なプログラムです。
とても明るかったら右に大きく曲がる。
明るかったら右に小さく曲がる。
暗かったら左に小さく曲がる。
この3つの判別でロボットを線上の上を動かします。
また、タイマーを使って交差点の有無を判断させました。
交差点は線が九十度であるため、小回りがきかないロボットは黒い線を移動する時間が伸びます。
その黒い線にいる時間が長ければ、交差点だと判別できるようにプログラムを作りました。
sub raintreser(){ClearTimer(0);
SetSensor(SENSOR_2,SENSOR_LIGHT);
while(FastTimer(0)<20){
if(SENSOR_2>48){turn_right;ClearTimer(0);}
else if(SENSOR_2>45){RIGHT;ClearTimer(0);}
else if(SENSOR_2>35){LEFT;ClearTimer(0);}
}
WAIT;
}
**ボールをゴールにシュートさせるプログラム [#tf28b4c0]
task main(){
raintreser(); //B地点をスタート。
Wait(100); //P地点の交差点を判別して一秒止まり右折する。
right(120);
GO(5);
raintreser(); //Q地点の交差点を判別して一秒止まり直進する。
Wait(100);
left(5);
GO(30);
raintreser(); //Q地点の交差点を判別して一秒止まる。
Wait(100);
OnRev(OUT_B); //アームを下ろし、ボールをつかむ。
Wait(20);
Off(OUT_B);
left(5); //直進する
GO(30);
raintreser(); //R地点の交差点を判別して一秒止まり右折する。
Wait(100);
right(130); //S地点の交差点を判別して一秒止まり右折する。
GO(5);
raintreser(); //P地点の交差点を判別して一秒止まり直進する。
Wait(100);
left(5);
GO(30);
raintreser(); //S地点の交差点を判別して一秒止まり右折する。
Wait(100);
right(70);
GO(5);
raintreser(); //C地点を真っ直ぐ進みアームを上げてボールをシュート
GO(100);
OnFwd(OUT_B);
Wait(20);
Off(OUT_B);
}
*今回の反省点 [#c45c5134]
黒い壁を作ったことで機体が重くなってしまたので、もう少し大きな装置にならないように考えればよかった。
光センサーの明暗によって動きを変えるプログラムが三段階だったが、五段階ぐらいにすればシュートの成功率が上がったと思う。
*感想 [#g5e26136]
前回は早めにロボットを制作することができなかったので字を書かせることができなかったが、その反省を踏まえ早い段階で集まれたことでゴールにシュートできたので良かった。
成功しなかった時は心の中でイライラしたが、成功した時は自分は間違っていなかったと嬉しくなりました。
プログラム作ることは論理的に考えるのでこの経験は今後にも活きてくると思いました。