Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: RemoteIR TextLCD
Diff: main.cpp
- Revision:
- 40:75e1ad7c27e4
- Parent:
- 39:054c17d10c55
- Child:
- 41:3c58a4be1199
--- a/main.cpp Wed Aug 19 01:53:11 2020 +0000
+++ b/main.cpp Wed Aug 19 06:07:00 2020 +0000
@@ -58,7 +58,7 @@
int beforeMode; // 前回のモード
int flag_sp = 0; // スピード変化フラグ
Timer viewTimer; // スピ―ド変更時に3秒計測タイマー
-float motorSpeed[9] = {0.6, 0.7, 0.8, 0.7, 0.8, 0.9, 0.8, 0.9, 1.0};
+float motorSpeed[9] = {0.4, 0.7, 0.8, 0.7, 0.8, 0.9, 0.8, 0.9, 1.0};
// モーター速度設定(後半はライントレース用)
Mutex mutex; // ミューテックス
@@ -121,7 +121,8 @@
void changeSpeed();
void avoidance(/*void const *argument*/);
void trace(/*void const *argument*/);
-void watchsurrounding();
+void watchsurrounding3();
+void watchsurrounding5();
int watch();
void bChange();
void display();
@@ -361,7 +362,7 @@
/* 障害物回避走行スレッド */
void avoidance(){
while(1){
- watchsurrounding();
+ watchsurrounding3();
pc.printf("%d %d %d %d %d \r\n",SL,SLD,SC,SRD,SR);
if(flag_a == 0){ // 障害物がない場合
run = ADVANCE; // 前進
@@ -369,14 +370,31 @@
i = 0;
if(SC < 15){ // 正面15cm以内に障害物が現れた場合
run = BACK; // 後退
- while(watch() < limit){ // 正面20cm以内に障害物がある間
+ 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();
}
- run = STOP; // 停止
+ /*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){ // 進行方向確認
- flag_sp = flag_sp % 3 + 6;
if(watch() > limit){
i++;
}else{
@@ -406,30 +424,46 @@
switch(houkou){ // 進行方向の場合分け
case 1: // 前の場合
run = ADVANCE; // 前進
- ThisThread::sleep_for(1000); // 1秒待つ
+ ThisThread::sleep_for(500); // 0.5秒待つ
break;
- case 2: // 左の場合
-
+ case 2: // 左の場合
run = LEFT; // 左折
- while(i < 1){ // 進行方向確認
- flag_sp = flag_sp % 3 + 6;
+ //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)
- i++; // ループ+
+ break; // ループ+
}else{
- i = 0;
+ i++;
}
}
run = STOP; // 停止
break;
- case 3: // 右の場合
-
+ case 3: // 右の場合
run = RIGHT; // 右折
- while(i < 1){ // 進行方向確認
- flag_sp = flag_sp % 3 + 6;
+ 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)
- i++; // ループ+
+ break; // ループ+
}else{
- i = 0;
+ i++;
}
}
run = STOP; // 停止
@@ -438,6 +472,15 @@
}
}
flag_a = 0; // 障害物有無フラグを0にセット
+ if(SLD < 29){ // 正面15cm以内に障害物が現れた場合
+ run = RIGHT; // 右折
+ ThisThread::sleep_for(100); // 100ms待つ
+ run = STOP; // 停止
+ }else if(SRD < 29){
+ run = LEFT; // 左折
+ ThisThread::sleep_for(100); // 100ms待つ
+ run = STOP; // 停止
+ }
}
}
@@ -476,14 +519,15 @@
}
/* 障害物検知関数 */
-void watchsurrounding(){
+void watchsurrounding3(){
//servo.pulsewidth_us(1450); // サーボを中央位置に戻す
//ThisThread::sleep_for(200); // 100ms待つ
SC = watch();
if(SC < limit){ // 正面20cm以内に障害物がある場合
if(SC!=-1){
run = STOP; // 停止
- flag_a = 1;
+ flag_a = 1;
+ return;
}
}
servo.pulsewidth_us(1925); // サーボを左に40度回転
@@ -492,21 +536,16 @@
if(SLD < limit){ // 左前20cm以内に障害物がある場合
run = STOP; // 停止
flag_a = 1;
- }
- servo.pulsewidth_us(2400); // サーボを左に90度回転
- ThisThread::sleep_for(100); // 250ms待つ
- SL = watch();
- if(SL < limit){ // 左20cm以内に障害物がある場合
- run = STOP; // 停止
- flag_a = 1;
+ return;
}
servo.pulsewidth_us(1450);
- ThisThread::sleep_for(250);
+ ThisThread::sleep_for(100);
SC = watch();
if(SC < limit){
if(SC!=-1){
run = STOP; // 停止
- flag_a = 1;
+ flag_a = 1;
+ return;
}
}
servo.pulsewidth_us(925); // サーボを右に40度回転
@@ -515,19 +554,37 @@
if(SRD < limit){ // 右前20cm以内に障害物がある場合
run = STOP; // 停止
flag_a = 1;
+ return;
}
+ servo.pulsewidth_us(1450); // サーボを中央位置に戻す
+ ThisThread::sleep_for(100); // 100ms待つ
+ /*if(SC < limit || SLD < limit || SL < limit || SRD < limit || SR < limit){ // 20cm以内に障害物を検知した場合
+ flag_a = 1; // 障害物有無フラグに1をセット
+ }*/
+}
+
+/* 障害物検知関数 */
+void watchsurrounding5(){
+ //servo.pulsewidth_us(1450); // サーボを中央位置に戻す
+ //ThisThread::sleep_for(200); // 100ms待つ
+ SC = watch();
+ servo.pulsewidth_us(1925); // サーボを左に40度回転
+ ThisThread::sleep_for(100); // 250ms待つ
+ SLD = watch();
+ servo.pulsewidth_us(2400); // サーボを左に90度回転
+ ThisThread::sleep_for(100); // 250ms待つ
+ SL = watch();
+ servo.pulsewidth_us(1450);
+ ThisThread::sleep_for(250);
+ SC = watch();
+ servo.pulsewidth_us(925); // サーボを右に40度回転
+ ThisThread::sleep_for(100); // 250ms待つ
+ SRD = watch();
servo.pulsewidth_us(500); // サーボを右に90度回転
ThisThread::sleep_for(100); // 250ms待つ
SR = watch();
- if(SR < limit){ // 右20cm以内に障害物がある場合
- run = STOP; // 停止
- flag_a = 1;
- }
servo.pulsewidth_us(1450); // サーボを中央位置に戻す
ThisThread::sleep_for(250); // 100ms待つ
- /*if(SC < limit || SLD < limit || SL < limit || SRD < limit || SR < limit){ // 20cm以内に障害物を検知した場合
- flag_a = 1; // 障害物有無フラグに1をセット
- }*/
}
/* ディスプレイ表示関数 */