Originally published by Feb 5, 2020
本文最初發佈在deviceplus.jp網站上,而後被翻譯成英語。
Device Plus網站中介紹了有關Arduino的各種應用和作品示例,但無論創作任何作品,基礎知識都很重要!
在本文中,我們將透過使Arduino能夠調節LED亮度,為您帶來“關鍵”的Arduino基礎知識。
◆
我們曾介紹過,透過將LED連接到Arduino的數位輸出引腳,並設置HIGH (5V) 和LOW (0V) ,可以輕鬆地切換LED的開和關。但是,由於數位輸出只能輸出兩種狀態,因此無法進行亮度調節等控制。
要想解決這個問題,您可以使用“PWM”輸出。PWM可在HIGH和LOW狀態之間反覆切換輸出,所以可以用來調節LED的亮度。
在本文中,我們將學習如何使用PWM來調節LED的亮度。我們還將學習如何編寫使用PWM輸出逐漸點亮LED的程式。
正如我們上次介紹過的,LED的亮度會隨電流的變化而變化。比如,分別透過330Ω的電阻和10kΩ的電阻來調節連接到LED的電流量,並對它們的結果進行比較時,會發現連接330Ω小電阻時電流量更大,這會使LED更亮。或者,改變連接到LED的電源電壓,也會使流過的電流量發生變化。
如果分別施加5V和3.3V的電壓,施加5V電壓時LED燈更亮。根據上一次介紹過的電阻和流過LED的電流之間的關係式,要想讓LED更亮,需要“降低電阻”,或“提高電壓”。
然而,Arduino的數位輸出只有HIGH (5V)或 LOW (0V)兩種狀態,這意味著直接連接並不能改變電壓和電阻值,也就是說,無法調節LED的亮度。但是,雖然只有HIGH和LOW兩種輸出狀態,透過一些努力還是可以改變LED亮度的。
讓我們嘗試一下只用數字輸出來改變LED的亮度吧。亮度可以透過讓LED閃爍來調節。我們按照步驟一步一步來實際操作,看看LED的亮度是如何變化的。將LED連接到Arduino的數位引腳5,如下圖所示:
接下來,創建如下所示的程式並將其傳送給Arduino。此時,LED應該會每隔1秒閃爍1次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const int LED_PIN = 5; const int ON_TIME = 1000; const int OFF_TIME = 1000; void setup(){ pinMode( LED_PIN, OUTPUT ); } void loop(){ digitalWrite( LED_PIN, HIGH ); delay( ON_TIME ); digitalWrite( LED_PIN, LOW ); delay( OFF_TIME ); } |
在程式中,透過第11行的“digitalWrite( LED_PIN, HIGH )”輸出HIGH,使LED亮起,然後透過第12行的“delay (ON_TIME)”在指定的時間內保持亮燈。持續時間以毫秒為單位,如果指定1000,則LED將保持點亮1秒鐘。
接下來,透過第14行的“digitalWrite( LED_PIN, LOW )”輸出LOW,使LED熄滅,然後透過第15行的“delay( OFF_TIME )”在指定的時間內保持熄滅狀態。透過反復執行該程式即可實現LED的閃爍。
下面,讓我們嘗試一下縮短點亮和熄滅的持續時間。可以使用第3行的“const int ON_TIME”來更改點亮狀態的持續時間,使用第4行的“const int OFF_TIME”來更改熄滅狀態的持續時間。將這兩個值都更改為“500”並反射程式,然後確認LED的狀態。可以看到閃爍速度增加。接著,當將值逐漸減小到“250”、“100”、“75”、“50”等數位時,閃爍速度變得更快。當值為“10”左右時,LED看起來像在保持點亮狀態。這是因為如果它閃爍得太快,人眼就跟不上它的速度,從而使燈看起來就像一直亮著。
接下來,我們試著改變點亮和熄滅的持續時間。將“ON_TIME”和“OFF_TIME”都設置為“10”。然後,依次將“ON_TIME”的值更改為“9”、“8”、“7”……“1”,並確認LED的點亮狀態。可以看到當減小該值時,LED會逐漸變暗。
這是因為持續亮燈時間縮短,發光量減少,從而使LED看起來變暗。也就是說,透過改變“點亮持續時間”也可以調節LED的亮度。使用該方法,可以實現用僅能控制開/關的Arduino數位輸出功能來控制LED的亮度。
如上所述,透過調整HIGH和LOW的比例,使LED以較短的週期閃爍,即可調節LED的亮度。但是,自己創建程式來控制閃爍持續時間並不現實。因為處理其他程式需要時間,而這會使閃爍間隔出現偏差,從而會使亮度發生變化。
Arduino可以使用PWM(Pulse Width Modulation,脈衝寬度調製)功能來週期性地輸出HIGH和LOW。PWM是以指定的速率週期性地在HIGH和LOW之間切換的一種功能,可用於上述的LED亮度調節。
但是,需要注意的是,可用於PWM功能的引腳在Arduino中是固定的。只有數位旁邊帶有“〜”標記的引腳(即引腳3、5、6、9、10和11)可使用PWM功能,其他引腳不支援PWM輸出。
另外,由於PWM是透過Arduino的微控制器產生的功能,因此具有輸出穩定、不影響程式運行的優點。
在這裡,我們將LED連接到引腳5來試一下。用與前述電路相同的方式連接LED。
接下來,創建如下所示的程式並將其發送給Arduino,LED將會亮起,但是較暗。
1 2 3 4 5 6 7 8 9 10 11 |
const int LED_PIN = 5; const int DUTY = 64; void setup(){ pinMode( LED_PIN, OUTPUT ); } void loop(){ analogWrite( LED_PIN, DUTY ); } |
透過PWM功能輸出時,需要透過第6行的“pinMode()”將物件引腳設置為輸出模式。實際輸出時,使用第10行的“analogWrite()”。指定物件引腳編號,然後在0到255的範圍內設置保持HIGH的比率。如果設置為“0”,將始終輸出LOW,如果設置為“255”,則始終輸出HIGH。如果設置為“127”,將會以各一半的比率輸出HIGH和LOW。
在這個程式中,可以透過第3行的“const int DUTY”來指定PWM比率。更改該值可以確認亮度的變化情況。
我們使用PWM輸出拓展了LED點亮的方法。現在,讓我們逐漸改變PWM來嘗試實現LED逐漸變亮的效果。
編寫如下程式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
const int LED_PIN = 5; const int WAITTIME = 50; const int STEP = 5; void setup(){ pinMode( LED_PIN, OUTPUT ); } void loop(){ int i; i = 0; while ( i <= 255 ){ analogWrite( LED_PIN, i ); delay( WAITTIME ); i = i + STEP; } i = 255; while ( i >= 0 ){ analogWrite( LED_PIN, i ); delay( WAITTIME ); i = i - STEP; } } |
在上述程式中,將PWM比率存儲在loop()函數中使用的“i”變數中,以使其可以逐漸增加該值,從而使LED逐漸變亮。
第14行的while處理以STEP指定的增量增加值,直到i達到 255。增加的值由第15行的analogWrite()輸出,以使LED的亮度改變。此外,每次第16行的PWM輸出改變時,將等待由WAITTIME指定的持續時間。
當PWM比率達到255時,它會逐漸減小該值直到0,以使LED逐漸變暗(第21到25行)。可以透過更改第3行的WAITTIME或第4行的STEP的值來調節閃爍速度。
此次我們學習了如何控制LED的亮度。下篇再見!
想瞭解更多關於Arduino的知識嗎?歡迎查看相關的文章: