Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 2692|回復: 0
打印 上一主題 下一主題

新手發問~~~是硬體的問題還是程式問題呢?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2012-4-29 11:55:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟最近剛接觸arduino﹐許多不清楚的地方來請問各位先進們。
最近剛買了一個小車套件﹐依照說明組裝好之後﹐直接依所附的程式做避障的功能﹐但控制上一直很不穩定﹐不知道是硬體的問題還是程式的問題。
我將sample程式先儘量簡化﹐小車前面裝了三個3~80cm紅外線接近開關﹐先只讓中間的紅外線感測器偵測到有障礙就轉彎﹐但是每次小車跑的情況都有點奇怪。
一開始紅外線的傳感器似乎有作用﹐但中間的傳感器有時第一次遇到障礙會作用﹐但之後紅外線傳感器有時就燈一直亮著再也無法感應的樣子﹐車子就一直往前跑。
有時中間的紅外線感測器燈不會一直亮著﹐對於有障礙物時才會燈才會亮﹐但卻不會轉彎還是一宜往前跑。
也有時候一開始二個紅外線感測器就都亮著紅燈﹐就一直往前跑。
但也有時候可以正常的感測二﹑三次﹐但之後就似乎又無感測了。
感覺程式中loop裏的while迴圈似乎沒什麼作用﹐或者是紅外線感應器一收到訊號後﹐之後就亂了再也無法感測。
我對硬體不懂﹐實在看不出來是硬體還是程式的問題﹐請教各位這通常是什麼情況?


  1. /*      控制板IO     */
  2. //電機控制端口設置
  3. #define EN1 6       //控制右側電機速度
  4. #define IN1 7       //控制右側電機方向
  5. #define EN2 5       //控制左側電機速度
  6. #define IN2 4       //控制左側電機方向
  7. #define FORW 1      //前進
  8. #define BACK 0      //後退
  9. //尋線傳感器端口設置
  10. #define DF_LT_r 12 //右尋線傳感器端口
  11. #define DF_LT_c 11 //中尋線傳感器端口
  12. #define DF_LT_l 10 //左尋線傳感器端口
  13. //避障傳感器端口設置
  14. #define IR_L 2     //左壁障傳感器端口
  15. #define IR_C 3     //中壁障傳感器端口
  16. #define IR_R 8     //右壁障傳感器端口
  17. //模式選擇﹐尋線模式(HIGH)﹐壁障模式(LOW)
  18. #define MOD_SEL 9
  19. //控制電機轉動子函數
  20. void Motor_Control(int M1_DIR, int M1_EN, int M2_DIR, int M2_EN){
  21.     //** M1
  22.     //M1電機方向
  23.     if(M1_DIR == FORW) digitalWrite(IN1, HIGH);   //置高﹐設置方向向前
  24.     else               digitalWrite(IN1, LOW);    //置低﹐設置方向向後
  25.     //M1電機速度
  26.     if(M1_EN ==  0) analogWrite(EN1, LOW);      //置低﹐停止
  27.     else            analogWrite(EN1, M1_EN);    //否則﹐設置相應的數值
  28.     //** M2
  29.     //M2 電機方向
  30.     if(M2_DIR == FORW) digitalWrite(IN2, HIGH);     //置高﹐方向向前
  31.     else               digitalWrite(IN2, LOW);      //置低﹐方向向後
  32.     //M2 電機的速度
  33.     if(M2_EN == 0) analogWrite(EN2, LOW);       //置低﹐停止
  34.     else           analogWrite(EN2, M2_EN);     //否則﹐設置相應的數值
  35. }
  36. void setup(){
  37.     int i;
  38.     //設置控制電機的各端口為輸出模式
  39.     for(i=4 ; i<=7; i++){
  40.         pinMode(i, OUTPUT);
  41.     }
  42.     pinMode(2, INPUT);  //設置左避障傳感器端口為輸入模式
  43.     pinMode(3, INPUT);  //設置中避障傳感器端口為輸入模式
  44.     pinMode(8, INPUT);  //設置右避障傳感器端口為輸入模式
  45.     //設置尋線傳感器端口為輸入模式
  46.     //for(i=9; i<=12; i++){
  47.     //    pinMode(i, INPUT);
  48.     //}
  49. }
  50. void loop(){
  51.     int L_LT, C_LT, R_LT;     //定義第一次讀取傳感器值的變量
  52.     int L_Val, C_Val, R_Val;  //定義第二次讀取傳感器值的變量
  53.       
  54.     while(1) {
  55.         L_LT = digitalRead(IR_L);
  56.         C_LT = digitalRead(IR_C);
  57.         R_LT = digitalRead(IR_R);
  58.         delay(50);
  59.         L_Val = digitalRead(IR_L);
  60.         C_Val = digitalRead(IR_C);
  61.         R_Val = digitalRead(IR_R);
  62.         
  63.         if(L_LT==L_Val && C_LT==C_Val && R_LT==R_Val) {
  64.             if(L_LT==HIGH && C_LT==LOW && R_LT==HIGH){
  65.                 Motor_Control(BACK,150,FORW,150);  //右轉
  66.                 delay(300);
  67.             } else {
  68.                 Motor_Control(FORW,150,FORW,150);  //前進
  69.             }
  70.         } else {
  71.             Motor_Control(BACK,0,BACK,0);  //停止
  72.             //delay(300);
  73.         }
  74.     }
  75. }

複製代碼


您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-2 16:05 , Processed in 0.195965 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表