- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
* 課題2 [#nd86a976]
#ref(./2016b-mission2.png,75%,コース)
図のようなコースを作り、次の経路を黒い線に沿って進むロボットを作る。
Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート
* ロボットの説明 [#f1c42aa3]
#ref(./_20161222_163051.JPG,75%,全体図)
#ref(./_20161222_170651.JPG,75%,アーム)
#ref(./_20161222_170750.JPG,75%,駆動部)
* プログラム [#d16edb76]
pe
#define power 30 //モーターのパワー
#define nMax 1500 //この数値よりも黒と判断される回数が大きいと交差点と判断する
#define LET_TIME 850 //交差点を直進するときにロボットを引き戻す際に使う時間
#define CATCH_TIME 500 //ボールを取るためにアームを動かす時間
#define SHOOT_TIME 500 //シュートするときにロボットを動作させる時間
#define go_foward OnFwd(OUT_AC,power); //前進
#define go_back OnRev(OUT_AC,power); //後退
#define turn_right OnFwd(OUT_A,power); //右折
#define turn_left OnFwd(OUT_C,power); //左折
#define circle_right OnFwd(OUT_A,power); OnRev(OUT_C,power); //方向転換(右)
#define circle_left OnFwd(OUT_C,power); OnRev(OUT_A,power); //方向転換(左)
#define CROSS_LINE_TIME 800 //交差点を直進するときに動作させる時間
#define CROSS_TURN_RIGHT_TIME 2750 //右に90度旋回させるために動作させる時間
#define cross_line circle_left; Wait(LET_TIME); go_foward; Wait(CROSS_LINE_TIME);Off(OUT_AC); //交差点を直進
#define cross_turn_right circle_right Wait(CROSS_TURN_RIGHT_TIME-nMax);Off(OUT_AC); //交差点を右折
#define white 60 //白
#define pale_gray 50 //白よりの灰
#define deep_gray 40 //黒よりの灰
#define black 34 //黒
#define ball_catch OnFwd(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); //ボールを取る
#define ball_shoot circle_left; Wait(nMax); OnRev(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); go_back; Wait(SHOOT_TIME); go_foward; Wait(SHOOT_TIME+300); //ボールをシュートする
sub line_trace() //ボールを取るまでの間、ライントレースする
{
if (SENSOR_1 > white){
circle_left;
}
else if (SENSOR_1 > pale_gray){
turn_left;
}
else if (SENSOR_1 > deep_gray){
go_foward;
}
else if (SENSOR_1 > black){
turn_right;
}
else{
circle_right;
}
}
task main()
{
SetSensorLight(S1);
SetSensorLowspeed(S2);
int nOnline=0; //黒い線の上にいた回数
int n=0; //交差点に着いた回数
while(1){
while(1){
n++;
nOnline=0;
while(nOnline < nMax){
if (SENSOR_1 > white){
circle_left;
nOnline=0;
}
else if (SENSOR_1 > pale_gray){
turn_left;
nOnline=0;
}
else if (SENSOR_1 > deep_gray){
go_foward;
nOnline=0;
}
else if (SENSOR_1 > black){
turn_right;
nOnline=0;
}
else{
circle_right;
nOnline++;
}
}
//交差点に差し掛かるまでの間ライントレースする
Off(OUT_AC);
Wait(1000);
if(n==1){
PlaySound(SOUND_FAST_UP);
cross_line;
break;
}
//最初の交差点を横断する
else if(n==2){
PlaySound(SOUND_FAST_UP);
cross_turn_right;
break;
}
//二回目のの交差点を右折する
else if(n==3){
PlaySound(SOUND_FAST_UP);
cross_line;
while(SensorUS(S2) > 10){
line_trace();
}
ball_catch;
break;
}
//三回目の交差点を横断して、ボールを認識したところでキャッチする
else if(n==4){
PlaySound(SOUND_FAST_UP);
cross_line;
break;
}
//四回目の交差点を横断する
else if(n==5){
PlaySound(SOUND_FAST_UP);
cross_turn_right;
go_foward;
Wait(1000);
break;
}
//ヘアピンカーブの入り口を交差点と判断して曲がる
else if(n==6){
PlaySound(SOUND_FAST_UP);
cross_turn_right;
go_foward;
Wait(500);
Off(OUT_AC);
break;
}
//ヘアピンカーブの出口付近を交差点と判断して曲がる
else if(n==7){
PlaySound(SOUND_FAST_UP);
cross_turn_right;
break;
}
//五回目の交差点を右折する
else if(n==8){
PlaySound(SOUND_FAST_UP);
cross_line;
break;
}
//六回目の交差点を直進する
else if(n==9){
PlaySound(SOUND_FAST_UP);
cross_turn_right;
break;
}
//七回目の交差点を右折する
else{
PlaySound(SOUND_FAST_UP);
cross_line;
ball_shoot;
}
//ゴールにボールをシュートする
}
}
}
* まとめ [#j096b03d]