ボタンを押すと、 バッテリ更新を停止し、 他のボタンもロックさせる

Dependencies:   RemoteIR TextLCD

Revision:
28:cb51cafca490
Parent:
27:90962c01bfeb
Child:
29:600e4b9b5c5b
--- a/main.cpp	Thu Aug 06 02:18:20 2020 +0000
+++ b/main.cpp	Thu Aug 06 03:02:32 2020 +0000
@@ -77,9 +77,9 @@
 
 /* trace用変数 */
 int sensArray[32] = {8,6,2,4,1,1,2,2,   // ライントレースセンサパターン
-                    3,1,1,1,3,1,1,2,
-                    7,1,1,1,1,1,1,1,
-                    5,1,1,1,3,1,3,1};
+                     3,1,1,1,3,1,1,2,
+                     7,1,1,1,1,1,1,1,
+                     5,1,1,1,3,1,3,1};
 
 /* avoidance用変数 */
 Timer timer;            // 距離計測用タイマ
@@ -227,6 +227,7 @@
                 }
                 if(mode != AVOIDANCE && avoi_thread->get_state() != Thread::Deleted){
                     avoi_thread->terminate();
+                    servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
                 }
             }
         }
@@ -362,8 +363,7 @@
         pc.printf("%d  %d  %d  %d  %d  \r\n",SL,SLD,SC,SRD,SR);
         if(flag_a == 0){                     // 障害物がない場合
             run = ADVANCE;               // 前進
-        }
-        else{                                // 障害物がある場合                   
+        }else{                                // 障害物がある場合                   
             i = 0;
             if(SC < 15){                     // 正面15cm以内に障害物が現れた場合
                 run = BACK;                  // 後退
@@ -371,72 +371,71 @@
                 }
                     run = STOP;                  // 停止                 
             }
-            if(SC < limit && SLD < limit && SL < limit && SRD < limit && SR < limit){   // 全方向に障害物がある場合
+            if(SC < limit && SLD < limit && SL < limit && SRD < limit && SR < limit){   // 全方向に障害物がある場合  
                 run = LEFT;                  // 左折                   
-                while(i < 3){               // 進行方向確認 
+                while(i < 1){               // 進行方向確認 
+                    flag_sp = flag_sp % 3 + 6; 
                     if(watch() > limit){    
                         i++;
-                    }
-                        else{                   
-                            i = 0;              
-                        }
-                    }
-                    run = STOP;                 // 停止
-                }
-                else {                          // 全方向以外                          
-                    far = SC;                   // 正面を最も遠い距離に設定
-                    houkou = 1;                 // 進行方向を前に設定
-                    if(far < SLD || far < SL){  // 左または左前がより遠い場合
-                        if(SL < SLD){           // 左前が左より遠い場合
-                            far = SLD;          // 左前を最も遠い距離に設定
-                        }
-                        else{                   // 左が左前より遠い場合
-                            far = SL;           // 左を最も遠い距離に設定
-                        }
-                        houkou = 2;             // 進行方向を左に設定
-                    }
-                    if(far < SRD || far < SR){  // 右または右前がより遠い場合
-                        if(SR < SRD){           // 右前が右より遠い場合
-                            far = SRD;          // 右前を最も遠い距離に設定
-                        }
-                        else{                   // 右が右前よりも遠い場合
-                            far = SR;           // 右を最も遠い距離に設定
-                        }
-                        houkou = 3;             // 進行方向を右に設定
-                    }
-                    switch(houkou){                        // 進行方向の場合分け
-                        case 1:                            // 前の場合
-                            run = ADVANCE;                 // 前進
-                            ThisThread::sleep_for(1000);   // 1秒待つ
-                            break;
-                        case 2:                            // 左の場合
-                            run = LEFT;                    // 左折
-                            while(i < 3){                 // 進行方向確認
-                                if(watch() > (far - 2)){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
-                                    i++;                   // ループ+  
-                                }
-                                else{
-                                    i = 0;
-                                }
-                            }
-                            run = STOP;                    // 停止
-                            break;
-                        case 3:                            // 右の場合
-                            run = RIGHT;                   // 右折
-                            while(i < 3){                 // 進行方向確認
-                                if(watch() > (far - 2)){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
-                                    i++;                   // ループ+  
-                                }
-                                else{
-                                    i = 0;
-                                }
-                            }
-                            run = STOP;                    // 停止
-                            break;
+                    }else{                   
+                        i = 0;              
                     }
                 }
+                run = STOP;                 // 停止
+            }else {                          // 全方向以外                          
+                far = SC;                   // 正面を最も遠い距離に設定
+                houkou = 1;                 // 進行方向を前に設定
+                if(far < SLD || far < SL){  // 左または左前がより遠い場合
+                    if(SL < SLD){           // 左前が左より遠い場合
+                        far = SLD;          // 左前を最も遠い距離に設定
+                    }else{                   // 左が左前より遠い場合
+                        far = SL;           // 左を最も遠い距離に設定
+                    }
+                    houkou = 2;             // 進行方向を左に設定
+                }
+                if(far < SRD || far < SR){  // 右または右前がより遠い場合
+                    if(SR < SRD){           // 右前が右より遠い場合
+                        far = SRD;          // 右前を最も遠い距離に設定
+                    }else{                   // 右が右前よりも遠い場合
+                        far = SR;           // 右を最も遠い距離に設定
+                    }
+                    houkou = 3;             // 進行方向を右に設定
+                }
+                switch(houkou){                        // 進行方向の場合分け
+                    case 1:                            // 前の場合
+                        run = ADVANCE;                 // 前進
+                        ThisThread::sleep_for(1000);   // 1秒待つ
+                        break;
+                    case 2:                            // 左の場合
+                        
+                        run = LEFT;                    // 左折
+                        while(i < 1){                 // 進行方向確認
+                            flag_sp = flag_sp % 3 + 6; 
+                            if(watch() > (far - 2)){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
+                                i++;                   // ループ+  
+                            }else{
+                                i = 0;
+                            }
+                        }
+                        run = STOP;                    // 停止
+                        break;
+                    case 3:                            // 右の場合
+                        
+                        run = RIGHT;                   // 右折
+                        while(i < 1){                 // 進行方向確認
+                            flag_sp = flag_sp % 3 + 6; 
+                            if(watch() > (far - 2)){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
+                                i++;                   // ループ+  
+                            }else{
+                                i = 0;
+                            }
+                        }
+                        run = STOP;                    // 停止
+                        break;
+                }
             }
-            flag_a = 0;                   // 障害物有無フラグを0にセット
+        }
+        flag_a = 0;                   // 障害物有無フラグを0にセット
     }   
 }
 
@@ -457,16 +456,17 @@
         }
         timer.stop();
         timer.reset();
-        if((t1-t2) >= 10){
-        run = STOP;
-        }
+        /*if((t1-t2) >= 10){
+        run = STOP;*/
     }while((t1-t2) >= 10);
     timer.start();                  // 距離計測タイマースタート
     while(echo.read() == 1){
     }
     timer.stop();                   // 距離計測タイマーストップ
     DT = (int)(timer.read_us()*0.01657);   // 距離計算
-    if(DT > 150){                   // 検知範囲外なら100cmに設定
+    if(DT > 1000){
+        DT = -1;    
+    }else if(DT > 150){                   // 検知範囲外なら100cmに設定
         DT = 150;
     }
     timer.reset();                  // 距離計測タイマーリセット
@@ -476,47 +476,57 @@
 
 /* 障害物検知関数 */
 void watchsurrounding(){
-    servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
-    ThisThread::sleep_for(90);     // 100ms待つ
+    //servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
+    //ThisThread::sleep_for(200);     // 100ms待つ
     SC = watch();
-    if(SC < limit){                 // 正面20cm以内に障害物がある場合
-        run = STOP;             // 停止        
+    if(SC < limit){         // 正面20cm以内に障害物がある場合
+        if(SC!=-1){              
+            run = STOP;     // 停止  
+            flag_a = 1;     
+        }                
     }
     servo.pulsewidth_us(1925);      // サーボを左に40度回転
-    ThisThread::sleep_for(200);     // 250ms待つ
+    ThisThread::sleep_for(100);     // 250ms待つ
     SLD = watch();
     if(SLD < limit){                // 左前20cm以内に障害物がある場合
         run = STOP;             // 停止
+        flag_a = 1;
     }
     servo.pulsewidth_us(2400);      // サーボを左に90度回転
-    ThisThread::sleep_for(200);     // 250ms待つ
+    ThisThread::sleep_for(100);     // 250ms待つ
     SL = watch();
     if(SL < limit){                 // 左20cm以内に障害物がある場合
         run = STOP;             // 停止
+        flag_a = 1;
     }
     servo.pulsewidth_us(1450);
-    ThisThread::sleep_for(90);
+    ThisThread::sleep_for(250);
     SC = watch();
     if(SC < limit){
-        run = STOP;
+        if(SC!=-1){              
+            run = STOP;     // 停止  
+            flag_a = 1;     
+        } 
     }
     servo.pulsewidth_us(925);       // サーボを右に40度回転
-    ThisThread::sleep_for(200);     // 250ms待つ
+    ThisThread::sleep_for(100);     // 250ms待つ
     SRD = watch();
     if(SRD < limit){                // 右前20cm以内に障害物がある場合
         run = STOP;             // 停止
+        flag_a = 1;
     }
     servo.pulsewidth_us(500);       // サーボを右に90度回転
-    ThisThread::sleep_for(200);     // 250ms待つ
+    ThisThread::sleep_for(100);     // 250ms待つ
     SR = watch();
     if(SR < limit){                 // 右20cm以内に障害物がある場合
-        run = STOP;             // 停止     
+        run = STOP;             // 停止   
+        flag_a = 1;  
     }
     servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
-    ThisThread::sleep_for(80);     // 100ms待つ
-    if(SC < limit || SLD < limit || SL < limit || SRD < limit || SR < limit){ // 20cm以内に障害物を検知した場合
+    ThisThread::sleep_for(250);     // 100ms待つ
+    /*if(SC < limit || SLD < limit || SL < limit || SRD < limit || SR < limit){ // 20cm以内に障害物を検知した場合
         flag_a = 1;                 // 障害物有無フラグに1をセット
-    }
+    }*/
 }
 
 /* ディスプレイ表示関数 */