- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-01-10T02:05:47+09:00","udon","udon")
#author("2020-01-10T16:27:39+09:00","udon","udon")
[[2019b/Member]]
*目次 [#ac4c4c45]
#contents
*課題2:ライントレースして、ボールを取り、元の位置に戻る [#s14c0288]
**コース [#k5e444b6]
#ref(2019b-mission2.png)
私は二人目だったので、コースは
-1 A地点から出発
-2 J
-3 H (直進)
-4 I (ボール or キューボイドをつかんでUターン)
-5 H (右折)
-6 G (一時停止の後、直進)
-7 D (右折)
-8 E, F 通過
-9 G (一時停止の後、直進)
-10 C (一時停止の後、左折)
-11 B (一時停止)
-12 A地点に入る(ゴール)
のルートをたどる。
*ロボットの説明 [#mf0767a0]
今回の課題では下の写真のロボットを使用した。
#ref(IMG_1407.jpeg)
このロボットは3つ目のモーターを利用してアームを動かし、上からアームを下ろしてボールを取ることができるようにした。
#ref(IMG_1420.jpeg)
また、光センサーの反応がロボットの動きによって誤作動を起こさないように、光センサーを紙面と垂直になるように設置し、できるだけ固定した。
#ref(IMG_1410.jpeg)
*プログラミングの説明 [#cb858ddd]
**ロボットの動作 [#hdc9d9d0]
#define SPEED_X 40
#define SPEED_L 30
#define turn_right1 OnRL(-SPEED_L,SPEED_L);
#define turn_left1 OnRL(SPEED_L,-SPEED_L);
#define turn_right2 OnRL(-SPEED_L,SPEED_L);
#define turn_left2 OnRL(SPEED_L,-SPEED_L);
#define go_forward OnFwd(OUT_BC,30);
#define go OnFwd(OUT_BC,30);Wait(800);
#define right Off(OUT_B);OnFwd(OUT_C,40);Wait(300);
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
float GetAngle(float d)
{
const float diameter=5.45;
const float pi=3.1415;
const float distance=12.5;
float ang=(distance*d)/diameter;
return ang;
}
void u_turn()
{ int angle=GetAngle(160);
RotateMotorEx(OUT_BC,SPEED_L,angle,100,true,true);
}
void turn1()
{ int angle=GetAngle(90);
RotateMotorEx(OUT_BC,SPEED_L,angle,-100,true,true);
}
このようにしてロボットの前進や旋回、そして回転を定義した。
**ライントレース(左)[#v3a80993]
void follow_lineleft()
{ long to;
SetSensorLight(S3);
to=CurrentTick();
while(CurrentTick()-to <100){
if(SENSOR_3<36){
turn_left1
}else{
if(SENSOR_3>59){
turn_right1
to=CurrentTick();
}else if((51<=SENSOR_3)&&(SENSOR_3<=59)){
turn_right2
to=CurrentTick();
}else if((42<SENSOR_3)&&(SENSOR_3<51)){
go_forward
to=CurrentTick();
turn_left2
to=CurrentTick();
}}}
Off(OUT_BC);
}
このプログラミングで黒線の左側をライントレースできるようにした。さらに交差点で止まるため、光センサーの数値が36を下回る時間が、0.1秒より長くなると止まるように値を定めた。
**ライントレース(右) [#rded0106]
void follow_lineright1(long tmin=2000, long tmax=10000)
{  
long to;
SetSensorLight(S3);
to=CurrentTick();
while(CurrentTick()-to<80){
if(SENSOR_3<36){
turn_right1
}else{
if(SENSOR_3>59){
turn_left1
to=CurrentTick();
}else if((51<=SENSOR_3)&&(SENSOR_3<=59)){
turn_left2
to=CurrentTick();
}else if((42<SENSOR_3)&&(SENSOR_3<51)){
go_forward
to=CurrentTick();
}else{
turn_right2
to=CurrentTick();
}}}
Off(OUT_BC);
}
void follow_lineright2(long t)
{  
long to;
SetSensorLight(S3);
to=CurrentTick();
while(CurrentTick()-to<t){
if(SENSOR_3<36){
turn_right1
}else{
if(SENSOR_3>59){
turn_left1;
}else if((51<=SENSOR_3)&&(SENSOR_3<=59)){
turn_left2;
}else if((42<SENSOR_3)&&(SENSOR_3<51)){
go_forward;
}else{
turn_right2;
}}}
Off(OUT_BC);
}
*今回の課題の反省点や感じたこと [#w1704261]
今回の課題では、