一块儿玩转树莓派(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闪到了眼睛

相关文章
相关标签/搜索