2014年8月12日

Arduino 第二課 - 跑馬燈

繼自學第一課: LED switch 用開關控制 LED (或者其他元件)後, 接著進入較複雜的(程式)控制: 跑馬燈。

材料
LED x3 (以上)
Resistor 330Ω x3 (搭配LED數量)

製作
< 參考「Arduino互動設 計入門2」- p4-19 ~ p4-21 >
紅色線: 高電位/電源輸出
黑色線: 低電位/電源回流

分兩種接法: 左圖為源流(source current) 與 右圖潛流(sink current)


電路圖如下:

程式如下:
const byte LEDs[] = {4 ,7, 10};
const byte LEDs_SIZE = sizeof(LEDs);

const byte INIT_VALUE = LOW; // LOW/HIGH when using source-/sink-current circuit
byte count = 0;

void setup() {
  for (byte i=0; i< LEDs_SIZE; i++) {
    pinMode(LEDs[i], OUTPUT);
  }
}

void loop() {
  for (byte i=0; i< LEDs_SIZE; i++) {
    digitalWrite(LEDs[i], INIT_VALUE);
  }
  
  count = count % 3;
  digitalWrite(LEDs[count], ! INIT_VALUE);
  count++;
  
  delay(200);
}

上述, 使用了廻圈(loop)與陣列(array)的寫法; 源流接法時, 將
const byte INIT_VALUE = LOW;

潛流接法時, 將
const byte INIT_VALUE = HIGH;

另外, 可使用 DDRx (Data Direction Register)來控制 pin 的輸出入, 並使用 shift 的程式技巧來達成:

<以DDRD/PortD為例>

// for sink-current circuit
const byte INIT_VALUE = 0b00001000;
const byte LED_SHIFT = 2;
byte count = 0;

void setup() {
  DDRD = 0b10101000; // OFF for pull-down circuit
}

void loop() {
  count = count % 3;

  if (count == 0) {
    PORTD = INIT_VALUE;
  } else {
    PORTD <<= LED_SHIFT;
  }

  count++;
  delay(200);
}

上述為潛流接法的寫作, 源流的寫法得花點時間想想。

ps.
上述二例寫法與「Arduino互動設 計入門2」- p4-28, p4-31有點不同

沒有留言: