Robofun 機器人論壇

標題: 遙控車中斷程式的疑問 [打印本頁]

作者: thuthu94    時間: 2015-5-1 14:37
標題: 遙控車中斷程式的疑問
用MEGA2560板

程式如下
//單純定義pin輸出,以及輸出的速度
int LmotorPin_A = 2;
int LmotorPin_AP = 3;
int LmotorPin_B = 4;
int LmotorPin_BP = 5;
int RmotorPin_A = 10;
int RmotorPin_AP = 11;
int RmotorPin_B = 12;
int RmotorPin_BP = 13;
int delayTime = 20;
int D0=22;                     // RF接收腳位 D0        
int D1=23;                     // RF接收腳位 D1
int D3=21;                     // RF接收腳位 D3,中段接腳        
int D4=20;                     // RF接收腳位 D4,中段接腳
byte i=0;


void forward() {
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);
  delay(delayTime);
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);
  delay(delayTime);
}  

void backward() {
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);
  delay(delayTime);
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);  
  delay(delayTime);
}  
void turnLeft() {            // 馬達轉向:左轉
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);
  delay(delayTime);
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);
  delay(delayTime);  
}


void turnRight() {           // 馬達轉向:右轉
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);
  delay(delayTime);
  digitalWrite(LmotorPin_A, HIGH);
  digitalWrite(LmotorPin_AP,LOW);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, HIGH);
  digitalWrite(RmotorPin_AP,LOW);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, LOW);
  digitalWrite(LmotorPin_BP,HIGH);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, LOW);
  digitalWrite(RmotorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(LmotorPin_A, LOW);
  digitalWrite(LmotorPin_AP,HIGH);
  digitalWrite(LmotorPin_B, HIGH);
  digitalWrite(LmotorPin_BP,LOW);

  digitalWrite(RmotorPin_A, LOW);
  digitalWrite(RmotorPin_AP,HIGH);
  digitalWrite(RmotorPin_B, HIGH);
  digitalWrite(RmotorPin_BP,LOW);
  delay(delayTime);
}

void setup() {
  pinMode(LmotorPin_A, OUTPUT);
  pinMode(LmotorPin_AP, OUTPUT);
  pinMode(LmotorPin_B, OUTPUT);
  pinMode(LmotorPin_BP, OUTPUT);
  pinMode(RmotorPin_A, OUTPUT);
  pinMode(RmotorPin_AP, OUTPUT);
  pinMode(RmotorPin_B, OUTPUT);
  pinMode(RmotorPin_BP, OUTPUT);
  pinMode(D0,INPUT);
  pinMode(D1,INPUT);
  pinMode(D3,INPUT);
  pinMode(D4,INPUT);
}

void loop() {
  boolean val1=digitalRead(D0);
  boolean val2=digitalRead(D1);

  attachInterrupt(2,turnRight, LOW);
  attachInterrupt(3,turnLeft, LOW);

  if (val1==0) {
    for (i=0;i<100;i++)
    {   
      forward();
    }
  }

  if (val2==0) {
    for (i=0;i<100;i++)
    {   
      backward();
    }
  }

}


請問為什麼按下中斷按鈕20.21接腳
馬達會停止轉動 然後震動..........
不會執行指令內容
作者: thuthu94    時間: 2015-5-1 18:46
另外有在turnRight跟turnLeft程式前讓馬達停子一下下

中斷功能:左/右轉 轉多少依據中斷按鈕按著的時間
此外電路動作整體是
一開始馬達可以前進/後退(一段距離)
但在前進/後退時按下中斷按鈕(按著不放)會停止不轉且震動
等到中斷按鈕放開 會繼續執行前進/後退的動作

另外在程式一開始按下中斷按鈕(按著不放)也是不轉且震動
但是放開後還是可以執行前進/後退動作

我想要的是按著中斷按鈕(按著不放)後可以左右轉(不管是前進後退還是停止不動時都可以觸發)

另外中斷程式有用LOW/CHANGE/RISING/RALLING當中斷觸發時機
感覺只有LOW是適合我原本想要的功能



其他三個都是只有按下去(極短的時間)有動靜(太短的不知道是動甚麼動作) 然後又繼續執行主程式...




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2