2012/02/16

Arduino練習:RGB LED

之前嘗試了以開關切換LED明滅狀態,並以PWM讓LED呼吸 (漸亮、漸暗、不斷循環),現在要試試能夠顯示R紅色、G綠色、B藍色的RGB LED。

我用的板子是Arduino Uno,軟體開發環境為1.0.3 Windows版。

RGB LED有四支腳,我買的是共陰極,其中最長的腳要接地,其他三支腳分別控制R、G、B色彩。


電路圖如下,
RGB LED的共陰極(最長腳)接地。
RGB LED的R接到220 ohm電阻後,再接到Arduino腳位11。
RGB LED的G接到220 ohm電阻後,再接到Arduino腳位10。
RGB LED的B接到220 ohm電阻後,再接到Arduino腳位9。


為什麼我使用220 ohm的電阻呢,請參考我寫的Arduino小知識:LED串聯電阻為什麼是220 ohm?。實際情形必須看LED的規格而定,網路上找到的文章,有些人使用270 ohm,也有330 ohm的。

程式碼如下:
// 根據接線圖定義控制R、G、B的腳位
#define LEDR 11
#define LEDG 10
#define LEDB 9

// 關閉LED
void turnoff(){
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, LOW);
}

void setup() {               
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  turnoff();
}

// 每隔一秒改變LED的顏色,紅、綠、藍、黃、青、洋紅
void loop() {
  turnoff();
  digitalWrite(LEDR, HIGH);
  delay(1000);
 
  turnoff();
  digitalWrite(LEDG, HIGH);
  delay(1000);
 
  turnoff();
  digitalWrite(LEDB, HIGH);
  delay(1000);
 
  turnoff();
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  delay(1000);
 
  turnoff();
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  delay(1000);
 
  turnoff();
  digitalWrite(LEDB, HIGH);
  digitalWrite(LEDR, HIGH);
  delay(1000);
}

因為Uno板的腳位11、10、9能輸出PWM,所以可調整三原色的個別強度,形成更多的色彩,譬如底下的程式碼:

#define LEDR 11
#define LEDG 10
#define LEDB 9

void setup() {               
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

int r = 0;
int g = 0;
int b = 0;
void loop() {
  r = random(0, 255);
  g = random(0, 255);
  b = random(0, 255);
  analogWrite(LEDR, r);
  analogWrite(LEDG, g);
  analogWrite(LEDB, b);
  delay(1000);
}

使用random()取得0到255之間的亂數值,然後以analogWrite輸出。因為我沒有使用randomSeed(),所以每次重開機後,都會得到同樣的亂數數列。


參考資料:

23 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. 最長腳接電源正極,其餘三支腳接Arduino的腳位(中間應串連限流電阻)。
      這三個腳位分別控制紅綠藍,譬如紅腳位若為高電位,那麼電流就無法流過,不發出紅光,若為低地位,電流可流過,便可發出紅光。其餘腳位類推。

      若使用analogWrite,便可控制亮度。

      可參考http://www.geek-workshop.com/thread-1586-1-1.html

      Delete
    2. 不小心把問題給刪掉了,抱歉。

      Delete
  3. 一個電阻接共陰腳位即可,不需三個。

    ReplyDelete
    Replies
    1. 也要功率足夠。

      Delete
    2. 一個電阻接在共陰腳位是不行的,舉例來說,LED導通電壓為1V,電阻接100歐姆來算,當只有紅色LED輸出5V時,i=(5-1)/100=40mA,如果藍色LED也輸出5V,此時電阻的壓降還是(5-1)v,流經電阻的電流依然是i=(5-1)/100=40mA,然而此時40mA要分給紅色及藍色LED,只能各分20mA,則亮度減半。以上數字只是估算,要說的是,當愈多顆LED要亮,整個亮度會變的比較暗

      Delete
    3. This comment has been removed by the author.

      Delete
    4. Arduino DC Current per I/O Pin) 每個數位腳位可以提供約40mA的直流電, 這足以點亮大部分的LED
      最多可提供總共約 200mA的電流

      Delete
    5. LED 是接在不同 I/O Pin 亮度不會變的比較暗
      接地限流電阻是防止流經 LED 電流過大而燒毀

      Delete
  4. 請問如果想要用溫度來改變RGB變色需要怎麼改 我使用的感溫元件是LM35

    ReplyDelete
    Replies
    1. http://alex9ufoexploer.blogspot.tw/2013/04/arduino-lm35.html

      Delete
  5. LM35輸出電壓與溫度成線性關係,直接以類比腳位量測即可。
    可參考http://a-chien.blogspot.tw/2012/10/arduino.html

    若想提高精確度,需修改參考電壓,
    請見http://playground.arduino.cc/Main/LM35HigherResolution

    量測溫度後,制定哪個範圍的溫度、應讓RGB LED呈現什麼顏色,再來撰寫這部份的程式碼。

    ReplyDelete
  6. 我想請問如果我想讓他六段變色 可是又想讓他以PWM呼吸呢?

    ReplyDelete
    Replies
    1. 使用三個PWM腳位來控制。

      Delete
  7. 我想請問如果我想讓他六段變色 可是又想讓他以PWM呼吸呢?

    ReplyDelete
    Replies
    1. 使用三個PWM腳位,分別控制R、G、B,便能控制三色的強弱。

      Delete
  8. 您好,請問可以用藍芽控制RGB的燈光顏色嗎?

    ReplyDelete