#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)
 { &#160; 
   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)
 { &#160; 
   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]
今回の課題では、


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS