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(),所以每次重開機後,都會得到同樣的亂數數列。


參考資料:

29 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
  9. 葉難大大您好,最近剛好使用到這顆模組
    想請問您關於 混出白色光 這件事
    試了三顆同樣的模組,發現紅色光的部分都是比較弱的,綠光則強度非常高
    除了手動慢慢減少pwm值外,有甚麼方式能去處理嗎?

    ReplyDelete
  10. 嗯,
    想不到耶。

    ReplyDelete
  11. 請問我如果用Arduino micro 配合LTC106-F8
    接腳跟程式碼控制方式會和你的一樣嗎?

    ReplyDelete
  12. 不好意思,葉老師,想請問您有沒有用過兩隻腳的 七彩LED呢?
    不知道這種LED要怎麼用程式控制它的顏色。

    謝謝葉老師

    ReplyDelete
    Replies
    1. 這種LED裡頭通常有顆控制晶片,
      必須根據該晶片的規格,傳送訊號給它。

      Delete