2015年4月9日 星期四

Lab02 Arduino入門:關於第一支程式 (續)

什麼!還來?

Lab02 到底還有什麼可以再探討呢?



我在 Cooper Maa 的網誌看到這篇關於內部提升電阻的分享:傳送門點我
他解釋得非常清楚了,所以就不再多嘴了。

線路上,原本的線路是這樣:

現在把它改成這樣:


可以看得出來,因為將使用 pin2 的內建提升電阻,所以原本並接在 pin2 的接地電阻可以拿掉了。

但是因為 pin2 內的是 pull-up resistor "提升電阻",表示預設情況下,pin2 會是 HIGH 高電位。

為了配合我們的使用情境,當按鈕沒按下時,應該維持 pin2 是 HIGH 的狀態。
所以,原本按鈕的一端是 5v 正電接進來的,要改為接往 GND(紫線)。
如此一來,當按鈕被按下時,才能迫使 pin2 的狀態由 HIGH 拉成 LOW 低電位。

所以我們除了必須在程式碼中啟用 pin2 的提升電阻之外。還需要修改關於按鈕的判斷條件。

// setup global variables

// variables for LEDs
const int  greenLed1 = 5;
const int  greenLed2 = 4;
const int yellowLed3 = 3;

// variable for the switch
const int switchPin = 2;

void setup()
{
  // initialize the LED pins as output.
  pinMode( greenLed1, OUTPUT);
  pinMode( greenLed2, OUTPUT);
  pinMode(yellowLed3, OUTPUT);

  // declare the switch pin as input
  /* use Pull-up resistor
   * Ref: http://arduino.cc/en/Tutorial/DigitalPins
   */
  pinMode(switchPin, INPUT);     // set pin to input
  digitalWrite(switchPin, HIGH); // turn on pullup resistors
}

void loop()
{
  int switchState;
  
  switchState = digitalRead(switchPin);
  
  if (switchState == HIGH) // if use Pull-up resistor
  {
    // turn the yellow LED off by making the voltage LOW
    digitalWrite(yellowLed3, LOW);
    
    // turn the green LED1 on (HIGH is the voltage level)
    digitalWrite(greenLed1, HIGH);
    digitalWrite(greenLed2, LOW);
    
    // wait for 250ms. = 1/4 second
    delay(250);
    
    digitalWrite(greenLed1, LOW);
    digitalWrite(greenLed2, HIGH);
    
    delay(250);
  }
  else // if press the switch
  {
    digitalWrite( greenLed1, LOW);
    digitalWrite( greenLed2, LOW);
    digitalWrite(yellowLed3, HIGH);
  }
}  


這份程式碼跟之前的框架沒什麼不同,差別在所標示出的 22,23 行用來啟動 "內部提升電阻"。
詳細說明可以參考 Arduino 官方的說明文件:http://arduino.cc/en/Tutorial/DigitalPins

一旦使用了內部提升電阻之後,除了外部的電路需要更改,用來判斷按鈕是否被按下的程式碼,也必須更改判斷依據。
例如:按鈕釋放時,因為提升電阻的關係,pin2 應該會是 HIGH 高電位(32行)。


這是我實際接線的狀況,左邊是 Before,右邊是 After。
(這種跟電氣效應有關的應用,還是自己實實在在接一次線吧 = =)



然後這是最後實際運作的樣子:

 

結束!Lab02 這次真的要結束惹~


沒有留言: