wringPi 初始化GPIO 为上拉_玩转GPIO之点亮RGB彩灯(非树莓派)

在这里,我学习了利用GPIO口点灯:

myastrotong:玩转GPIO之点灯(非树莓派)​zhuanlan.zhihu.com

在这里,我学习了用PWD点亮呼吸灯:

myastrotong:玩转GPIO之PWM点亮呼吸灯(非树莓派)​zhuanlan.zhihu.com

下面,就玩一玩点灯的高级功能:基于三基色原理,用三色灯的不同搭配模拟出RGB七色灯的效果!

9245665d-1113-eb11-8da9-e4434bdf6706.png

选择如下三色LED灯,在通常情况下,用GPIO口单独点亮时只会发出蓝、红、绿三种颜色的光(注意:此灯一定要选择共阴极的,别买共阳极的)。

共阴四脚 5MM LED灯发光二极管 可控七彩灯 红绿蓝三色全彩 10个​detail.tmall.com
9b45665d-1113-eb11-8da9-e4434bdf6706.png

基于PWM,通过控制如下R、G、B三个回路的占空比,人眼看上去就能够模拟出七彩灯光。

a645665d-1113-eb11-8da9-e4434bdf6706.png

基于此思想,连接电路:连接总线控制器的PWM_CH3、PWM_CH4、PWM_CH5的三个引脚分别接到三色灯的三个阳极(三个短针),然后三色灯的阴极(长针)接到总线控制器的GND端(三色发光二极管的长针为共阴极)。

注意在灯的阴极和总线控制器的GND端还要串联一个电阻(我选择1K欧的),否则电路烧毁!

aa45665d-1113-eb11-8da9-e4434bdf6706.png

接好的效果图如下:

af45665d-1113-eb11-8da9-e4434bdf6706.png

控制电路关键代码如下,前面的公共代码部分见“用PWD点亮呼吸灯”篇,不予赘述:

    # Initialize adc
    PWMConfig = PWM_CONFIG()
    ### 测试发现了,就是通过ChannelMask来选择通道。
    #ChannelMask  需要输出波形的通道号,每个bit位代表一个通道,
    #bit0对应PWM_CH0,对应位为1,该通道输出波形。
    PWMConfig.ChannelMask = 0xFF # 初始化所有通道

    
    PWMConfig3 = PWM_CONFIG()
    #我选的是P8,对应的PWM是CH3 二进制是1000 ->16进制是0x08
    PWMConfig3.ChannelMask = 0x08
    
    PWMConfig4 = PWM_CONFIG()
    #我选的是P10,对应的PWM是CH4 二进制是10000 ->16进制是0x10
    PWMConfig4.ChannelMask = 0x10
    
    PWMConfig5 = PWM_CONFIG()
    #我选的是P11,对应的PWM是CH5 二进制是100000 ->16进制是0x20
    PWMConfig5.ChannelMask = 0x20
    
    #PWMConfig.ChannelMask = 0xFF # 初始化所有通道
    for i in range(0,8):
        PWMConfig3.Polarity[i] = 1 # 将所有PWM通道都设置为正极性
        PWMConfig4.Polarity[i] = 1
        PWMConfig5.Polarity[i] = 1 
        PWMConfig.Polarity[i] = 1 
    for i in range(0,8):
        PWMConfig3.Precision[i] = 100 # 将所有通道的占空比调节精度都设置为1%
        PWMConfig4.Precision[i] = 100
        PWMConfig5.Precision[i] = 100 
        PWMConfig.Precision[i] = 100 
    for i in range(0,8):
        PWMConfig3.Prescaler[i] = 10 # 将所有通道的预分频器都设置为10,则PWM输出频率为200MHz/(PWMConfig.Precision*PWMConfig.Prescaler)
        PWMConfig4.Prescaler[i] = 10
        PWMConfig5.Prescaler[i] = 10 
        PWMConfig.Prescaler[i] = 10 
    for i in range(0,8):
        PWMConfig3.Pulse[i] = PWMConfig.Precision[i]*30//100 # 将所有通道的占空比都设置为30%
        PWMConfig4.Pulse[i] = PWMConfig.Precision[i]*30//100
        PWMConfig5.Pulse[i] = PWMConfig.Precision[i]*30//100 
        PWMConfig.Pulse[i] = PWMConfig.Precision[i]*30//100 
    # 初始化PWM
    ret = PWM_Init(DevHandles[DevIndex],byref(PWMConfig));
    #ret = PWM_Init(DevHandles[DevIndex],byref(PWMConfig5));
    if ret != PWM_SUCCESS:
        print("Initialize pwm faild!")
        exit()
    else:
        print("Initialize pwm sunccess!")
        print(DevHandles[DevIndex])
        
    # 启动PWM,RunTimeOfUs之后自动停止,利用该特性可以控制输出脉冲个数,脉冲个数=RunTimeOfUs*200/(PWMConfig.Precision*PWMConfig.Prescaler)
    #RunTimeOfUs=0,表示一直输出 《==输出波形的时间,单位为微秒
    RunTimeOfUs = 0
    #ret = PWM_Start(DevHandles[DevIndex],PWMConfig3.ChannelMask,RunTimeOfUs)
    #ret = PWM_Start(DevHandles[DevIndex],PWMConfig4.ChannelMask,RunTimeOfUs)
    #ret = PWM_Start(DevHandles[DevIndex],PWMConfig5.ChannelMask,RunTimeOfUs)
    ret = PWM_Start(DevHandles[DevIndex],PWMConfig.ChannelMask,RunTimeOfUs)
    
    if(ret != PWM_SUCCESS):
        print("Start pwm faild!")
        exit()
    else:
        print("Start pwm sunccess!")

    try:
        while (True):
            #改变PWM波形占空比 
            for j in range(0,101,2):
                for i in range(0,8):
                    PWMConfig3.Pulse[i] = random.randint(0,100)       
                    PWMConfig4.Pulse[i] = random.randint(0,100)    
                    PWMConfig5.Pulse[i] = random.randint(0,100)             
                PWM_SetPulse(DevHandles[DevIndex],PWMConfig3.ChannelMask,PWMConfig3.Pulse)
                PWM_SetPulse(DevHandles[DevIndex],PWMConfig4.ChannelMask,PWMConfig4.Pulse)
                PWM_SetPulse(DevHandles[DevIndex],PWMConfig5.ChannelMask,PWMConfig5.Pulse)
                print("==>"+str(j))
                print(PWMConfig3.Pulse[0],end='  ')
                print(PWMConfig4.Pulse[0],end='  ')
                print(PWMConfig5.Pulse[0],end='n')
                #print(str(PWMConfig3.Pulse[0])+"   "+str(PWMConfig4.Pulse[0])+"  "+(PWMConfig5.Pulse[0]))
                sleep(0.03)     
 
    except KeyboardInterrupt:
        pass

基本思想就是通过R、G、B三个回路不同的占空比(由0~100的随机数来模拟)来形成随机彩色灯的效果。你也可以自己改变这些数,比如不同频率的三角函数灯,来生成不同的效果。

通过sleep(xxx)函数可以控制灯光的持续时间。

整体RGB七色灯点亮效果如下(手机录的视频色彩损失严重,最好还是自己搭一个实际的电路看效果):

b245665d-1113-eb11-8da9-e4434bdf6706.png
玩转GPIO之PWM点亮RGB七彩灯https://www.zhihu.com/video/1225522332867260416

另外还可以得到彩色呼吸灯的效果,只需要把随机数生成的代码部分改成如下正弦曲线就可以了:

                    PWMConfig3.Pulse[i] = math.ceil((math.sin(tt)+1)*50)        
                    PWMConfig4.Pulse[i] = math.ceil((math.cos(tt+1.5)+1)*50)  
                    PWMConfig5.Pulse[i] = math.ceil((math.sin(tt+1)+1)*50) 
                    if PWMConfig3.Pulse[i]<=2:
                        PWMConfig3.Pulse[i]=0
                    if PWMConfig4.Pulse[i]<=2:
                        PWMConfig4.Pulse[i]=0
                    if PWMConfig5.Pulse[i]<=2:
                        PWMConfig5.Pulse[i]=0

RGB彩色呼吸灯的效果如下:

b445665d-1113-eb11-8da9-e4434bdf6706.png
玩转GPIO之PWM点亮RGB彩色呼吸灯https://www.zhihu.com/video/1225867782682218496
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值