在这里,我学习了利用GPIO口点灯:
myastrotong:玩转GPIO之点灯(非树莓派)zhuanlan.zhihu.com在这里,我学习了用PWD点亮呼吸灯:
myastrotong:玩转GPIO之PWM点亮呼吸灯(非树莓派)zhuanlan.zhihu.com下面,就玩一玩点灯的高级功能:基于三基色原理,用三色灯的不同搭配模拟出RGB七色灯的效果!
![9245665d-1113-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/9245665d-1113-eb11-8da9-e4434bdf6706.png)
选择如下三色LED灯,在通常情况下,用GPIO口单独点亮时只会发出蓝、红、绿三种颜色的光(注意:此灯一定要选择共阴极的,别买共阳极的)。
共阴四脚 5MM LED灯发光二极管 可控七彩灯 红绿蓝三色全彩 10个detail.tmall.com![9b45665d-1113-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/9b45665d-1113-eb11-8da9-e4434bdf6706.png)
基于PWM,通过控制如下R、G、B三个回路的占空比,人眼看上去就能够模拟出七彩灯光。
![a645665d-1113-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/a645665d-1113-eb11-8da9-e4434bdf6706.png)
基于此思想,连接电路:连接总线控制器的PWM_CH3、PWM_CH4、PWM_CH5的三个引脚分别接到三色灯的三个阳极(三个短针),然后三色灯的阴极(长针)接到总线控制器的GND端(三色发光二极管的长针为共阴极)。
注意在灯的阴极和总线控制器的GND端还要串联一个电阻(我选择1K欧的),否则电路烧毁!
![aa45665d-1113-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/aa45665d-1113-eb11-8da9-e4434bdf6706.png)
接好的效果图如下:
![af45665d-1113-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/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](http://p01.5ceimg.com/content/b245665d-1113-eb11-8da9-e4434bdf6706.png)
另外还可以得到彩色呼吸灯的效果,只需要把随机数生成的代码部分改成如下正弦曲线就可以了:
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](http://p04.5ceimg.com/content/b445665d-1113-eb11-8da9-e4434bdf6706.png)