天天看點

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

在閱讀本篇部落格之前,如果你對樹莓派的GPIO還沒有基本的了解,我建議你先閱讀本系列部落格的上一篇,關于雙色LED燈實驗的。了解樹莓派GPIO的基本用法是進行本篇部落格實驗的基礎。上篇部落格位址如下: https://my.oschina.net/u/2340880/blog/5123429 現在,如果你已經成功完成過樹莓派雙色LED燈實驗,并且對深入樹莓派玩法有更多的興趣的話,那麼我們在進一步,嘗試點亮一個更加絢麗的LED燈:RGB3色LED燈。

一、認識RGB三原色LED燈并連線

通過前面的實驗,我們已經知道,雙色的LED燈内部封裝了紅綠兩個發光二極管,其有3個引腳,其中1個引腳是共用的(共陰或共陽),對于共陰型的雙色LED燈,控制另外兩個引腳的高低電平來分别點亮紅燈或綠燈。對于RGB3色LED燈也類似,隻是其内部封裝了3個發光二極管,分别可以發出紅光,綠光和藍光。其有4個引腳,1個引腳共用和3個控制發光二極管的引腳。

本次實驗,我們依然采用共陰型的RGB3色LED燈,元件如下圖所示:

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

共陰型的LED燈,GND引腳是其公共的陰極,接線的時候我們需要将此引腳接地,另外3個引腳分别接3個GPIO來控制亮燈。下面兩種圖,非常直覺的示範了此LED燈的工作原理:

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

在将LED燈連接配接到樹莓派之前,我們需要預定幾個要用的GPIO引腳,之後我們在編寫代碼時,依然采用實體編碼,首先我們先确定要使用的GPIO引腳的BCM編碼下的GPIO18,GPIO19和GPIO20,通常檢視引腳編碼對應圖,我們可以找到其所對應的實體引腳分别為12,24和28。如果不使用擴充闆,直接将原件上的對應引腳連接配接到樹莓派的這些實體引腳上即可,如果使用的是BCM編碼的擴充闆,則我們在連線時無需關心這些實體引腳,直接連接配接即可,如下:

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

好了,現在我們已經完成了基本的連線工作。

二、三原色與脈沖寬度調制

三原色本指色彩中不能再分解的三種基本顔色,在光學上,紅、綠、藍為最基本的三原色。三原色經過混合後,可以組成各式各樣的顔色。例如将三原色等比混合後将能組成白色,将紅色和綠色組合後會生成黃色,将紅色和藍色混合後會得到紫色等等。如下圖所示:

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

是以,從原理上說,我們隻要可以控制RGB燈三種顔色的顯示亮度,就可以讓LED燈調制出各種顔色。控制LED等中各個發光二極管的亮和滅非常簡單,我們隻需要向其加高電平或低電平即可,那麼如何控制發光二極管的亮度呢?我們需要使用到另外一種電流控制技術:PWM脈沖寬度調制。

脈沖寬度調制(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()

三、點亮炫彩的三彩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)

# 替換為靛色燈亮2秒

pB.ChangeDutyCycle(100)

# 定義要閃爍的時間 這裡定義為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閃到了眼睛😝。