视频连接
1.6.1. 基本原理
根据色度空间理论,R/G/B三种颜色不同亮度组合,可以综合出任一颜色,这是三基色LED的理论依据。
三基色LED也称全彩LED,内部是由RGB三种颜色的LED组成的,控制三种基色LED的亮度,最终组合出不同的综合颜色。
三基色LED有两种:共阴三基色LED和共阳三基色LED,如下图所示。
上图右图示一款插脚封装的共阳三基色LED实物图及引脚定义。
1.6.2. 硬件电路
既然三基色LED是封装在一起的三个不同颜色的LED,LED的正极连在一起引出(共阳)或LED的负极连在一起引出(共阴)。
那么,三基色LED在电路中接法的接法,就相当于3个共用公共端的LED。
共阴三基色LED,在电路中的接法如下:
共阴三基色LED的控制逻辑:
a. IO输出高电平(value=1),LED点亮;IO输出低电平(value=0),led熄灭;
b. 与micropython的pwm占空比一致;
共阳三基色LED,在电路中的接法如下:
共阳三基色LED的控制逻辑:
a. IO输出高电平(value=1),LED熄灭;IO输出低电平(value=0),led点亮;
b. 与micropython的pwm占空比相反,故赋值占空比时使用1023-duty;
示意图中:
R01=R02=R03=1K。
1.6.3. 程序设计(以共阴三基色LED为例)
案例描述:按1Hz的频率循环切换红、绿、蓝
需求分析:LED点亮的条件是两端有合适的电压,共阴三基色Led的公共端接地,则点亮的通道需高电平(PWM的占空比duty是高电平占比,可以直接赋值)。控制单路LED的亮度可以使用PWM技术(频率100hz,duty控制亮度0~1023),红色时R支路duty=1023、G/B支路duty=0,绿色时G支路duty=1023、B/R支路duty=0,蓝色时B支路duty=1023、G/R支路duty=0。
代码实现:
from machine import Pin,PWM from time import sleep #r/g/b实例 r = PWM(Pin(18,Pin.OUT),freq=100,duty=1023) g = PWM(Pin(19,Pin.OUT),freq=100,duty=1023) b = PWM(Pin(21,Pin.OUT),freq=100,duty=1023) #[红、绿、蓝] color_ary = [[1023,0,0],[0,1023,0],[0,0,1023]] #计数器 i = 0 #循环 while True: #配置各通道duty print("%d:r->%d,g-%d,b-%d" %(i,color_ary[i][0],color_ary[i][1],color_ary[i][2])) r.duty(color_ary[i][0]) g.duty(color_ary[i][1]) b.duty(color_ary[i][2]) #指向下一颜色 i = i+1 if(i>2): i = 0 #延时1S sleep(1)
1.6.4. 函数
项目开发中,为了提高代码的可读性、复用性、层次感等,可以将具有独立功能的代码打包成函数,方便多处调用,如上节中显示颜色的语句可以打包成函数,具体代码如下:
from machine import Pin,PWM from time import sleep #r/g/b实例 r = PWM(Pin(18,Pin.OUT),freq=100,duty=0) g = PWM(Pin(19,Pin.OUT),freq=100,duty=0) b = PWM(Pin(21,Pin.OUT),freq=100,duty=0) #[红、绿、蓝] color_ary = [[1023,0,0],[0,1023,0],[0,0,1023]] #函数演示 def color(r_value,g_value,b_value): r.duty(r_value) g.duty(g_value) b.duty(b_value) #计数器 i = 0 #循环 while True: #配置各通道duty color(color_ary[i][0],color_ary[i][1],color_ary[i][2]) #指向下一颜色 i = i+1 if(i>2): i = 0 #延时1S sleep(1)
1.6.5. 其他测试
观察r、g、b通道不同duty时的颜色变化。
from machine import Pin,PWM from time import sleep #r/g/b实例 r = PWM(Pin(18,Pin.OUT),freq=100,duty=0) g = PWM(Pin(19,Pin.OUT),freq=100,duty=0) b = PWM(Pin(21,Pin.OUT),freq=100,duty=0) #[红、绿、蓝] color_ary = [[1023,0,0],\ [0,1023,0],\ [0,0,1023],\ [511,511,511],\ [0,511,511],\ [511,0,511],\ [511,511,0]] #函数演示 def color(r_value,g_value,b_value): r.duty(r_value) g.duty(g_value) b.duty(b_value) #计数器 i = 0 #循环 while True: #配置各通道duty print("%d:r->%d,g-%d,b-%d" \ %(i,color_ary[i][0],color_ary[i][1],color_ary[i][2])) color(color_ary[i][0],color_ary[i][1],color_ary[i][2]) #指向下一颜色 i = i+1 if(i>(len(color_ary)-1)): i = 0 #延时1S sleep(1)
理论上,三基色不同亮度可以混合出全彩效果,这就是LED显示器的工作原理,LED显示器的最小显示单元就是3基色LED。
小知识:python跨行代码使用“\”。