實驗目的
利用 PWM (Pulse Width Modulation, 脈衝寬度調變) 控制 LED 燈光亮度。
材料
- Arduino 主板 x 1
- LED x 1
- 220 ohm 電阻 x 1
- 單心線 x N
接線
- LED 接到 pin9 和 GND,長腳(陽極)串接一顆 220 ohm 電阻到 pin9,短腳(陰極)直接接到 GND
電路圖
程式碼
編譯這支程式,然後上傳到 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) 的時間比例。
你可能會納悶,一直開開關關的 ,LED 會不會閃爍讓眼睛不舒服?答案是不會的,因為開關的頻率很快,肉眼是看不出 LED 有在閃爍的。
動動腦
- 如何加快或放慢 LED 亮度變化的速度?(提示:delay() 函式)
- 改用 pin9 以外的其它 PWM 腳位
- 多接幾顆 LED,讓每顆 LED 使用不同的速率改變亮度
作者已經移除這則留言。
回覆刪除你好!小弟剛開始接觸arduino,想請問一下arduino能否做到電壓0-15V 1.5-2A的pwm輸出嗎?
回覆刪除hi, arduino 的腳位最多只能輸出 5V 的電壓和最多 50mA 的電流喔,如果要控制大電流和電壓的輸出,可能要另外供電,然後再搭配電晶體去控制
回覆刪除Hi,小弟對電學一竅不通,上網查看了些資料,買了一顆D560的電晶體,不懂如何使用,請問這顆電晶體能否做到0-15V 1.5-2A 的pwm輸出?版主能講解一下如何接傅嗎,如何使用嗎?謝謝!
回覆刪除我也沒用過 D560 耶!
回覆刪除不如你學起來後,來分享一下吧! :)
博主,arduino如何连接rs232接口(母口)的设备?我尝试过用rs232(母口)转ttl和usb转ttl在电脑上进行测试,两个转接器之间用ttl相连,结果无响应。两个rs232母口(转接器和设备)之间相连用的是双头rs232公口线。
回覆刪除要讓 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