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

Dependencies:   RemoteIR TextLCD

Revision:
17:f7259ab2fe86
Parent:
16:ffc732a3cf92
Child:
18:6cca64c7dbc3
--- a/main.cpp	Tue Aug 04 05:04:11 2020 +0000
+++ b/main.cpp	Tue Aug 04 08:43:58 2020 +0000
@@ -58,7 +58,7 @@
 int beforeMode;             // 前回のモード
 int flag_sp = 0;            // スピード変化フラグ
 Timer viewTimer;            // スピ―ド変更時に3秒計測タイマー
-float motorSpeed[9] = {0.7, 0.8, 0.9, 0.75, 0.85, 0.95, 0.8, 0.9, 1.0};
+float motorSpeed[9] = {0.5, 0.6, 0.7, 0.75, 0.85, 0.95, 0.8, 0.9, 1.0};
                             // モーター速度設定(後半はライントレース用)
                             
 Mutex  mutex;               // ミューテックス
@@ -94,6 +94,7 @@
 int far;                // 最も遠い距離
 int houkou;             // 進行方向(1:前 2:左 3:右)
 int i;                  // ループ変数
+int t1,t2=0;
 
 
 
@@ -122,7 +123,7 @@
 void decodeIR(void const *argument){ 
    while(1){ 
         // 受信待ち
-        pc.printf("decodeIR\r\n");
+        //pc.printf("decodeIR\r\n");
         if (ir.getState() == ReceiverIR::Received){ // コード受信
             bitcount = ir.getData(&format, buf, sizeof(buf) * 8);
             if(bitcount > 1){        // 受信成功
@@ -136,14 +137,14 @@
                 //pc.printf("%0x\r\n",code);
                 switch(code){
                     case 0x40bf27d8:    // クイック
-                        pc.printf("mode = SPEED\r\n");
+                        //pc.printf("mode = SPEED\r\n");
                         mode = SPEED;       // スピードモード 
                         changeSpeed();      // 速度変更
                         display();          // ディスプレイ表示
                         mode = beforeMode;  // 現在のモードに前回のモードを設定
                         break;
                     case 0x40be34cb:    // レグザリンク
-                        pc.printf("mode = LINE_TRACE\r\n");
+                        //pc.printf("mode = LINE_TRACE\r\n");
                         if(trace_thread->get_state() == Thread::Deleted){
                             delete trace_thread;
                             trace_thread = new Thread(trace);
@@ -153,7 +154,7 @@
                         display();          // ディスプレイ表示
                         break;
                     case 0x40bf6e91:    // 番組表
-                        pc.printf("mode = AVOIDANCE\r\n");
+                        //pc.printf("mode = AVOIDANCE\r\n");
                         if(avoi_thread->get_state() == Thread::Deleted){
                             delete avoi_thread;
                             avoi_thread = new Thread(avoidance);
@@ -164,31 +165,31 @@
                         display();          // ディスプレイ表示
                         break;
                     case 0x40bf3ec1:    // ↑
-                        pc.printf("mode = ADVANCE\r\n");
+                        //pc.printf("mode = ADVANCE\r\n");
                         mode = ADVANCE;     // 前進モード
                         run = ADVANCE;      // 前進
                         display();          // ディスプレイ表示
                         break;
                     case 0x40bf3fc0:    // ↓
-                        pc.printf("mode = BACK\r\n");
+                        //pc.printf("mode = BACK\r\n");
                         mode = BACK;        // 後退モード
                         run = BACK;         // 後退
                         display();          // ディスプレイ表示
                         break;
                     case 0x40bf5fa0:    // ←
-                        pc.printf("mode = LEFT\r\n");
+                        //pc.printf("mode = LEFT\r\n");
                         mode = LEFT;        // 左折モード
                         run = LEFT;         // 左折
                         display();          // ディスプレイ表示
                         break;
                     case 0x40bf5ba4:    // →
-                        pc.printf("mode = RIGHT\r\n");
+                        //pc.printf("mode = RIGHT\r\n");
                         mode = RIGHT;       // 右折モード
                         run = RIGHT;        // 右折
                         display();          // ディスプレイ表示
                         break;
                     case 0x40bf3dc2:    // 決定
-                        pc.printf("mode = STOP\r\n");
+                        //pc.printf("mode = STOP\r\n");
                         mode = STOP;        // 停止モード
                         run = STOP;         // 停止
                         display();          // ディスプレイ表示
@@ -209,14 +210,14 @@
             viewTimer.reset();  // タイマーリセット
             display();          // ディスプレイ表示
         }
-        ThisThread::sleep_for(90);  // 90ms待つ
+        ThisThread::sleep_for(60);  // 90ms待つ
     }       
 }
 
 /* モーター制御スレッド */
 void motor(void const *argument){
     while(1){
-        pc.printf("motor\r\n");
+        //pc.printf("motor\r\n");
         /* 走行状態の場合分け */
         switch(run){
             /* 前進 */
@@ -258,7 +259,7 @@
         if(flag_sp > VERYFAST){             // スピード変更フラグが2より大きいなら
             flag_sp -= 3 * (flag_sp / 3);   // スピード変更フラグ調整
         }
-        pc.printf("                motor\r\n");
+        //pc.printf("                motor\r\n");
         ThisThread::sleep_for(30);          // 30ms待つ
     }
 }
@@ -301,50 +302,50 @@
             /* センサー値によって場合分け */
             switch(sensorNum){
                 case 1:
-                    if(mode == LINE_TRACE){ // 現在ライントレースモードなら
+                    //if(mode == LINE_TRACE){ // 現在ライントレースモードなら
                         run = ADVANCE;      // 低速で前進
-                    }
-                    pc.printf("ADVANCE");
+                    //}
+                    //pc.printf("ADVANCE");
                     break;
                 case 2:
-                    if(mode == LINE_TRACE){ // 現在ライントレースモードなら
+                    //if(mode == LINE_TRACE){ // 現在ライントレースモードなら
                         run = RIGHT;        // 低速で右折
-                    }
-                    pc.printf("RIGHT");
+                    //}
+                    //pc.printf("RIGHT");
                     break;
                 case 3:
-                    if(mode == LINE_TRACE){ // 現在ライントレースモードなら
+                    //if(mode == LINE_TRACE){ // 現在ライントレースモードなら
                         run = LEFT;         // 低速で左折
-                    }
-                    pc.printf("LEFT");
+                    //}
+                    //pc.printf("LEFT");
                     break;
                 case 4:
-                    if(mode==LINE_TRACE){   // 現在ライントレースモードなら
+                    //if(mode==LINE_TRACE){   // 現在ライントレースモードなら
                         flag_sp = flag_sp % 3 + 3;   
                         run = RIGHT;        // 中速で右折
-                    }
-                    pc.printf("RIGHT");
+                    //}
+                    //pc.printf("RIGHT");
                     break;
                 case 5:
-                    if(mode == LINE_TRACE){ // 現在ライントレースモードなら
+                    //if(mode == LINE_TRACE){ // 現在ライントレースモードなら
                         flag_sp = flag_sp % 3 + 3;
                         run = LEFT;         // 中速で左折
-                    }
-                    pc.printf("LEFT");
+                    //}
+                    //pc.printf("LEFT");
                     break;
                 case 6:
-                    if(mode == LINE_TRACE){ // 現在ライントレースモードなら
+                    //if(mode == LINE_TRACE){ // 現在ライントレースモードなら
                         flag_sp = flag_sp % 3 + 6;
                         run = RIGHT;        // 高速で右折
-                    }
-                    pc.printf("RIGHT");
+                    //}
+                    //pc.printf("RIGHT");
                     break;
                 case 7:
-                    if(mode == LINE_TRACE){ // 現在ライントレースモードなら
+                    //if(mode == LINE_TRACE){ // 現在ライントレースモードなら
                         flag_sp = flag_sp % 3 + 6;
                         run = LEFT;         // 高速で左折
-                    }
-                    pc.printf("LEFT");
+                    //}
+                    //pc.printf("LEFT");
                     break;
             }
             ThisThread::sleep_for(30);      // 30ms待つ
@@ -358,7 +359,7 @@
 void avoidance(/*void const *argument*/){
     while(1){  
         //if(mode == AVOIDANCE){        // 現在障害物回避モードなら
-            pc.printf("avoidance\r\n");
+            //pc.printf("avoidance\r\n");
             watchsurrounding();
             pc.printf("%d  %d  %d  %d  %d  \r\n",SL,SLD,SC,SRD,SR);
             
@@ -379,7 +380,7 @@
                 }
                 if(SC < limit && SLD < limit && SL < limit && SRD < limit && SR < limit){   // 全方向に障害物がある場合
                     run = LEFT;                  // 左折                   
-                    while(i < 10){               // 進行方向確認
+                    while(i < 3){               // 進行方向確認
                         /*if(mode != AVOIDANCE){   // 現在障害物回避モードでないなら
                             break;    
                         } */  
@@ -417,13 +418,13 @@
                     switch(houkou){                        // 進行方向の場合分け
                         case 1:                            // 前の場合
                             run = ADVANCE;                 // 前進
-                            pc.printf("Advance\r\n");
+                            //pc.printf("Advance\r\n");
                             ThisThread::sleep_for(1000);   // 1秒待つ
                             break;
                         case 2:                            // 左の場合
                             run = LEFT;                    // 左折
-                            while(i < 10){                 // 進行方向確認
-                                pc.printf("left\r\n");
+                            while(i < 3){                 // 進行方向確認
+                                //pc.printf("left\r\n");
                                 /*if(mode != AVOIDANCE){     // 現在障害物回避モードでないなら
                                         break;    
                                 }*/
@@ -438,8 +439,8 @@
                             break;
                         case 3:                            // 右の場合
                             run = RIGHT;                   // 右折
-                            while(i < 10){                 // 進行方向確認
-                                pc.printf("right\r\n");
+                            while(i < 3){                 // 進行方向確認
+                                //pc.printf("right\r\n");
                                 /*if(mode != AVOIDANCE){     // 現在障害物回避モードでないなら
                                     break;    
                                 }*/
@@ -455,9 +456,9 @@
                     }
                 }
             }
-            pc.printf("こんにちは!\r\n");
+            //pc.printf("こんにちは!\r\n");
             flag_a = 0;                   // 障害物有無フラグを0にセット
-            pc.printf("                avoidance\r\n");
+            //pc.printf("                avoidance\r\n");
         /*}else{  
             ThisThread::sleep_for(1);     // 1ms待つ
         }*/
@@ -466,28 +467,40 @@
 
 /* 距離計測関数 */
 int watch(){
-    pc.printf("watch\r\n");
+    //pc.printf("watch\r\n");
     trig = 0;
     ThisThread::sleep_for(5);       // 5ms待つ
     trig = 1;
     ThisThread::sleep_for(15);      // 15ms待つ
     trig = 0;
-    while(echo.read() == 0){
+    timer.start();
+    t1=timer.read_ms();
+    t2=timer.read_ms();
+    while(echo.read() == 0&&(t1-t2)<10){
+        
+        t1=timer.read_ms();
         led1 = 1;
         if(mode!=AVOIDANCE){        // 現在障害物回避モードでないなら
             break;    
         }
     }
-    timer.start();                  // 距離計測タイマースタート
-    while(echo.read() == 1){
+    timer.stop();
+    timer.reset();
+    if((t1-t2)<10){
+        timer.start();                  // 距離計測タイマースタート
+        while(echo.read() == 1){
+        }
+        timer.stop();                   // 距離計測タイマーストップ
+        DT = (int)(timer.read_us()*0.01657);   // 距離計算
+        if(DT > 100){                   // 検知範囲外なら100cmに設定
+            DT = 100;
+        }
+        timer.reset();                  // 距離計測タイマーリセット
     }
-    timer.stop();                   // 距離計測タイマーストップ
-    DT = (int)(timer.read_us()*0.01657);   // 距離計算
-    if(DT > 100){                   // 検知範囲外なら100cmに設定
-        DT = 100;
+
+    if((t1-t2)>=10){
+        DT=100;
     }
-    
-    timer.reset();                  // 距離計測タイマーリセット
     pc.printf("私はDTである。%d\r\n",DT);
     led1 = 0;
     return DT;
@@ -495,7 +508,7 @@
 
 /* 障害物検知関数 */
 void watchsurrounding(){
-    pc.printf("watchsurrounding\r\n");
+    //pc.printf("watchsurrounding\r\n");
     SC = watch();
     if(SC < limit){                 // 正面20cm以内に障害物がある場合
         if(mode == AVOIDANCE)       // 現在障害物回避モードなら
@@ -504,49 +517,49 @@
             return;          
     }
     servo.pulsewidth_us(1925);      // サーボを左に40度回転
-    ThisThread::sleep_for(250);     // 250ms待つ
+    ThisThread::sleep_for(25);     // 250ms待つ
     SLD = watch();
     if(SLD < limit){                // 左前20cm以内に障害物がある場合
-        if(mode == AVOIDANCE)       // 現在障害物回避モードなら
+        //if(mode == AVOIDANCE)       // 現在障害物回避モードなら
             run = STOP;             // 停止
-        else
-            return; 
+        //else
+            //return; 
     }
     servo.pulsewidth_us(2400);      // サーボを左に90度回転
-    ThisThread::sleep_for(250);     // 250ms待つ
+    ThisThread::sleep_for(25);     // 250ms待つ
     SL = watch();
     if(SL < limit){                 // 左20cm以内に障害物がある場合
-        if(mode == AVOIDANCE)       // 現在障害物回避モードなら
+        //if(mode == AVOIDANCE)       // 現在障害物回避モードなら
             run = STOP;             // 停止
-        else
-            return; 
+        //else
+            //return; 
     }
     servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
-    ThisThread::sleep_for(100);     // 100ms待つ
+    ThisThread::sleep_for(10);     // 100ms待つ
     servo.pulsewidth_us(925);       // サーボを右に40度回転
-    ThisThread::sleep_for(250);     // 250ms待つ
+    ThisThread::sleep_for(25);     // 250ms待つ
     SRD = watch();
     if(SRD < limit){                // 右前20cm以内に障害物がある場合
-        if(mode == AVOIDANCE)       // 現在障害物回避モードなら
+        //if(mode == AVOIDANCE)       // 現在障害物回避モードなら
             run = STOP;             // 停止
-        else
-            return; 
+        //else
+            //return; 
     }
     servo.pulsewidth_us(500);       // サーボを右に90度回転
-    ThisThread::sleep_for(250);     // 250ms待つ
+    ThisThread::sleep_for(25);     // 250ms待つ
     SR = watch();
     if(SR < limit){                 // 右20cm以内に障害物がある場合
-        if(mode == AVOIDANCE)       // 現在障害物回避モードなら
+        //if(mode == AVOIDANCE)       // 現在障害物回避モードなら
             run = STOP;             // 停止
-        else
-            return;     
+        //else
+            //return;     
     }
     servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
-    ThisThread::sleep_for(100);     // 100ms待つ
+    ThisThread::sleep_for(10);     // 100ms待つ
     if(SC < limit || SLD < limit || SL < limit || SRD < limit || SR < limit){ // 20cm以内に障害物を検知した場合
         flag_a = 1;                 // 障害物有無フラグに1をセット
     }
-    pc.printf("                watchsurrounding\r\n");
+    //pc.printf("                watchsurrounding\r\n");
 }
 
 /* ディスプレイ表示関数 */
@@ -624,7 +637,7 @@
 
 /* バッテリー残量更新関数 */
 void bChange(){
-    pc.printf("                                                                              bChange1\r\n");
+    //pc.printf("                                                                              bChange1\r\n");
     b = (int)(((battery.read() * 3.3 - MIN_V)/0.67)*10+0.5)*10;
     if(b <= 0){                      // バッテリー残量0%なら全ての機能停止
         b = 0;
@@ -635,7 +648,7 @@
     mutex.lock();                    // ミューテックスロック
     lcd.setAddress(0,0);
     lcd.printf("Battery:%3d%%",b);   // バッテリー残量表示
-    pc.printf("                                                                              bChange2\r\n");
+    //pc.printf("                                                                              bChange2\r\n");
     mutex.unlock();                  // ミューテックスアンロック                 
     if(b <= 30){                     // バッテリー残量30%以下なら
         if(flag_t == 0){             // バックライトタイマーフラグが0なら
@@ -666,9 +679,9 @@
     display();              // ディスプレイ表示
     
     while(1){
-        pc.printf("                                    main1\r\n");
+        //pc.printf("                                    main1\r\n");
         bChange();          // バッテリー残量更新
-        pc.printf("                                    main2\r\n");
+        //pc.printf("                                    main2\r\n");
         ThisThread::sleep_for(1); // 1ms待つ
     }
 }
\ No newline at end of file