一塊兒玩轉樹莓派(3)——點亮RGB炫彩LED燈

一塊兒玩轉樹莓派(3)——點亮RGB炫彩LED燈

在閱讀本篇博客以前,若是你對樹莓派的GPIO尚未基本的瞭解,我建議你先閱讀本系列博客的上一篇,關於雙色LED燈實驗的。瞭解樹莓派GPIO的基本用法是進行本篇博客實驗的基礎。上篇博客地址以下:python

http://www.javashuo.com/article/p-uwdvgpqj-wu.htmlmarkdown

如今,若是你已經成功完成過樹莓派雙色LED燈實驗,而且對深刻樹莓派玩法有更多的興趣的話,那麼咱們在進一步,嘗試點亮一個更加絢麗的LED燈:RGB3色LED燈。ide

1、認識RGB三原色LED燈並連線

經過前面的實驗,咱們已經知道,雙色的LED燈內部封裝了紅綠兩個發光二極管,其有3個引腳,其中1個引腳是共用的(共陰或共陽),對於共陰型的雙色LED燈,控制另外兩個引腳的高低電平來分別點亮紅燈或綠燈。對於RGB3色LED燈也相似,只是其內部封裝了3個發光二極管,分別能夠發出紅光,綠光和藍光。其有4個引腳,1個引腳共用和3個控制發光二極管的引腳。編碼

本次實驗,咱們依然採用共陰型的RGB3色LED燈,元件以下圖所示:3d

一塊兒玩轉樹莓派(3)——點亮RGB炫彩LED燈

共陰型的LED燈,GND引腳是其公共的陰極,接線的時候咱們須要將此引腳接地,另外3個引腳分別接3個GPIO來控制亮燈。下面兩種圖,很是直觀的演示了此LED燈的工做原理:code

一塊兒玩轉樹莓派(3)——點亮RGB炫彩LED燈一塊兒玩轉樹莓派(3)——點亮RGB炫彩LED燈

在將LED燈鏈接到樹莓派以前,咱們須要預約幾個要用的GPIO引腳,以後咱們在編寫代碼時,依然採用物理編碼,首先咱們先肯定要使用的GPIO引腳的BCM編碼下的GPIO18,GPIO19和GPIO20,一般查看引腳編碼對應圖,咱們能夠找到其所對應的物理引腳分別爲12,24和28。若是不使用擴展板,直接將原件上的對應引腳鏈接到樹莓派的這些物理引腳上便可,若是使用的是BCM編碼的擴展板,則咱們在連線時無需關心這些物理引腳,直接鏈接便可,以下:blog

一塊兒玩轉樹莓派(3)——點亮RGB炫彩LED燈

好了,如今咱們已經完成了基本的連線工做。接口

2、三原色與脈衝寬度調製

三原色本指色彩中不能再分解的三種基本顏色,在光學上,紅、綠、藍爲最基本的三原色。三原色通過混合後,能夠組成各式各樣的顏色。例如將三原色等比混合後將能組成白色,將紅色和綠色組合後會生成黃色,將紅色和藍色混合後會獲得紫色等等。以下圖所示:utf-8

一塊兒玩轉樹莓派(3)——點亮RGB炫彩LED燈

所以,從原理上說,咱們只要能夠控制RGB燈三種顏色的顯示亮度,就可讓LED燈調製出各類顏色。控制LED等中各個發光二極管的亮和滅很是簡單,咱們只須要向其加高電平或低電平便可,那麼如何控制發光二極管的亮度呢?咱們須要使用到另一種電流控制技術:PWM脈衝寬度調製。get

脈衝寬度調製(PWM)是一種模擬控制方式,其經過控制脈衝電壓中高電壓的佔空比來控制流過元件的電流大小。PWM技術中有兩個很是重要的參數:頻率與佔空比。頻率用來控制脈衝信號的週期,若是頻率太低,在控制LED燈的時候,燈就會進行閃爍,當頻率足夠高,人眼已沒法分辨出其閃爍,看上起LED燈就是常亮的。佔空比指的是在輸出的脈衝信號中,高電平保持的時間與該脈衝信號的週期時間之比。例如,假設設置週期爲100Hz,則其週期時間爲10ms,若是設置的佔空比爲20%,則當前週期中,高電平的佔比時間爲2ms。

Python的GPIO庫中提供了PWM控制接口,使用也很是簡單,使用以下方法能夠獲取某個引腳的PWM實例:

p = GPIO.PWM(channel, frequency)

其中,channel參數爲引腳編碼,frequency參數爲設置的PWM頻率。下面方法用來開啓PWM脈衝:

p.start(dc)

其中,dc參數設置脈衝的高電平佔空比,取值範圍爲0-100。

經過下面的方法能夠對PWM脈衝頻率和佔空比進行修改:

p.ChangeFrequency(freq) 
p.ChangeDutyCycle(dc)

須要結束PWM脈衝調製時,能夠調用以下方法:

p.stop()

3、點亮炫彩的三彩LED燈

如今,咱們已經作好了全部準備工做,能夠開始編碼了。咱們要實現這樣一個功能,當程序運行時,先控制LED燈的紅燈,綠燈,靛燈分別亮2秒,以後經過脈衝混合,讓LED燈進行各類顏色的炫彩閃爍,完整代碼以下:

#coding:utf-8

# 導入GPIO控制薄塊
import RPi.GPIO as GPIO
# 導入time模塊
import time
# 導入系統模塊
import sys

# 定義引腳(物理引腳)
R,G,B = 12,35,38
# 設置使用的引腳編碼模式
GPIO.setmode(GPIO.BOARD)

# 對要使用的引腳進行初始化
GPIO.setup(R,GPIO.OUT)
GPIO.setup(G,GPIO.OUT)
GPIO.setup(B,GPIO.OUT)

# 使用PWM脈衝寬度調製
pR = GPIO.PWM(R, 60)
pG = GPIO.PWM(G, 60)
pB = GPIO.PWM(B, 60)

# 開啓脈衝,默認的佔空比爲0,燈不亮
pR.start(0)
pG.start(0)
pB.start(0)

# 初始時,各類顏色點亮2秒
# 紅燈先亮2秒
pR.ChangeDutyCycle(100)
pG.ChangeDutyCycle(0)
pB.ChangeDutyCycle(0)
time.sleep(2)

# 替換爲綠燈亮2秒
pR.ChangeDutyCycle(0)
pG.ChangeDutyCycle(100)
pB.ChangeDutyCycle(0)
time.sleep(2)

# 替換爲靛色燈亮2秒
pR.ChangeDutyCycle(0)
pG.ChangeDutyCycle(0)
pB.ChangeDutyCycle(100)
time.sleep(2)

# 定義要閃爍的時間 這裏定義爲10秒
endTime = 100
current = 0

# 開始進行炫彩閃爍
while True:
    # 經過佔空比控制紅色的佔比
    for r in range(0, 101, 10):
        pR.ChangeDutyCycle(r)
        # 經過佔空比控制綠色的佔比
        for g in range(0, 101, 10):
            pG.ChangeDutyCycle(g)
            # 空經過佔空比控制藍色的佔比
            for b in range(0, 101, 10):
                pB.ChangeDutyCycle(b)
                time.sleep(0.1)
                current += 1
                # 結束程序
                if (current > endTime):
                    pR.stop()
                    pG.stop()
                    pB.stop()
                    GPIO.cleanup()
                    sys.exit(0)

在樹莓派上運行此程序,注意!當心不要被太亮的LED閃到了眼睛

相關文章
相關標籤/搜索