denki1 / Mbed OS a

Dependencies:   RemoteIR TextLCD linetrace

Files at this revision

API Documentation at this revision

Comitter:
jiang111
Date:
Wed Sep 23 02:09:32 2020 +0000
Parent:
51:2d35f207d217
Commit message:
1

Changed in this revision

linetrace1.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linetrace1.lib	Wed Sep 23 02:09:32 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/denki/code/linetrace/#2d35f207d217
--- a/main.cpp	Tue Sep 01 08:00:17 2020 +0000
+++ b/main.cpp	Wed Sep 23 02:09:32 2020 +0000
@@ -1,3 +1,4 @@
+
 /* mbed Microcontroller Library
  * Copyright (c) 2019 ARM Limited
  * SPDX-License-Identifier: Apache-2.0
@@ -18,32 +19,32 @@
 #define     LOW         0    // モーターOFF
 #define     HIGH        1    // モーターON
 #define     NORMAL      0    // 普通
-#define     FAST        1    // 速い
-#define     VERYFAST    2    // とても速い
+#define     FAST        3    // 速い
+#define     VERYFAST    6    // とても速い
 
 #define     SLOW        0.8
 #define     REVERSE     0.5
 
 #define     MBED04      0.781//Mbed04号機の左右のモーター速度比(R:L = 1: 0.781)
 #define     MBED05      0.953//Mbed05号機の左右のモーター速度比(R:L = 1: 0.953)
-#define     MSR0        0.4
-#define     MSR1        0.5
-#define     MSR2        0.6
-#define     MSR3        MSR0*SLOW
-#define     MSR4        MSR1*SLOW
-#define     MSR5        MSR2*SLOW
-#define     MSR6        0.7
-#define     MSR7        0.8
-#define     MSR8        0.9
-#define     MSL0        MSR0*MBED05
-#define     MSL1        MSR1*MBED05
-#define     MSL2        MSR2*MBED05
-#define     MSL3        MSR3*MBED05
-#define     MSL4        MSR4*MBED05
-#define     MSL5        MSR5*MBED05
-#define     MSL6        MSR6*MBED05
-#define     MSL7        MSR7*MBED05
-#define     MSL8        MSR8*MBED05
+#define     MSR0        0.65
+#define     MSR1        0.3
+#define     MSR2        0.7
+#define     MSR3        0.75
+#define     MSR4        0.7
+#define     MSR5        0.85
+#define     MSR6        0.9
+#define     MSR7        0.95
+#define     MSR8        0.7
+#define     MSL0        MSR0
+#define     MSL1        MSR1
+#define     MSL2        MSR2//*MBED05
+#define     MSL3        MSR3//*MBED05
+#define     MSL4        MSR4//*MBED05
+#define     MSL5        MSR5//*MBED05
+#define     MSL6        MSR6//*MBED05
+#define     MSL7        MSR7//*MBED05
+#define     MSL8        MSR8//*MBED05
 
 /* 操作モード定義 */
 enum MODE{
@@ -76,6 +77,8 @@
 PwmOut      servo(p25);     // サーボ
 I2C         i2c_lcd(p28,p27);   // LCD(tx, rx)
 
+
+
 /* 変数宣言 */
 int mode;                   // 操作モード
 int run;                    // 走行状態
@@ -86,10 +89,10 @@
 
 float motorSpeedR1[9] = {MSR0, MSR1, MSR2, MSR3        , MSR4        , MSR5        , MSR6        , MSR7        , MSR8        };
 //float motorSpeedR2[9] = {MSR0, MSR1, MSR2, MSR3*REVERSE, MSR4*REVERSE, MSR5*REVERSE, MSR6*REVERSE, MSR7*REVERSE, MSR8*REVERSE};
-float motorSpeedR2[9] = {MSR0, MSR1, MSR2, MSR3*REVERSE, MSR4*REVERSE, MSR5*REVERSE, MSR6, MSR7, MSR8};
+float motorSpeedR2[9] = {MSR0, MSR1, MSR2, MSR3, MSR4, MSR5, MSR6, MSR7, MSR8};
 float motorSpeedL1[9] = {MSL0, MSL1, MSL2, MSL3        , MSL4        , MSL5        , MSL6        , MSL7        , MSL8        };
 //float motorSpeedL2[9] = {MSL0, MSL1, MSL2, MSL3*REVERSE, MSL4*REVERSE, MSL5*REVERSE, MSL6*REVERSE, MSL7*REVERSE, MSL8*REVERSE};
-float motorSpeedL2[9] = {MSL0, MSL1, MSL2, MSL3*REVERSE, MSL4*REVERSE, MSL5*REVERSE, MSL6, MSL7, MSL8};
+float motorSpeedL2[9] = {MSL0, MSL1, MSL2, MSL3, MSL4, MSL5, MSL6, MSL7, MSL8};
                             // モーター速度設定(後半はライントレース用)
                             // 0,1,2:基準速度
                             // 3,4,5:低速
@@ -140,7 +143,7 @@
 int SLD;                // 左前
 int SRD;                // 右前
 int flag_a = 0;         // 障害物有無のフラグ
-const int limit = 20;   // 障害物の距離のリミット(単位:cm)
+const int limit = 25;   // 障害物の距離のリミット(単位:cm)
 int far;                // 最も遠い距離
 int houkou;             // 進行方向(1:前 2:左 3:右)
 int t1 = 0;
@@ -196,7 +199,7 @@
     deco_thread -> set_priority(osPriorityRealtime);
     motor_thread = new Thread(motor);
     motor_thread -> set_priority(osPriorityHigh);
-    wifi_thread -> set_priority(osPriorityRealtime);
+    //wifi_thread -> set_priority(osPriorityRealtime);
     display();
 }
 
@@ -310,16 +313,18 @@
             /* 右折 */
             case RIGHT:
                 motorR1 = LOW;                    // 右前進モーターOFF
-                motorR2 = motorSpeedR2[flag_sp];  // 右後退モーターON
-                motorL1 = motorSpeedL1[flag_sp];  // 左前進モーターON
+                motorR2 = motorSpeedR2[8];  // 右後退モーターON
+                motorL1 = motorSpeedL1[8];  // 左前進モーターON
                 motorL2 = LOW;                    // 左後退モーターOFF
+                
                 break;
             /* 左折 */
             case LEFT:
-                motorR1 = motorSpeedR1[flag_sp];  // 右前進モーターON
+               motorR1 = motorSpeedR1[8];  // 右前進モーターON
                 motorR2 = LOW;                    // 右後退モーターOFF
                 motorL1 = LOW;                    // 左前進モーターOFF
-                motorL2 = motorSpeedL2[flag_sp];  // 左後退モーターON
+                motorL2 = motorSpeedL2[8];  // 左後退モーターON
+                
                 break;
             /* 後退 */
             case BACK:
@@ -328,6 +333,18 @@
                 motorL1 = LOW;                    // 左前進モーターOFF
                 motorL2 = motorSpeedL2[flag_sp];  // 左後退モーターON
                 break;
+            case 11:
+                motorR1 = LOW;                    // 右前進モーターOFF
+                motorR2 = motorSpeedR2[4];  // 右後退モーターON
+                motorL1 = LOW;                    // 左前進モーターOFF
+                motorL2 = motorSpeedL2[1];  // 左後退モーターON
+                break;
+            case 21:
+                motorR1 = LOW;                    // 右前進モーターOFF
+                motorR2 = motorSpeedR2[1];  // 右後退モーターON
+                motorL1 = LOW;                    // 左前進モーターOFF
+                motorL2 = motorSpeedL2[4];  // 左後退モーターON
+                break;
             /* 停止 */
             case STOP:
                 motorR1 = LOW;                  // 右前進モーターOFF
@@ -345,11 +362,9 @@
 
 /* スピード変更関数 */
 void changeSpeed(){
-    if(flag_sp%3 == 2){         // スピード変更フラグを3で割った余りが2なら
-        flag_sp = 0;            // スピード変更フラグを0にする
-    }else{                      // それ以外
-        flag_sp = flag_sp + 1;  // スピード変更フラグを+1
-    }
+                        // それ以外
+        flag_sp = flag_sp + 3;  // スピード変更フラグを+1
+        if(flag_sp>6)flag_sp=0;
 }
 
 /* ライントレーススレッド */
@@ -363,7 +378,6 @@
         int sensor5 = ss5;
         ////*-*-*-5("%d  %d  %d  %d  %d  \r\n",sensor1,sensor2,sensor3,sensor4,sensor5);
         int sensD = 0;
-        
         /* センサー値の決定 */
         if(sensor1 > 0) sensD |= 0x10;
         if(sensor2 > 0) sensD |= 0x08;
@@ -417,133 +431,68 @@
 }
 
 /* 障害物回避走行スレッド */
-void avoidance(){
+void avoidance()
+{
     int i;
-    while(1){  
-        watchsurrounding3();
-//        //*-*-*-5("%d  %d  %d  %d  %d  \r\n",SL,SLD,SC,SRD,SR);
-        if(flag_a == 0){                        // 障害物がない場合
-            run = ADVANCE;                      // 前進
-        }else{                                  // 障害物がある場合
-            i = 0;
-            if(SC < 15){                        // 正面15cm以内に障害物が現れた場合
-                servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
-                ThisThread::sleep_for(100);     // 100ms待つ
-                run = BACK;                     // 後退
-                int cnt_kyori=0;
-                int kyori = watch();
-                while(kyori < limit){           // 正面20cm以内に障害物がある間
-                    if(kyori==-1){
-                        cnt_kyori++;
-                        if(cnt_kyori>15){
-                            cnt_kyori=0;
-                            break;
-                        }
-                    }
-                    kyori = watch();
-                }
-                /*while(i < 30){      // 正面20cm以内に障害物がある間
-                    if(watch() < limit){
-                        break;
-                    }
-                    i++;
-                }
-                i = 0;*/
-                run = STOP;                  // 停止
-            }
-            watchsurrounding5();
-            if(SC < limit && SLD < limit && SL < limit && SRD < limit && SR < limit){   // 全方向に障害物がある場合
-                run = LEFT;                  // 左折
-                while(i < 1){               // 進行方向確認 
-                    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(500);   // 0.5秒待つ
-                        break;
-                    case 2:                            // 左の場合
-                        run = LEFT;                    // 左折
-                        //int kyori = watch();
-                        //int kyori_f=0;
-                        while(i < 20){                 // 進行方向確認
-                            /*if(kyori > (far - 2) || kyori_f == 2){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
-                                break;                   // ループ+
-                            }else if(kyori==-1){
-                                kyori_f++;
-                            }else{
-                                kyori_f = 0;
-                                i++;
-                            }*/
-                            if(watch() > (far - 2)){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
-                                break;                   // ループ+
+    watchsurrounding3();
+    while(1){ 
+    if(flag_a==0){run=ADVANCE;watchsurrounding3();} 
+    else{i=0;
+         if(flag_a==2){
+             servo.pulsewidth_us(1925);      
+                houkou=3;} 
+              
+         if(flag_a==3){servo.pulsewidth_us(925);      
+                houkou=4;}
+             
+         if(flag_a==1){watchsurrounding5();
+                       if(SLD<=SC){houkou=3;}
+                       if(SRD<=SC){houkou=4;}
+                       if(SLD>SC&&SRD>SC){
+                       if(SL>=SR){houkou=1;}
+                       if(SL<SR){houkou=2;}}} 
+                       
+         switch(houkou){                        
+                    case 1:
+                      run = BACK;                 
+                      ThisThread::sleep_for(150);
+                      run = LEFT;                 
+                      ThisThread::sleep_for(350);
+                      break;
+                    case 2:
+                      run = BACK;                 
+                      ThisThread::sleep_for(150);
+                      run = RIGHT;                 
+                      ThisThread::sleep_for(350);
+                      break;
+                    case 3:                            
+                      run=11;
+                        while(i < 20){                 
+                            
+                            if(watch() > 25){   
+                                break;                   
                             }else{
                                 i++;
                             }
                         }
-                        run = STOP;                    // 停止
+                        run = STOP;                    
                         break;
-                    case 3:                            // 右の場合
-                        run = RIGHT;                   // 右折
-                        //int kyori = watch();
-                        //int kyori_f=0;
-                        while(i < 20){                 // 進行方向確認
-                            /*if(kyori > (far - 2) || kyori_f == 2){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
-                                break;                   // ループ+  
-                            }else if(kyori==-1){
-                                kyori_f++;
-                            }else{
-                                kyori_f = 0;
-                                i++;
-                            }*/
-                            if(watch() > (far - 2)){   // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm)
-                                break;                   // ループ+
+                    case 4:                            
+                          run=21;
+                        while(i < 20){                 
+                            
+                            if(watch() > 25){   
+                                break;                   
                             }else{
                                 i++;
                             }
                         }
-                        run = STOP;                    // 停止
+                        run = STOP;                    
                         break;
-                }
-            }
+                        } 
+                       flag_a=0;}          
         }
-        flag_a = 0;                   // 障害物有無フラグを0にセット
-        if(SLD < 29){                     // 正面15cm以内に障害物が現れた場合
-                run = RIGHT;                 // 右折
-                ThisThread::sleep_for(200);  // 100ms待つ
-                run = STOP;                  // 停止
-        }else if(SRD < 29){
-                run = LEFT;                  // 左折
-                ThisThread::sleep_for(200);  // 100ms待つ
-                run = STOP;                  // 停止
-        }      
-    }   
 }
-
 /* 距離計測関数 */
 int watch(){
     do{
@@ -583,7 +532,7 @@
     //servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
     //ThisThread::sleep_for(200);     // 100ms待つ
     SC = watch();
-    if(SC < limit){         // 正面20cm以内に障害物がある場合
+    if(SC < 25){         // 正面20cm以内に障害物がある場合
         if(SC!=-1){
             run = STOP;     // 停止  
             flag_a = 1;    
@@ -593,15 +542,15 @@
     servo.pulsewidth_us(1925);      // サーボを左に40度回転
     ThisThread::sleep_for(100);     // 250ms待つ
     SLD = watch();
-    if(SLD < limit){                // 左前20cm以内に障害物がある場合
+    if(SLD < 20){                // 左前20cm以内に障害物がある場合
         run = STOP;             // 停止
-        flag_a = 1;
+        flag_a = 2;
         return; 
     }
     servo.pulsewidth_us(1450);
     ThisThread::sleep_for(150);
     SC = watch();
-    if(SC < limit){
+    if(SC < 25){
         if(SC!=-1){
             run = STOP;     // 停止
             flag_a = 1;
@@ -611,9 +560,9 @@
     servo.pulsewidth_us(925);       // サーボを右に40度回転
     ThisThread::sleep_for(100);     // 250ms待つ
     SRD = watch();
-    if(SRD < limit){                // 右前20cm以内に障害物がある場合
+    if(SRD < 20){                // 右前20cm以内に障害物がある場合
         run = STOP;             // 停止
-        flag_a = 1;
+        flag_a = 3;
         return; 
     }
     servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
@@ -625,8 +574,8 @@
 
 /* 障害物検知関数 */
 void watchsurrounding5(){
-    //servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
-    //ThisThread::sleep_for(200);     // 100ms待つ
+    servo.pulsewidth_us(1450);      // サーボを中央位置に戻す
+    ThisThread::sleep_for(200);     // 100ms待つ
     SC = watch();
     servo.pulsewidth_us(1925);      // サーボを左に40度回転
     ThisThread::sleep_for(100);     // 250ms待つ
@@ -689,7 +638,7 @@
             /* スピード制御 */
             case SPEED:
                 /* スピードの状態で場合分け */
-                switch(flag_sp % 3){
+                switch(flag_sp){
                     /* 普通 */
                     case(NORMAL):
                         lcd.printf("Speed:Normal    ");
@@ -1005,7 +954,6 @@
         strcat(webbuff, "for(var m=0;m<11;m++){button_9[m].disabled=true;}");  
         strcat(webbuff, "var xhr = new XMLHttpRequest();");
         strcat(webbuff, "xhr.open(\"GET\", url);");
-        strcat
         strcat(webbuff, "xhr.onreadystatechange = function(){");
             strcat(webbuff, "if(this.readyState == 4 || this.status == 200){");
                 strcat(webbuff, "for(var m=0;m<11;m++){button_9[m].disabled=false;}");
@@ -1366,9 +1314,13 @@
 /* mainスレッド */
 int main() {
     /* 初期設定 */
-    wifi_thread = new Thread(wifi);
-    wifi_thread -> set_priority(osPriorityHigh);
-//    setup();
+    //wifi_thread = new Thread(wifi);
+    //wifi_thread -> set_priority(osPriorityHigh);
+   /* motorR2.period_us(40);
+    motorR1.period_us(40);
+    motorL2.period_us(40);
+    motorL1.period_us(40);*/
+    setup();
     avoi_thread = new Thread(avoidance);
     avoi_thread->terminate();
     trace_thread = new Thread(trace);
@@ -1379,7 +1331,7 @@
     flag_sp = NORMAL;       // スピード(普通)
     lcd.setBacklight(TextLCD::LightOn);  // バックライトON
     lcd.setAddress(0,1);
-    lcd.printf("Mode:SetUp");
+    lcd.printf("Mode:ready");
 //    display();              // ディスプレイ表示
     
     while(1){