2020年11月17日星期二

[Arduino] Blink LED

 Blink LED / 閃爍 LED 通常是初學者的第一個應用,其實即使是老手在拿到未曾使用過的 MCU 或是新板子時也會從這裡開始。通常會先了解基本的 I/O 驅動能力 及 I/O 在 Timing 的表現如何。所以, 這個是常用的例子。

I/O 輸出有分兩種方式, Sink current 及 Source current 。區別是 電流流動方向的不同,Sink current 是電源電流經過負載流向 MCU, Source current 是MCU 輸出電流經過負載流向接地。需要注意地方是兩者的邏輯剛好是相反。

Sink Current:

Arduino sink current 教學

Source Current:



Arduino source current 教學

在這裡只要注意官方的參數。 官方的建議是 電流均不要超過 20 mA (UNO 版本),如果預期可能超出的情況則會需要連接 Driver 輸出電路。

在 Arduino 裡,通常我們會使用 File / Examples / 01.Basics / Blink 做為範本,當中會使用 delay() 函式做為延遲的主要方法。delay() 的特性是停止一段時間不做任何事,然後時間到之後就繼續走。如果電路的控制項目不多,使用 delay() 倒是沒甚麼大問題。但如果同時有其他不同應用的 I/O 時就不太適用了,例如,當有 INPUT (按鍵) / OUTPUT (LED) 同時應用時,會遇到跳過按鍵有時沒反應的問題,就是因為 delay() 剛好跳過 INPUT 的程式段。


int ledPin = 13;             

void setup() {
  pinMode(ledPin, OUTPUT); //將 pin 13設定輸出模式
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);       //延遲 1 秒        
  digitalWrite(ledPin, LOW); 
  delay(1000);       //延遲 1 秒 
}


我們可以使用 File / Examples / 02.Digital / BlinkWithoutDelay 的範例,可能在思路上可能會不習慣。但在基礎邏輯上會很有幫助。尤其在中大型的 Project 時,會需要使用類似的方法。

所需材料

  1. Arduino UNO      x  1
  2. 電阻: 330 ohm     x  1
  3. 麵包板                 x   1

參考連接

Arduino LED 教學


程式碼 

採 Source current 連接LED 及 連接 Arduino UNO 的 PIN 12 腳位




/*const 常數 */
/* I/O Pin 選擇使用 12*/
const int ledPin = 12;
/*間隔 1000ms / 1秒*/
const long interval = 1000;
/*LED I/O 狀態,等於是 ledPin 的I/O狀態*/
int ledState = LOW;

/*儲存下次的 clock cycle 時間*/
unsigned long previousMillis = 0;


void setup() {
  // put your setup code here, to run once:
  
  pinMode(ledPin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  //儲存目前的 clock cycle 時間
  unsigned long currentMillis = millis();

  //確認是否已經到預期時間
  if(currentMillis - previousMillis >= interval ){
    /*儲存下次的 clock cycle 時間*/
     previousMillis = currentMillis;
  
     ledState == LOW ? ledState = HIGH : ledState = LOW;

     digitalWrite(ledPin,ledState);
  }
}

0 comments:

發佈留言