LED閃爍實驗
一、學習目標
學習電阻的知識學習LED的相關知識學習數字I/O輸出指令:digitalWrite()二、預備知識
1.什麼是電阻器:
電阻器(Resistor)在日常生活中一般直接稱為電阻。是一個限流元件,將電阻接在電路中後,電阻器的阻值是固定的一般是兩個引腳,它可限制通過它所連支路的電流大小。阻值不能改變的稱為固定電阻器。阻值可變的稱為電位器或可變電阻器。
圖1-1電阻器實物圖
電器上的音量旋鈕通常使用的是可變電阻器或叫電位器。
在電路原理圖中,電阻和電位器的原理符號如下:
圖1-2電阻器原理符號
這兩種都是電阻的符號,一個是國內的標準,一個是國外的標準,現在都通用。另外電阻器不分極性,兩端都是一樣的可以互換。同樣的,電位器的原理符號也是兩種,如下圖所示:
圖1-3電位器原理符號
由於體積和抗磨損的原因,固定電阻器的值不再直接以印數字的方式標識了,而採用國際上標準的色環法標註。色環標註阻值的電阻分為四環和五環以及六色環,主要是精度的區別,四環標註的電阻阻值誤差為5%,而五環標註的電阻阻值誤差為1%,而六色環則是在五色環基礎上多了一個溫度係數。
圖1-4四色環和五色環電阻實物
電阻色環的計算在網上有很多,這裡只簡單的介紹下:
圖1-5電阻色環含義
色環顏色對應數值如下:
圖1-6電阻色環對照表
看著複雜,其實很簡單,我們舉個例子,如下圖的4色環電阻器照片(照片為網上隨便找的):
圖1-7四色環電阻示例
照片中為4色環電阻,色環密集的一頭為起始位置,顏色順序為棕,黑,棕,金。按照前面色環對照表,棕為1,黑為0。金銀兩色只用來標記誤差值。4色環電阻值為兩位,因此前兩環,棕,黑為有效數值:10,第三環為10的冪數,此環顏色為棕即1,也就是101,因此,此電阻阻值為:10 x 101 = 100Ω,誤差色環為金色,也就是±5%的誤差。
再看一個5色環的例子,如圖:
圖1-8五色環電阻示例
色環順序為:棕,黑,黑,棕,棕。由圖1.7電阻色環含義可知5色環中前三個色環為有效數值,棕,黑,黑,為100(參照圖1.8電阻色環對照表),第4環為10的指數,此環為棕色,即101,誤差為棕色,即±1%。則圖中電阻的值為:100x101 = 1000Ω 誤差±1%。通常1000Ω也寫成1kΩ。
2.什麼是發光二極體
發光二極體簡稱為 LED。由鎵(Ga)與砷(AS))磷(P)的化合物製成的二極體,當電子與空穴複合時能輻射出可見光,因而可以用來製成發光二極體,在電路及儀器中作為指示燈,或者組成文字或數字顯示。磷砷化鎵二極體發紅光,磷化鎵二極體發綠光, 碳化矽二極體發黃光。
圖1-9各種顏色的發光二極體
它是半導體二極體的一種,可以把電能轉化成光能;常簡寫為 LED。發光二極體與普通二極體一樣是由一個 PN 結組成,也具有單向導電性。當給發光二極體加上正向電壓後,從 P 區注入到 N 區的空穴和由 N 區注入到 P 區的電子,在 PN 結附近數微米內分別與 N 區的電子和 P 區的空穴複合,產生自發輻射的螢光。不同的半導體材料中電子和空穴所處的能量狀態不同。當電子和空穴複合時釋放出的能量多少不同,釋放出的能量越多,則發出的光的波長越短。常用的是發紅光、綠光或黃光的二極體。
發光二極體的兩根引線中較長的一根為正極,應連接電源正極。有的發光二極體的兩根引線一樣長,但管殼上有一凸起的小舌,靠近小舌的引線是正極。如下圖所示:
圖1-10發光二極體內部結構圖
LED的原理符號如下:
圖1-11發光二極體(LED)的原理符號
正極也稱為陽極,負極也稱為陰極。正常工作時,正極端的電壓必須大於負極端的電壓。
3.認識「電源地」
電源地(GND)並沒有實際器件,但它是電路原理圖必不可少的符號。它是所有電壓的基準點,為0V電壓。其他的標稱電壓如輸入電壓,輸出電壓,電源電壓等都是相對於「地(GND)」才有意義。它的原理符號如下:
圖1-12地(GND)的原理符號
同時,它又是一個網絡,原理圖中所有和地相連接的器件結點都是相互連通的。
4.LED電路工作原理
LED燈有兩種連線方法:當LED燈的陽極通過限流電阻與板子上的數字 I/O 口相連, 數字口輸出高電平時,LED導通,發光二極體發出亮光;數字口輸出低電平時,LED截止,發光二極體熄滅。如圖:
圖1-13發光二極體接線方法 1
當LED燈的陰極與板子上的數字I/O口相連時,數字口輸出高電平,LED截止,發光二極體熄滅;數字口輸出低電平,LED燈導通,發光二極體點亮。
圖1-14發光二極體接線方法 2
發光二極體的反向擊穿電壓約 5 伏。正向工作電壓為1.5~2.5V,其工作電流一般為5 ~20mA。它的正向伏安特性曲線很陡,使用時必須串聯限流電阻以控制通過管子的電流。限流電阻 R 可用下式計算:
R=(Vi-VF)/I ;
式中 Vi 為電源電壓,VF 為 LED 的正向壓降,I 為 LED 的工作電流,電流越大LED越亮,但如果電流超過LED自身能夠承受的範圍,則會損壞LED器件。而且,HexRuino的引腳輸入輸出的正常驅動電流為5mA,輸出高電平電壓3V左右,正好可以驅動這樣的LED器件。
注意:HexRuino的控制晶片的工作電壓是3.3V,因此HexRuino板上所有引腳輸出時的最大電壓不會超過3.3V。
所以在接線方法1中,HexRuino引腳輸出高電平電壓為3V,選擇2V為LED工作電壓,5mA(0.005A)為工作電流,則限流電阻R為:
R = (3 - 2) / 0.005 = 200Ω
正常情況下,我們可使用200Ω 的電阻作為限流電阻。
連線方案2中,由於Vi使用3.3V電源,比方案1中的3V很接近,因此限流電阻的取值依然可以使用200Ω。
三、實驗步驟
1.硬體連接
本實驗選擇了接線方法 1 連接發光二極體,將 200Ω 電阻的一端插在麵包板上,另一端和HexRuino的digital I/O 口A0相連接,電阻和發光二極體的正極通過導線相連,發光二極體的負端插在麵包板上與HexRuino板的 GND 相連。具體連接如圖:
圖1-15發光二極體的具體接線圖
接下來就可以通過控制A0腳的輸出達到控制LED的亮滅。
2.軟體編程
在HexRuino板上除了電源引腳外,所有的引腳都可用作數字I/O的輸出,其輸出命令為:
實驗一:
按照圖1.15發光二極體的具體接線圖連接好,將HexRuino通過USB線連接至電腦上。打開Espruino Web IDE開發環境,連接HexRuino設備。在左側交互窗口中輸入:
digitalWrite(A0, true)
如果硬體連接沒問題的話,應該看到LED燈亮起來了。
再次輸入:
digitalWrite(A0, false)
可看到LED燈熄滅。當然,用1代替true,0代替false也是一樣的。
圖1-16直接執行命令可立即看到結果
在此可以體會到,對於數字I/O模式的引腳,其輸出只能輸出0或1兩種狀態。如果沒有看到正常的結果,請再次檢查連線是否正確,指令輸入是否準確無誤。
實驗二:
接下來,我們需要將LED閃動起來,方法有兩種:
方法一:使用digitalPulse(pin, value, time)命令產生一系列脈衝信號,
命令:
現在實驗一下此指令,在左側交互窗口輸入:
digitalPulse(A0, 1, 1000)
可看到LED燈點亮1秒鐘(1000ms)後,熄滅。此命令實際上在數字I/O引腳上產生了一個時間寬度為1000毫秒(ms)的高電平脈衝:
圖1-17引腳A0的輸出波形
A0輸出為1的期間,LED持續發光,直至A0輸出為0的時候。
對於命令digitalPulse()中參數time其實是可以使用數組,比如[200, 200, 200,200]就是數組了,如果輸入命令:
digitalPulse(A0, 1, [200, 200, 200, 200])
就可以看到,LED持續亮200ms後,熄滅200ms,再次亮200ms,最後熄滅200ms,最終LED停在點亮狀態。其A0的輸出波形圖如下:
圖1-18 A0的輸出波形
需要說明的是,digitalPulse()命令執行後會立即返回,脈衝列表是有內部定時器回調函數執行完成的。
很顯然,方法一雖然可以讓LED閃動,但無法完成持續的周期閃動。那麼,現在我們就來使用方法二,完成周期性的持續閃動。
方法二:創建定時任務,按照一定周期切換LED的狀態。
創建一個定時任務的命令:
在方法一中,使用digitalPulse(A0, 1, 200)可以產生一個寬度200ms的高電平脈衝,LED在此期間點亮。如果再算上熄滅的時間200ms,那麼LED一亮一滅的時間為400ms,因此我們只需要創建一個400ms的定時任務,每次定時到期都執行digitalPulse(A0, 1, 200)命令,點亮LED燈200ms,其餘時間LED處於熄滅狀態。就可以周期性的讓LED閃動了,具體命令如下:
setInterval(digitalPulse, 400, A0, 1, 200)
按照前面的介紹,上面命令中400為定時任務觸發間隔400ms。調用的digitalPulse(A0, 1, 200)命令拆分成命令名digitalPulse以及其中的參數A0, 1, 200,分別帶入setInterval中。當然也可以使用如下的方式定時執行digitalPulse(A0, 1, 200)命令:
setInterval(「digitalPulse(A0, 1, 200)」, 400)
執行後應該可以看到結果了,LED燈應該不停的閃爍,完全停不下來的節奏。
注意:使用setInterval()創建的定時任務如果不主動釋放,就會一直存在並運行下去。除非主動釋放或者斷電(復位)重啟。
因此,如果我們多次執行setInterval(digitalPulse, 400, A0, 1, 200) 這樣的命令,你會發現系統運行會越來越慢,最終系統也會報錯:
圖1-19多次執行setInterval()命令
多次執行setInterval()命令不會將之前的定時任務修改,只會創建新的定時任務。注意到每次執行setInterval()後返回的數字了嗎?這是每個新創建定時任務的索引號(或id)。使用這個id才能對相應的定時任務進行修改,或刪除。使用如下命令釋放(刪除)定時任務:
例如,使用clearInterval(1)刪除id=1的定時任務,而則刪除所有定時任務。
圖1-20使用clearInterval()刪除定時任務
其他清除定時任務的方法除了斷電復位外,還可通過左第3個快捷菜單按鈕中的clearInterval命令來實現:
圖1-21快捷菜單中的ClearInterval命令
最後,要想修改已存在的定時任務的觸發間隔,使用:
四、習題:
1 讓LED亮500ms,滅1s,循環閃動。
2 讓LED以如下波形描述的方式循環閃動:
答案:
1 亮500ms, 滅1s(1000ms),一個周期為1500ms,因此:
setInterval(「digitalPulse(A0, 1, 500)」, 1500)
2 波形:
因此:
第一步:閃動波形
digitalPulse(A0, 1, [200, 200, 200, 200, 200])
第二步:創建定時任務
setInterval(「digitalPulse(A0, 1, [200, 200, 200, 200, 200])」, 2000)