- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-01-06T15:12:32+09:00","shin","shin")
#author("2020-01-06T20:14:35+09:00","shin","shin")
目次
#contents
*課題2 [#xecac370]
#ref(2019b/Member/shin/Mission2/2019b-mission2.jpeg,100%)
A地点を出発し、次のような経路を黒い線に沿って動くロボットを作成する。
**経路 [#qa12098a]
+A地点から出発
+J
+H(直進)
+I(ボールを掴んでUターン)
+H(右折)
+G(一時停止の後、直進)
+D(右折)
+E、F通過
+G(一時停止の後、直進)
+C(一時停止の後、左折)
+B(一時停止)
+A地点に入る(ゴール)
*ロボットの説明 [#qf9dba20]
#ref(2019b/Member/shin/Mission2/Robo.jpeg,50%)
#ref(2019b/Member/shin/Mission2/Robo2.jpeg,50%)
超音波センサでボールを認識し、アームを下げ、ボールを囲ってそのまま運ぶようにした。
ボールに反応しやすいように超音波センサはななめにとりつけた。
*プログラムの説明 [#pca1dfdd]
必要な数値や基本的な動きの定義。
#define BLACK 37
#define GRAY_BLACK 50
#define GRAY_WHITE 60
#define WHITE 66
#define left1 OnFwd(OUT_B,30);OnRev(OUT_C,30);
#define left0 OnFwd(OUT_B,30);Off(OUT_C);
#define go OnFwd(OUT_BC,30);
#define right0 OnFwd(OUT_C,30);Off(OUT_B);
#define right1 OnFwd(OUT_C,30);OnRev(OUT_B,30);
#define pause Wait(1000);
#define u_turn OnFwd(OUT_B,50);OnRev(OUT_C,70);Wait(1000);Float(OUT_C)
ラインの右側をトレースする。
*まとめ [#sb064237]
void follow_line_r()
{
SetSensorLight(S3);
long t0=CurrentTick();
while(CurrentTick()-t0<120){
if(SENSOR_3<BLACK){
right1;
}else if(SENSOR_3<GRAY_BLACK){
right0; t0=CurrentTick();
}else if(SENSOR_3<GRAY_WHITE){
go; t0=CurrentTick();
}else if(SENSOR_3<WHITE){
left0; t0=CurrentTick();
}else{
left1;t0=CurrentTick();
}
}
Off(OUT_BC);
}
ラインの左側をトレースする。
void follow_line_l()
{
SetSensorLight(S3);
long t0=CurrentTick();
while(CurrentTick()-t0<80){
if(SENSOR_3<BLACK){
left1;
}else if(SENSOR_3<GRAY_BLACK){
left0; t0=CurrentTick();
}else if(SENSOR_3<GRAY_WHITE){
go; t0=CurrentTick();
}else if(SENSOR_3<WHITE){
right0; t0=CurrentTick();
}else{
right1;t0=CurrentTick();
}
}
Off(OUT_BC);
}
JからHまでの曲線のトレース。曲線と交差点の区別がうまくいかなかったので、JからHまでの曲線のトレースは別の関数にした。
void follow_line_curve()
{
SetSensorLight(S3);
long t1;
t1=CurrentTick();
while(CurrentTick()-t1<15000){
if(SENSOR_3<BLACK){
left1;
}else if(SENSOR_3<GRAY_BLACK){
left0;
}else if(SENSOR_3<GRAY_WHITE){
go;
}else if(SENSOR_3<WHITE){
right0;
}else{
right1;
}
}
Off(OUT_BC);
}
}
交差点を渡る。左トレースと右トレースでそれぞれ関数を作った。
void cross_line_l()
{
right0;
Wait(700);
go;
Wait(500);
Off(OUT_BC);
}
void cross_line_r()
{
go;
Wait(400);
Off(OUT_BC);
}
左折
void turn_left()
{
left0;
Wait(700);
left1;
Wait(1200);
Off(OUT_BC);
}
右折
void turn_right()
{
right0;
Wait(500);
right1;
Wait(900);
Off(OUT_BC);
}
ボールを掴みUターンする。
void fetch_ball()
{
SetSensorLowspeed(S2);
while(SensorUS(S2)>=10){
go;
}
Off(OUT_BC);
Wait(1000);
RotateMotor(OUT_A,30,-60);
u_turn;
go;
Wait(1000);
}
メインのプログラム
task main()
{
go; Wait(500); //A地点を出発
follow_line_curve(); follow_line_l(); //J→H
cross_line_l(); //H→I
fetch_ball(); //ボールをつかんでUターン
follow_line_r(); //I→H
turn_right(); //Hを右折
follow_line_r(); //H→G
pause; //Gで一時停止
cross_line_r(); follow_line_r(); //G→D
turn_right(); follow_line_r(); //D→E
turn_right(); follow_line_r(); //E→F
turn_right(); follow_line_r(); //F→G
pause; //Gで一時停止
cross_line_r(); follow_line_r(); //G→C
pause; //Cで一時停止
turn_left(); follow_line_l(); //C→B
pause; //Bで一時停止
cross_line_l(); go; Wait(500); //A地点に入る
}