| 
 | 
 
小弟最近剛接觸arduino﹐許多不清楚的地方來請問各位先進們。 
最近剛買了一個小車套件﹐依照說明組裝好之後﹐直接依所附的程式做避障的功能﹐但控制上一直很不穩定﹐不知道是硬體的問題還是程式的問題。 
我將sample程式先儘量簡化﹐小車前面裝了三個3~80cm紅外線接近開關﹐先只讓中間的紅外線感測器偵測到有障礙就轉彎﹐但是每次小車跑的情況都有點奇怪。 
一開始紅外線的傳感器似乎有作用﹐但中間的傳感器有時第一次遇到障礙會作用﹐但之後紅外線傳感器有時就燈一直亮著再也無法感應的樣子﹐車子就一直往前跑。 
有時中間的紅外線感測器燈不會一直亮著﹐對於有障礙物時才會燈才會亮﹐但卻不會轉彎還是一宜往前跑。 
也有時候一開始二個紅外線感測器就都亮著紅燈﹐就一直往前跑。 
但也有時候可以正常的感測二﹑三次﹐但之後就似乎又無感測了。 
感覺程式中loop裏的while迴圈似乎沒什麼作用﹐或者是紅外線感應器一收到訊號後﹐之後就亂了再也無法感測。 
我對硬體不懂﹐實在看不出來是硬體還是程式的問題﹐請教各位這通常是什麼情況? 
 
-  
 
 - /*      控制板IO     */
 
 - //電機控制端口設置
 
 - #define EN1 6       //控制右側電機速度
 
 - #define IN1 7       //控制右側電機方向
 
 - #define EN2 5       //控制左側電機速度
 
 - #define IN2 4       //控制左側電機方向
 
 - #define FORW 1      //前進
 
 - #define BACK 0      //後退
 
 - //尋線傳感器端口設置
 
 - #define DF_LT_r 12 //右尋線傳感器端口
 
 - #define DF_LT_c 11 //中尋線傳感器端口
 
 - #define DF_LT_l 10 //左尋線傳感器端口
 
 - //避障傳感器端口設置
 
 - #define IR_L 2     //左壁障傳感器端口
 
 - #define IR_C 3     //中壁障傳感器端口
 
 - #define IR_R 8     //右壁障傳感器端口
 
 - //模式選擇﹐尋線模式(HIGH)﹐壁障模式(LOW)
 
 - #define MOD_SEL 9
 
 - //控制電機轉動子函數
 
 - void Motor_Control(int M1_DIR, int M1_EN, int M2_DIR, int M2_EN){
 
 -     //** M1
 
 -     //M1電機方向
 
 -     if(M1_DIR == FORW) digitalWrite(IN1, HIGH);   //置高﹐設置方向向前
 
 -     else               digitalWrite(IN1, LOW);    //置低﹐設置方向向後
 
 -     //M1電機速度
 
 -     if(M1_EN ==  0) analogWrite(EN1, LOW);      //置低﹐停止
 
 -     else            analogWrite(EN1, M1_EN);    //否則﹐設置相應的數值
 
 -     //** M2
 
 -     //M2 電機方向
 
 -     if(M2_DIR == FORW) digitalWrite(IN2, HIGH);     //置高﹐方向向前
 
 -     else               digitalWrite(IN2, LOW);      //置低﹐方向向後
 
 -     //M2 電機的速度
 
 -     if(M2_EN == 0) analogWrite(EN2, LOW);       //置低﹐停止
 
 -     else           analogWrite(EN2, M2_EN);     //否則﹐設置相應的數值
 
 - }
 
 - void setup(){
 
 -     int i;
 
 -     //設置控制電機的各端口為輸出模式
 
 -     for(i=4 ; i<=7; i++){
 
 -         pinMode(i, OUTPUT);
 
 -     }
 
 -     pinMode(2, INPUT);  //設置左避障傳感器端口為輸入模式
 
 -     pinMode(3, INPUT);  //設置中避障傳感器端口為輸入模式
 
 -     pinMode(8, INPUT);  //設置右避障傳感器端口為輸入模式
 
 -     //設置尋線傳感器端口為輸入模式
 
 -     //for(i=9; i<=12; i++){
 
 -     //    pinMode(i, INPUT);
 
 -     //}
 
 - }
 
 - void loop(){
 
 -     int L_LT, C_LT, R_LT;     //定義第一次讀取傳感器值的變量
 
 -     int L_Val, C_Val, R_Val;  //定義第二次讀取傳感器值的變量
 
 -        
 
 -     while(1) {
 
 -         L_LT = digitalRead(IR_L);
 
 -         C_LT = digitalRead(IR_C);
 
 -         R_LT = digitalRead(IR_R);
 
 -         delay(50);
 
 -         L_Val = digitalRead(IR_L);
 
 -         C_Val = digitalRead(IR_C);
 
 -         R_Val = digitalRead(IR_R);
 
 -         
 
 -         if(L_LT==L_Val && C_LT==C_Val && R_LT==R_Val) {
 
 -             if(L_LT==HIGH && C_LT==LOW && R_LT==HIGH){
 
 -                 Motor_Control(BACK,150,FORW,150);  //右轉
 
 -                 delay(300);
 
 -             } else {
 
 -                 Motor_Control(FORW,150,FORW,150);  //前進
 
 -             }
 
 -         } else {
 
 -             Motor_Control(BACK,0,BACK,0);  //停止
 
 -             //delay(300);
 
 -         }
 
 -     }
 
 - }
 
 -  
 
 
  複製代碼 
 
 
 |   
 
 
 
 |