2010年12月22日 星期三

Arduino 筆記 - Lab3 控制 LED 燈光亮度

實驗目的

利用 PWM (Pulse Width Modulation, 脈衝寬度調變) 控制 LED 燈光亮度。

材料
  • Arduino 主板 x 1
  • LED x 1
  • 220 ohm 電阻 x 1
  • 單心線 x N
接線
  • LED 接到 pin9 和 GND,長腳(陽極)串接一顆 220 ohm 電阻到 pin9,短腳(陰極)直接接到 GND

image

電路圖

image

程式碼

Fading.pde

 

編譯這支程式,然後上傳到 Arduino 板子上,過數秒後,就會看到 LED 燈光不斷地改變亮度,一下子漸亮,一下漸暗。

說明:

  • L01: brightness 變數用來保存目前的燈光亮度
  • L02: fadeAmount 變數用來設定每一次燈光亮度的調整值
  • L06: 宣告 pin9 為 output pin, LED 接在 pin9 上
  • L11: 使用 analogWrite(9, brightness) 設定 pin9 上的 LED 燈光亮度
  • L14: 調整下一次的燈光亮度
  • L17~L19: 改變 fadeAmount 燈光亮度調整值,假如 brightness 已達到最亮(255),就將 fadeAmount 改成 -5,讓燈光下一次的變化改成漸漸變暗,假如 brightness 已達到最暗(0),就將 fadeAmount 改回 +5,讓燈光下一次的變化改成漸漸變亮。
  • L21: 延遲 30ms,這樣肉眼才能看得到 LED 調光的效果
範例照片/影片

Youtube 上正好有段示範利用 PWM 控制 LED 燈光亮度的影片,我們來看看他的示範:

PWM 原理簡介

數位輸出可以控制訊號的開跟關,開意味著通電,關意味著斷電,如果我們能夠進一步通電的時間比例,就能讓類比輸出產生變化,例如 LED 燈光通電時間為 50%,就可以控制 LED 讓它只有 50% 的亮度,如果把通電時間比例改為 25%,就可以控制 LED 讓它只有 25% 的亮度。這個方法稱為 PWM (Pulse Width Modulation)脈衝寬度調變,PWM 是一個利用數位訊號來控制類比輸出的技術,常用於蜂鳴器、電熱器、馬達或風扇轉速、燈光亮度等的控制。

下圖中,垂直的綠線代表一個規律的時間週期,在 Arduino 中,每個週期是 2ms (PWM 頻率為 500Hz)。analogWrite() 的參數值範圍介於 0 到 255 之間,analogWrite(255) 代表產生 100% duty cyle 的輸出(一直通電),而 analogWrite(127) 則是產生 50% duty cycle 的輸出(一半的時間通電,一半的時間斷電)。

Duty Cycle 為每一個週期通電(on) 的時間比例。

image

你可能會納悶,一直開開關關的 ,LED 會不會閃爍讓眼睛不舒服?答案是不會的,因為開關的頻率很快,肉眼是看不出 LED 有在閃爍的。

動動腦
  1. 如何加快或放慢 LED 亮度變化的速度?(提示:delay() 函式)
  2. 改用 pin9 以外的其它 PWM 腳位
  3. 多接幾顆 LED,讓每顆 LED 使用不同的速率改變亮度
參考資料

7 意見:

Hin Shing Ip 提到...
作者已經移除這則留言。
Hin Shing Ip 提到...

你好!小弟剛開始接觸arduino,想請問一下arduino能否做到電壓0-15V 1.5-2A的pwm輸出嗎?

cooper maa 提到...

hi, arduino 的腳位最多只能輸出 5V 的電壓和最多 50mA 的電流喔,如果要控制大電流和電壓的輸出,可能要另外供電,然後再搭配電晶體去控制

S Shing 提到...

Hi,小弟對電學一竅不通,上網查看了些資料,買了一顆D560的電晶體,不懂如何使用,請問這顆電晶體能否做到0-15V 1.5-2A 的pwm輸出?版主能講解一下如何接傅嗎,如何使用嗎?謝謝!

cooper maa 提到...

我也沒用過 D560 耶!
不如你學起來後,來分享一下吧! :)

Jack 提到...

博主,arduino如何连接rs232接口(母口)的设备?我尝试过用rs232(母口)转ttl和usb转ttl在电脑上进行测试,两个转接器之间用ttl相连,结果无响应。两个rs232母口(转接器和设备)之间相连用的是双头rs232公口线。

Cooper Maa 提到...

要讓 arduino 連接 rs232 接口,需要 MAX232 晶片做訊號轉換

電路設計可以參考這塊 arduino shield:

http://www.cutedigi.com/arduino-shields/rs232-shield-for-arduino.html

電路圖:
http://www.cutedigi.com/pub/Arduino/arduino_RS232.pdf