#author("2020-01-09T19:02:12+09:00","Hatto","Hatto")
#author("2020-02-15T19:45:33+09:00","Hatto","Hatto")
[[2019b/Member]]

*課題2 [#w8a76b1d]
#ref(2019b/Member/Hatto/Mission2/keilo.jpeg,50%)
**経路 [#g950eb23]
+A地点から出発
+J
+H
+I(ボールを掴んでUターン) 
+H
+G(一時停止)
+D
+G(一時停止)
+C(左折)
+B
+A(ゴール)
*ロボットの説明 [#l68f3826]
#ref(2019b/Member/Hatto/Mission2/robot.jpeg,50%)
アームはボールを囲みやすいようにした。基本構造は説明書と同じであり、ボールを捕まえる機構を上に乗せただけである。タイヤとセンサーの位置が遠いと

ラインを識別する位置とタイヤが曲がる位置にずれが生じてしまい、ライントレースが上手くいかないことがあった。

例えば急なカーブを交差点と勘違いしてしまい、カーブの途中でとまってしまうこともあった
*プログラミング [#z40d5b43]
必要な動きの基本定義
 #define BLACK 30
 #define GRAY_BLACK 45
 #define GRAY_WHITE 55
 #define WHITE 66
 #define hidari1 OnFwd(OUT_B,30);OnRev(OUT_C,30);
 #define hidari0 OnFwd(OUT_B,30);Off(OUT_C);
 #define go OnFwd(OUT_BC,30);
 #define migi0 OnFwd(OUT_C,30);Off(OUT_B);
 #define migi1 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)
右側のトレース
 void follow_line_r()
 {
 SetSensorLight(S3);
 long t0=CurrentTick();
 while(CurrentTick()-t0<120){
 if(SENSOR_3<BLACK){
 migi1;
 }else if(SENSOR_3<GRAY_BLACK){
 migi0; t0=CurrentTick();
 }else if(SENSOR_3<GRAY_WHITE){
 go; t0=CurrentTick();
 }else if(SENSOR_3<WHITE){
 hidari0; t0=CurrentTick();
 }else{
 hidari1;t0=CurrentTick();
 }
 }
 Off(OUT_BC);
 }
左側のトレース
 
 void follow_line_l()
 {
 SetSensorLight(S3);
 long t0=CurrentTick();
 while(CurrentTick()-t0<80){
 if(SENSOR_3<BLACK){
 hidari1;
 }else if(SENSOR_3<GRAY_BLACK){
 hidari0; t0=CurrentTick();
 }else if(SENSOR_3<GRAY_WHITE){
 go; t0=CurrentTick();
 }else if(SENSOR_3<WHITE){
 migi0; t0=CurrentTick();
 }else{
 migi1;t0=CurrentTick();
 }
 }
 Off(OUT_BC);
 }
JからHまでのトレース
 void follow_line_curve()
 {
 SetSensorLight(S3);
 long t1;
 t1=CurrentTick();
 while(CurrentTick()-t1<15000){
 if(SENSOR_3<BLACK){
 hidari1;
 }else if(SENSOR_3<GRAY_BLACK){
 hidari0; 
 }else if(SENSOR_3<GRAY_WHITE){
 go; 
 }else if(SENSOR_3<WHITE){
 migi0; 
 }else{
 migi1;
 }
 }
 Off(OUT_BC);
 }
 }
交差点を渡る
 void cross_line_l()
 {
 migi0;
 Wait(700);
 go;
 Wait(500);
 Off(OUT_BC);
 }
左折  
 void turn_left()
 {
 hidari0;
 Wait(700);
 hidari1;
 Wait(1200);
 Off(OUT_BC);
 }
右折
 void turn_right()
 {
 migi0;
 Wait(500);
 migi1;
 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_migi();   //Hを右折
 follow_line_r();   //H→G
 pause;   //Gで一時停止
 cross_line_r(); follow_line_r();   //G→D
 turn_migi(); follow_line_r();   //D→E
 turn_migi();  follow_line_r();   //E→F
 turn_migi(); follow_line_r();   //F→G
 pause;   //Gで一時停止
 cross_line_r();  follow_line_r();   //G→C
 pause;   //Cで一時停止
 turn_hidari(); follow_line_l();   //C→B
 pause;   //Bで一時停止
 cross_line_l(); go; Wait(500);   //A地点に入る 
 }
*まとめ [#nb426436]
プログラミングはうまくいったと思う。次の課題も頑張りたい。


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