Robofun 機器人論壇
標題:
新手發問~~~是硬體的問題還是程式問題呢?
[打印本頁]
作者:
nethawk
時間:
2012-4-29 11:55
標題:
新手發問~~~是硬體的問題還是程式問題呢?
小弟最近剛接觸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);
}
}
}
複製代碼
IMG_7864.JPG
(484.92 KB, 下載次數: 264)
下載附件
2012-4-29 11:49 上傳
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2