ver6_2の修正版 変更点 phase1のバグ kaisyu関数 tyokudo関数

Dependencies:   mbed QEI PID

Revision:
6:5a051a378e42
Parent:
5:167327a82430
Child:
7:7f16fb8b0192
--- a/main.cpp	Sun Sep 23 17:02:06 2018 +0000
+++ b/main.cpp	Fri Sep 28 08:13:44 2018 +0000
@@ -24,9 +24,12 @@
 #define Ki 0.02
 #define Kd 0.0
 //PIDGain of rollers
-#define roller_Kp 4.0
-#define roller_Ki 0.04
-#define roller_Kd 0.0
+#define front_roller_Kp 1.3
+#define front_roller_Ki 0.19
+#define front_roller_Kd 0.0
+#define back_roller_Kp  1.3
+#define back_roller_Ki  0.1
+#define back_roller_Kd  0.0
 //PIDGain of wheels(slow_mode)
 #define Kp_slow 0.6
 #define Ki_slow 0.03
@@ -83,9 +86,9 @@
 PID hidariusiro_slow(Kp_slow, Ki_slow, Kd_slow, 0.001);
 
 //前ローラー
-PID front_roller(roller_Kp, roller_Ki, roller_Kd, 0.001);
+PID front_roller(front_roller_Kp, front_roller_Ki, front_roller_Kd, 0.001);
 //後ローラー
-PID back_roller (roller_Kp, roller_Ki, roller_Kd, 0.001);
+PID back_roller (back_roller_Kp, back_roller_Ki, back_roller_Kd, 0.001);
 
 //MDとの通信ポート
 I2C i2c(PB_9, PB_8);  //SDA, SCL
@@ -134,7 +137,8 @@
 //青ゾーンLED
 DigitalOut red_side(PC_3);
 //スタートLED
-DigitalOut start_LED(PA_8);
+DigitalOut start_LED(PC_13);
+//DigitalOut start_LED(PA_8);
 //LED1
 DigitalOut myled1(PC_6);
 //LED2
@@ -163,8 +167,7 @@
 //左後オムニ
 QEI hidariusiro_wheel(PB_14, PB_13, NC, 624);
 
-Ticker get_rps;
-Ticker get_distance;
+Ticker get_rpm;
 Timer timer;
 Timer back_timer1;
 Timer back_timer2;
@@ -180,8 +183,7 @@
 unsigned int distance;
 int trace_direction = 0;
 static int i = 0;
-int right_flag = 0;
-
+int lateral_frag = 0;
 
 int migimae_rpm;
 int migiusiro_rpm;
@@ -1255,8 +1257,8 @@
     //7bit目が1だったら7bit目を0に戻す
     if((0b10000000 & line_state) == 0b10000000) {
         back_line_state = 0b01111111 & line_state;
-    }
-    else {
+        
+    } else {
         front_line_state = line_state;
     }
     //4byte以上は出力できないよ
@@ -1279,7 +1281,7 @@
     //緊急停止用信号ピンをLow
     emergency = 0;
     //回転数取得関数のタイマ割り込み(40ms)
-    get_rps.attach_us(&flip, 40000);
+    get_rpm.attach_us(&flip, 40000);
 
     //フォトセンサ制御基板との通信ボーレートの設定(115200)
     photo.baud(115200);
@@ -1309,7 +1311,8 @@
 
         //超音波取得関数の呼び出し
         ultrasonic();
-
+        start_LED = 1;
+        
         //赤ゾーン選択
         if(side == red){
             red_side = 1;
@@ -1320,9 +1323,8 @@
             blue_side = 1;
         }
 
-        //スタートボタン押したらエアシリ伸びる&start_flag立つ
+        //スタートボタン押したらエアシリ伸びる
         if(start_button == 0){
-            //start_flag = 1;
             myled1 = 1;
             cylinder_data[0] = 0x0F;
             i2c.write(0x40, cylinder_data, 1);
@@ -1370,6 +1372,8 @@
           i2c.write(0x16, true_hidariusiro_data, 1, false);
           wait_us(20);
           */
+          
+            /*  
             //距離が11cm~29cmだったらトレースせずに停止
             if(distance > 10 && distance < 30) {
                 //タイマスタート
@@ -1388,208 +1392,191 @@
             } else {
                 //タイマリセット
                 timer.reset();
-                /*
-                //リミットスイッチが押されたら
-                if(limit.read() == 0) {
-                    //トレース方向の反転
-                    trace_direction = 0;
-                    //タイマスタート
-                    timer.start();
-                    //1.5秒間右移動
-                    if(timer.read() < 1.5f) {
+
+                //ライン検知するまで右移動
+                if((front_line_state == 0) && (back_line_state == 0)) {
+                    //青ゾーンの時ライン検知するまで右移動
+                    if(side == blue) {
                         line_state_pettern = right_slow;
+                    //赤ゾーンの時ライン検知するまで左移動
                     } else {
-                        timer.reset();
+                        line_state_pettern = left_slow;
                     }
-                    */
-                    
-                    //ライン検知するまで右移動
-                    if((front_line_state == 0) && (back_line_state == 0)) {
-                        //青ゾーンの時ライン検知するまで右移動
-                        if(side == blue) {
-                            line_state_pettern = right_slow;
-                        //赤ゾーンの時ライン検知するまで左移動
-                        } else {
-                            line_state_pettern = left_slow;
-                        }
-                    }
-                    /*
-                    //前はライン検知してるけど後ろは検知できない時右移動
-                    else if((front_line_state >= 1) && (back_line_state == 0)) {
-                        line_state_pettern = right_super_slow;
-                    }
-                    //前はライン検知できないけど後ろは検知してる時右移動
-                    else if((front_line_state == 0) && (back_line_state >= 1)) {
+                }
+                */
+                
+                /*
+                //前はライン検知してるけど後ろは検知できない時右移動
+                else if((front_line_state >= 1) && (back_line_state == 0)) {
+                    line_state_pettern = right_super_slow;
+                }
+                //前はライン検知できないけど後ろは検知してる時右移動
+                else if((front_line_state == 0) && (back_line_state >= 1)) {
+                    line_state_pettern = right_super_slow;
+                }
+                */
+                
+                /*
+                //前が右寄りの時
+                else if((front_line_state <= 5) && (front_line_state != 0)) {
+                        
+                    //前も後ろも右寄りの時右移動
+                    if((back_line_state <= 5) && (back_line_state != 0)) {
                         line_state_pettern = right_super_slow;
                     }
-                    */
-                    
-                    //前が右寄りの時
-                    else if((front_line_state <= 5) && (front_line_state != 0)) {
+                    //前が右寄りで後ろが真ん中の時前右旋回後ろ前進
+                    else if((back_line_state >= 6) && (back_line_state <= 12)) {
+                        line_state_pettern = front_right_back_front;
+                    }
+                    //前が右寄りで後ろが左寄りの時左旋回
+                    else if((back_line_state >= 13) && (back_line_state <= 17)) {
+                        line_state_pettern = turn_left;
+                    }
                         
-                        //前も後ろも右寄りの時右移動
-                        if((back_line_state <= 5) && (back_line_state != 0)) {
-                            line_state_pettern = right_super_slow;
-                        }
-                        //前が右寄りで後ろが真ん中の時前右旋回後ろ前進
-                        else if((back_line_state >= 6) && (back_line_state <= 12)) {
-                            line_state_pettern = front_right_back_front;
-                        }
-                        //前が右寄りで後ろが左寄りの時左旋回
-                        else if((back_line_state >= 13) && (back_line_state <= 17)) {
-                            line_state_pettern = turn_left;
-                        }
+                }
+                //前が真ん中寄りの時
+                else if((front_line_state >= 6) && (front_line_state <= 12)) {
                         
+                    //前が真ん中で後ろが右寄りの時前前進後ろ右旋回
+                    if((back_line_state <= 5) && (back_line_state != 0)) {
+                            line_state_pettern = front_front_back_right;
                     }
-                    //前が真ん中寄りの時
-                    else if((front_line_state >= 6) && (front_line_state <= 12)) {
-                        
-                        //前が真ん中で後ろが右寄りの時前前進後ろ右旋回
-                        if((back_line_state <= 5) && (back_line_state != 0)) {
-                            line_state_pettern = front_front_back_right;
+                    //前も後ろも真ん中の時前進
+                    else if((back_line_state >= 6) && (back_line_state <= 12)) {
+                        if(trace_direction == 0) {
+                            line_state_pettern = front_trace;
                         }
-                        //前も後ろも真ん中の時前進
-                        else if((back_line_state >= 6) && (back_line_state <= 12)) {
-                            if(trace_direction == 0) {
-                                line_state_pettern = front_trace;
-                            }
-                            else if(trace_direction == 1) {
-                                line_state_pettern = back_trace;
-                                /*
-                                //リミットスイッチが押されたら
-                                if(limit.read() == 0) {
-                                    //トレース方向の反転
-                                    trace_direction = 0;
-                                    right_flag = 1;
-                                    //timer.start();
-                                    //1.5秒間右移動
-                                    //if(timer.read() < 1.5f) {
-                                        //line_state_pettern = right_slow;
-                                    //} else {
-                                        //timer.reset();
-                                    //}
-                                }
-                                */
-                            }
-                        }
-                        //前が真ん中で後ろが左寄りの時前前進後ろ左旋回
-                        else if((back_line_state >= 13) && (back_line_state <= 17)) {
-                            line_state_pettern = front_front_back_left;
+                        else if(trace_direction == 1) {
+                            line_state_pettern = back_trace;
                         }
                     }
+                    //前が真ん中で後ろが左寄りの時前前進後ろ左旋回
+                    else if((back_line_state >= 13) && (back_line_state <= 17)) {
+                        line_state_pettern = front_front_back_left;
+                    }
+                }
                 //前が左寄りの時
-                    else if((front_line_state >= 13) && (front_line_state <= 17)) {
+                else if((front_line_state >= 13) && (front_line_state <= 17)) {
                         
-                        //前が左寄りで後ろが右寄りの時右旋回
-                        if((back_line_state <= 5) && (back_line_state != 0)) {
-                            line_state_pettern = turn_right;
-                        }
-                        //前が左寄りで後ろが真ん中の時前左旋回後ろ前進
-                        else if((back_line_state >= 6) && (back_line_state <= 12)) {
-                            line_state_pettern = front_left_back_front;
-                        }
-                        //前が左よりで後ろも左寄りの時左移動
-                        else if((back_line_state >= 13) && (back_line_state <= 17)) {
-                            line_state_pettern = left_super_slow;
-                        }
+                    //前が左寄りで後ろが右寄りの時右旋回
+                    if((back_line_state <= 5) && (back_line_state != 0)) {
+                        line_state_pettern = turn_right;
+                    }
+                    //前が左寄りで後ろが真ん中の時前左旋回後ろ前進
+                    else if((back_line_state >= 6) && (back_line_state <= 12)) {
+                        line_state_pettern = front_left_back_front;
+                    }
+                    //前が左よりで後ろも左寄りの時左移動
+                    else if((back_line_state >= 13) && (back_line_state <= 17)) {
+                        line_state_pettern = left_super_slow;
+                    }
                         
-                    //それ以外
-                    } else {
-                        line_state_pettern = stop;
-                    }
-                //スイッチが押されていないとき(壁から離れたとき)
-                /*
+                //それ以外
                 } else {
-                    //後進し続ける
-                    line_state_pettern = back_trace;
-                }*/
+                    line_state_pettern = stop;
+                }
             }
         //}
-
-        pc.printf("F%3d B%3d P%3d %3d %3d\n\r", front_line_state, back_line_state, line_state_pettern, abs(measure_pulse), right_flag);
+        
+        pc.printf("F%3d B%3d P%3d %3d %3d\n\r", front_line_state, back_line_state, line_state_pettern, abs(measure_pulse), lateral_frag);
         
-        //right_flagが0(初期状態)の時
-        if(right_flag == 0) {
-            //リミットONでright_flag = 1
+        //lateral_fragが0(初期状態)の時
+        if(lateral_frag == 0) {
+            //リミットONでlateral_frag = 1
             if(limit.read() == 0) {
-                right_flag = 1;
+                lateral_frag = 1;
             }
         }
         //リミットがONの時(1回目)
-        if(right_flag == 1) {
+        if(lateral_frag == 1) {
             //トレース方向の反転(前進)
             trace_direction = 0;
             back_timer1.start();          
             if(back_timer1.read() <= 1.5f && back_timer1.read() != 0.0f) {
-                line_state_pettern  = right_slow;
+                if(side == blue) {
+                    line_state_pettern  = right_slow;
+                }
+                else if(side == red) {
+                    line_state_pettern  = left_slow;
+                }
             }
             else if(back_timer1.read() > 1.5f) {
                 back_timer1.reset();
-                right_flag = 2;
+                lateral_frag = 2;
             }  
         }
-        else if(right_flag == 2) {
+        else if(lateral_frag == 2) {
             if(limit.read() == 0) {
-                right_flag = 3;
+                lateral_frag = 3;
             }
         }
         //リミットがONの時(2回目)
-        else if(right_flag == 3) {
+        else if(lateral_frag == 3) {
             trace_direction = 0;
             back_timer2.start();          
             if(back_timer2.read() <= 0.8f && back_timer2.read() != 0.0f) {
-                line_state_pettern  = right_slow;
+                if(side == blue) {
+                    line_state_pettern  = right_slow;
+                }
+                else if(side == red) {
+                    line_state_pettern  = left_slow;
+                }
             }
             else if(back_timer2.read() > 0.8f) {
                 back_timer2.reset();
-                right_flag = 4;
+                lateral_frag = 4;
             }  
         }
-        else if(right_flag == 4) {
+        else if(lateral_frag == 4) {
             if(limit.read() == 0) {
-                right_flag = 5;
+                lateral_frag = 5;
             }
         }
         //リミットがONの時(3回目)
-        else if(right_flag == 5) {
+        else if(lateral_frag == 5) {
             trace_direction = 0;
             back_timer3.start();  
             if(back_timer3.read() <= 0.8f && back_timer3.read() != 0.8f) {
-                line_state_pettern  = right_slow;
+                if(side == blue) {
+                    line_state_pettern  = right_slow;
+                }
+                else if(side == red) {
+                    line_state_pettern  = left_slow;
+                }
             }
             else if(back_timer3.read() > 0.8f) {
                 back_timer3.reset();
-                right_flag = 6;
+                lateral_frag = 6;
             }  
         }
-        else if(right_flag == 6) {
+        else if(lateral_frag == 6) {
             if(limit.read() == 0) {
-                right_flag = 7;
+                lateral_frag = 7;
             }
         }
         //リミットがONの時(4回目)
-        else if(right_flag == 7) {
+        else if(lateral_frag == 7) {
             //スタートゾーンに近づいたら減速
             if(abs(measure_pulse) < 1200) {
-                line_state_pettern = left_super_slow;
+                if(side == blue) {
+                    line_state_pettern  = left_super_slow;
+                }
+                else if(side == red) {
+                    line_state_pettern  = right_super_slow;
+                }
             }
-            else if(abs(measure_pulse) < 500) {
+            else if(abs(measure_pulse) < 800) {
                 line_state_pettern = stop;
             } else {
-                line_state_pettern = left_slow;
+                if(side == blue) {
+                    line_state_pettern  = left_slow;
+                }
+                else if(side == red) {
+                    line_state_pettern  = right_slow;
+                }
             }
         }
-        
-        /*
-        if(right_flag == 1) {
-            line_state_pettern = front_trace;
-            wait(2);
-            line_state_pettern = right_slow;
-            wait(2);
-            right_flag = 2;
-        }
-        */
-            
+                    
         switch(line_state_pettern) {
 
             //青ゾーンでライン検知しないと低速右移動
@@ -1720,16 +1707,6 @@
 
             //それ以外ショートブレーキ
             default:
-                /*
-                front_PID_slow(30, 30, 30, 30);
-                i2c.write(0x10, true_migimae_data,     1, false);
-                i2c.write(0x12, true_migiusiro_data,   1, false);
-                i2c.write(0x14, true_hidarimae_data,   1, false);
-                i2c.write(0x16, true_hidariusiro_data, 1, false);
-                wait_us(20);
-                break;
-                */
-                
                 true_migimae_data[0]     = 0x80;
                 true_migiusiro_data[0]   = 0x80;
                 true_hidarimae_data[0]   = 0x80;
@@ -1740,8 +1717,7 @@
                 i2c.write(0x16, true_hidariusiro_data, 1, false);
                 wait_us(20);
                 break;
-                
-        }
+        }*/
 
         /*
         //前進
@@ -1860,32 +1836,16 @@
         i2c.write(0x14, true_hidarimae_data,  1, false);
         i2c.write(0x16, true_hidariusiro_data,1, false);
         wait_us(20);
-
+        */
+        
         //ローラーぐるぐる(max930rpm)
-        roller_PID(440, 400);
+        pc.printf("%3d %3d %3d\n\r", abs(front_roller_rpm), abs(back_roller_rpm), distance);
+        //このパラメータ(距離10cm, 中央下段)で3~6割の確率で勃つ
+        roller_PID(789, 671);
         i2c.write(0x20, front_roller_data, 1, false);
         i2c.write(0x22, back_roller_data,  1, false);
         wait_us(20);
-        */
-
-        /*
-        if(front_roller_rpm > 500) {
-            cylinder_data[0] = 0x0F;
-            i2c.write(0x40, cylinder_data, 1);
-            myled5 = 1;
-            wait(0.5);
-
-            cylinder_data[0] = 0x80;
-            i2c.write(0x40, cylinder_data, 1);
-            myled5 = 0;
-            wait(0.5);
-        } else {
-            cylinder_data[0] = 0x80;
-            i2c.write(0x40, cylinder_data, 1);
-            myled5 = 0;
-            wait(0.5);
-        }
-        */
+        
         /*
         //どんどん加速(逆転)
         for(send_data[0] = 0x84; send_data[0] < 0xFF; send_data[0]++){