2014年4月4日 星期五

Arduino內部的上拉電阻

有不少像我一樣的Arduino初學者,都以為只要把程式打進去並且依下圖去拉線,在按下按鈕之後引腳12就可以得到一個HIGH,
 
void setup() {
  pinMode(13, OUTPUT);
  pinMode(12, INPUT);
}
 
void loop() {
  bool buttonState = digitalRead(12);
  digitalWrite(13, buttonState);
}


然而,事實並非如此。
按鈕是一個機械動作,在你按下按鈕那零點幾秒內,Arduino實際上是收到很多HIGH和LOW的信號,這種在HIGH和LOW之間跳動的現像我們稱之為彈跳。
即使你沒按下按鈕,引腳12也是會持續收到彈跳信號。

為了要抑制彈跳,大多數教學文章都會建議要裝一個上拉電阻(註A),如下圖:

 
void setup() {
  pinMode(13, OUTPUT);
  pinMode(12, INPUT);  
  digitalWrite(12, HIGH);
}
 
void loop() {
  bool buttonState = digitalRead(12);
  digitalWrite(13, buttonState);
}

如此,在沒按下按鈕時會一直收到HIGH,但在你按下按鈕後,就可以得到一個穩定的LOW。


事實上,Arduino的數位引腳都已經連接有一個內部的上拉電阻,詳官網
我們只要在pinMode()函式內將它啟用即可。



void setup(){ 
  Serial.begin(9600); 
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop(){ 
  int sensorVal = digitalRead(2); 
  Serial.println(sensorVal); 
 
  if (sensorVal == HIGH) {
    digitalWrite(13, LOW);
  }
  else {
    digitalWrite(13, HIGH);
  }
}


註A: 若安裝下拉電阻也可以,只不過電路接法也要改變一下。

2 則留言: