|
小弟最近剛接觸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);
- }
- }
- }
-
複製代碼
|
|