- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]]
目次
#contents
*課題について [#n09c5be2]
次のようなコースを作成し、ライントレースをします。
#ref(2019a-mission2.png)
進む順番
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止します。
*ロボットの本体の説明 [#qee10873]
#ref(IMG_4777.JPG)
全体図
二輪駆動で移動します。
タイヤの少し前にラインセンサが付いており、モーターが回り、ロボットが移動したときに、適度にラインセンサが動き、地面の状況を調べることができます。
#ref(IMG_4779a.jpg)
ボールをつかむためのアーム
フェースギアを用い、モーターの回転軸を90度回転させることで、ボールをつかむためのアームを製作しました。
#ref(IMG_4783.JPG)
アームのつかむ部分が重なっており、ボールをしっかりとつかむことができます。
*プログラムの説明 [#nf96d142]
#ref(2019a-mission21.png)
#ref(2019a-mission2-1.png)
#define zenshin OnFwd(OUT_BC,50); //前進
#define koushin OnFwd(OUT_BC,-50); //後進
#define migikaiten OnFwd(OUT_B,-70);OnFwd(OUT_C,40); //右回転
#define hidarikaiten OnFwd(OUT_B,40);OnFwd(OUT_C,-70); //左回転
#define mi OnFwd(OUT_C,40);Off(OUT_B);//右に進む
#define hi OnFwd(OUT_B,40);Off(OUT_C); //左に進む
#define smi OnFwd(OUT_C,30);Off(OUT_B);//s右に進む
#define shi OnFwd(OUT_B,30);Off(OUT_C); //s左に進む
#define migi OnFwd(OUT_C,40);Off(OUT_B);//右に進む
#define hidari OnFwd(OUT_B,40);Off(OUT_C); //左に進む
#define tomaru Off(OUT_BC); //ストップ
long A=0;//コーナーで止まる時間を計測する変数
long B=0;//ライントレースしている時間を計測する変数
void stop_corner(){
SetSensorLight(S1);
while(A<400){
if(SENSOR_1<40){
hi;
hidari;
A=A+1;
B=B+1;
}else{
mi;
migi;
B=B+1;
A=0;
}
}
tomaru;
Wait(1000);
B=0;
}//コーナーで止まるライントレース(ラインの左側を進む)
void cross_line(){
SetSensorLight(S1);
if(SENSOR_1<40){
hi;
hidari;
B=B+1;
}else{
mi;
migi;
B=B+1;
}
}//コーナーを直進するライントレース(ラインの左側を進む)
void re_stop_corner(){
SetSensorLight(S1);
while(A<400){
if(SENSOR_1>40){
hi;
hidari;
A=0;
B=B+1;
}else{
mi;
migi;
A=A+1;
B=B+1;
}
}
tomaru;
Wait(1000);
B=0;
}//コーナーで止まるライントレース(ラインの右側を進む)
void re_cross_line(){
SetSensorLight(S1);
if(SENSOR_1>40){
hi;
hidari;
B=B+1;
}else{
mi;
migi;
B=B+1;
}
}//コーナーを直進するライントレース(ラインの右側を進む)
void stop_ball(){
SetSensorLight(S1);
while(A<800){
if(SENSOR_1<40){
hi;
hidari;
A=0;
B=B+1;
}else{
mi;
migi;
B=B+1;
A=A+1;
}
}
tomaru;
Wait(1000);
B=0;
}//コーナーで止まるライントレース(ラインの左側を進む)
void stop_corner1(){
SetSensorLight(S1);
while(A<400){
if(SENSOR_1<40){
hi;
hidari;
A=A+1;
B=B+1;
}else{
mi;
migi;
B=B+1;
A=0;
}
}
tomaru;
Wait(1000);
B=5000;
}//コーナーで止まるライントレース(ラインの左側を進む)
task main()
{
while(B<4000){
cross_line();
}
while(B>=4000){
stop_corner();
}//Dの交差点で一時停止する。
mi;
migi;
Wait(100);
tomaru;
Wait(200);//交差点で止まったとき、機体の向きを調整する動作
while(B<5000){
cross_line();
}
while(B>=5000){
stop_corner();
}
migi;
migikaiten;
Wait(300);
tomaru;
Wait(100);
zenshin;
Wait(200);
tomaru;
Wait(100);//円の部分での、ライン上にのるための動作
while(B<3000){
cross_line();
}
while(B>=3000){
stop_corner();
}//円の終わり
zenshin;
Wait(900);
tomaru;
Wait(100);//円の終わりでの機体の向きの調整
while(B<4000){
stop_corner1();
}
B=0;
hidari;
hidarikaiten;
Wait(200);
tomaru;
Wait(100);//ロボットの向きの調整
while(B<2000){
re_cross_line();
}
while(B>=2000){
stop_ball();
} //ボールのところ 白が続くと止まるのを作る
B=0;
OnFwd(OUT_A,-50);//ボールを取る
Wait(600);
Off(OUT_A);
Wait(100);
hidari;
hidarikaiten;
Wait(1000);
tomaru;
Wait(100);
zenshin;
Wait(400);
tomaru;
Wait(100);//ボールをとった後、ライン上に復帰する動作
while(B<10000){
re_cross_line();//ラインの右側をトレースする。
}
while(B>=10000){
re_stop_corner();
}//ラインの右側をトレースし、ゴールの前で泊まる。
}//ラインの右側をトレースし、ゴールの前で止まる。
OnFwd(OUT_A,50);
Wait(600);//ボールを下ろす
Off(OUT_A);
Wait(100);
zenshin;
Wait(100);
tomaru;
Wait(100);//シュートする
}