
Wi-Fi追加
Dependencies: RemoteIR TextLCD
Revision 18:6cca64c7dbc3, committed 2020-08-05
- Comitter:
- tomotsugu
- Date:
- Wed Aug 05 01:09:50 2020 +0000
- Parent:
- 17:f7259ab2fe86
- Child:
- 19:c6f9f010bd9e
- Commit message:
- mbed_robotcar
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Aug 04 08:43:58 2020 +0000 +++ b/main.cpp Wed Aug 05 01:09:50 2020 +0000 @@ -123,7 +123,6 @@ void decodeIR(void const *argument){ while(1){ // 受信待ち - //pc.printf("decodeIR\r\n"); if (ir.getState() == ReceiverIR::Received){ // コード受信 bitcount = ir.getData(&format, buf, sizeof(buf) * 8); if(bitcount > 1){ // 受信成功 @@ -134,7 +133,6 @@ if(mode != SPEED){ // スピードモード以外なら beforeMode=mode; // 前回のモードに現在のモードを設定 } - //pc.printf("%0x\r\n",code); switch(code){ case 0x40bf27d8: // クイック //pc.printf("mode = SPEED\r\n"); @@ -160,6 +158,7 @@ avoi_thread = new Thread(avoidance); avoi_thread -> set_priority(osPriorityHigh); } + flag_a = 0; mode=AVOIDANCE; // 障害物回避モード run = ADVANCE; // 前進 display(); // ディスプレイ表示 @@ -210,14 +209,13 @@ viewTimer.reset(); // タイマーリセット display(); // ディスプレイ表示 } - ThisThread::sleep_for(60); // 90ms待つ + ThisThread::sleep_for(90); // 90ms待つ } } /* モーター制御スレッド */ void motor(void const *argument){ while(1){ - //pc.printf("motor\r\n"); /* 走行状態の場合分け */ switch(run){ /* 前進 */ @@ -302,92 +300,57 @@ /* センサー値によって場合分け */ switch(sensorNum){ case 1: - //if(mode == LINE_TRACE){ // 現在ライントレースモードなら - run = ADVANCE; // 低速で前進 - //} - //pc.printf("ADVANCE"); + run = ADVANCE; // 低速で前進 break; case 2: - //if(mode == LINE_TRACE){ // 現在ライントレースモードなら - run = RIGHT; // 低速で右折 - //} - //pc.printf("RIGHT"); + run = RIGHT; // 低速で右折 break; case 3: - //if(mode == LINE_TRACE){ // 現在ライントレースモードなら - run = LEFT; // 低速で左折 - //} - //pc.printf("LEFT"); + run = LEFT; // 低速で左折 break; case 4: - //if(mode==LINE_TRACE){ // 現在ライントレースモードなら - flag_sp = flag_sp % 3 + 3; - run = RIGHT; // 中速で右折 - //} - //pc.printf("RIGHT"); + flag_sp = flag_sp % 3 + 3; + run = RIGHT; // 中速で右折 break; case 5: - //if(mode == LINE_TRACE){ // 現在ライントレースモードなら - flag_sp = flag_sp % 3 + 3; - run = LEFT; // 中速で左折 - //} - //pc.printf("LEFT"); + flag_sp = flag_sp % 3 + 3; + run = LEFT; // 中速で左折 break; case 6: - //if(mode == LINE_TRACE){ // 現在ライントレースモードなら - flag_sp = flag_sp % 3 + 6; - run = RIGHT; // 高速で右折 - //} - //pc.printf("RIGHT"); + flag_sp = flag_sp % 3 + 6; + run = RIGHT; // 高速で右折 break; case 7: - //if(mode == LINE_TRACE){ // 現在ライントレースモードなら - flag_sp = flag_sp % 3 + 6; - run = LEFT; // 高速で左折 - //} - //pc.printf("LEFT"); + flag_sp = flag_sp % 3 + 6; + run = LEFT; // 高速で左折 break; } ThisThread::sleep_for(30); // 30ms待つ - /*}else{ - ThisThread::sleep_for(1); // 1ms待つ - }*/ - } + } } /* 障害物回避走行スレッド */ void avoidance(/*void const *argument*/){ while(1){ - //if(mode == AVOIDANCE){ // 現在障害物回避モードなら - //pc.printf("avoidance\r\n"); - watchsurrounding(); - pc.printf("%d %d %d %d %d \r\n",SL,SLD,SC,SRD,SR); - - if(flag_a == 0){ // 障害物がない場合 - //if(mode == AVOIDANCE) // 現在障害物回避モードなら - run = ADVANCE; // 前進 + watchsurrounding(); + pc.printf("%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以内に障害物が現れた場合 + run = BACK; // 後退 + while(watch() < limit){ // 正面20cm以内に障害物がある間 + } + run = STOP; // 停止 } - else{ // 障害物がある場合 - i = 0; - if(SC < 15){ // 正面15cm以内に障害物が現れた場合 - run = BACK; // 後退 - while(watch() < limit){ // 正面20cm以内に障害物がある間 - /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら - break; - }*/ + if(SC < limit && SLD < limit && SL < limit && SRD < limit && SR < limit){ // 全方向に障害物がある場合 + run = LEFT; // 左折 + while(i < 3){ // 進行方向確認 + if(watch() > limit){ + i++; } - run = STOP; // 停止 - } - if(SC < limit && SLD < limit && SL < limit && SRD < limit && SR < limit){ // 全方向に障害物がある場合 - run = LEFT; // 左折 - while(i < 3){ // 進行方向確認 - /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら - break; - } */ - if(watch() > limit){ - i++; - - } else{ i = 0; } @@ -418,16 +381,11 @@ switch(houkou){ // 進行方向の場合分け case 1: // 前の場合 run = ADVANCE; // 前進 - //pc.printf("Advance\r\n"); ThisThread::sleep_for(1000); // 1秒待つ break; case 2: // 左の場合 run = LEFT; // 左折 while(i < 3){ // 進行方向確認 - //pc.printf("left\r\n"); - /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら - break; - }*/ if(watch() > (far - 2)){ // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm) i++; // ループ+ } @@ -440,10 +398,6 @@ case 3: // 右の場合 run = RIGHT; // 右折 while(i < 3){ // 進行方向確認 - //pc.printf("right\r\n"); - /*if(mode != AVOIDANCE){ // 現在障害物回避モードでないなら - break; - }*/ if(watch() > (far - 2)){ // 正面の計測距離と最も遠い距離が一致したら(誤差-2cm) i++; // ループ+ } @@ -456,22 +410,16 @@ } } } - //pc.printf("こんにちは!\r\n"); flag_a = 0; // 障害物有無フラグを0にセット - //pc.printf(" avoidance\r\n"); - /*}else{ - ThisThread::sleep_for(1); // 1ms待つ - }*/ } } /* 距離計測関数 */ int watch(){ - //pc.printf("watch\r\n"); trig = 0; ThisThread::sleep_for(5); // 5ms待つ trig = 1; - ThisThread::sleep_for(15); // 15ms待つ + ThisThread::sleep_for(5); // 15ms待つ trig = 0; timer.start(); t1=timer.read_ms(); @@ -501,7 +449,7 @@ if((t1-t2)>=10){ DT=100; } - pc.printf("私はDTである。%d\r\n",DT); + //pc.printf("私はDTである。%d\r\n",DT); led1 = 0; return DT; } @@ -517,7 +465,7 @@ return; } servo.pulsewidth_us(1925); // サーボを左に40度回転 - ThisThread::sleep_for(25); // 250ms待つ + ThisThread::sleep_for(140); // 250ms待つ SLD = watch(); if(SLD < limit){ // 左前20cm以内に障害物がある場合 //if(mode == AVOIDANCE) // 現在障害物回避モードなら @@ -526,7 +474,7 @@ //return; } servo.pulsewidth_us(2400); // サーボを左に90度回転 - ThisThread::sleep_for(25); // 250ms待つ + ThisThread::sleep_for(100); // 250ms待つ SL = watch(); if(SL < limit){ // 左20cm以内に障害物がある場合 //if(mode == AVOIDANCE) // 現在障害物回避モードなら @@ -534,10 +482,8 @@ //else //return; } - servo.pulsewidth_us(1450); // サーボを中央位置に戻す - ThisThread::sleep_for(10); // 100ms待つ servo.pulsewidth_us(925); // サーボを右に40度回転 - ThisThread::sleep_for(25); // 250ms待つ + ThisThread::sleep_for(140); // 250ms待つ SRD = watch(); if(SRD < limit){ // 右前20cm以内に障害物がある場合 //if(mode == AVOIDANCE) // 現在障害物回避モードなら @@ -546,7 +492,7 @@ //return; } servo.pulsewidth_us(500); // サーボを右に90度回転 - ThisThread::sleep_for(25); // 250ms待つ + ThisThread::sleep_for(100); // 250ms待つ SR = watch(); if(SR < limit){ // 右20cm以内に障害物がある場合 //if(mode == AVOIDANCE) // 現在障害物回避モードなら @@ -555,7 +501,7 @@ //return; } servo.pulsewidth_us(1450); // サーボを中央位置に戻す - ThisThread::sleep_for(10); // 100ms待つ + ThisThread::sleep_for(100); // 100ms待つ if(SC < limit || SLD < limit || SL < limit || SRD < limit || SR < limit){ // 20cm以内に障害物を検知した場合 flag_a = 1; // 障害物有無フラグに1をセット } @@ -648,7 +594,6 @@ mutex.lock(); // ミューテックスロック lcd.setAddress(0,0); lcd.printf("Battery:%3d%%",b); // バッテリー残量表示 - //pc.printf(" bChange2\r\n"); mutex.unlock(); // ミューテックスアンロック if(b <= 30){ // バッテリー残量30%以下なら if(flag_t == 0){ // バックライトタイマーフラグが0なら @@ -679,9 +624,6 @@ display(); // ディスプレイ表示 while(1){ - //pc.printf(" main1\r\n"); bChange(); // バッテリー残量更新 - //pc.printf(" main2\r\n"); - ThisThread::sleep_for(1); // 1ms待つ } } \ No newline at end of file