• 1.6. 三基色LED


    视频连接

    1.6.1. 基本原理

    根据色度空间理论,R/G/B三种颜色不同亮度组合,可以综合出任一颜色,这是三基色LED的理论依据。

    三基色LED也称全彩LED,内部是由RGB三种颜色的LED组成的,控制三种基色LED的亮度,最终组合出不同的综合颜色。

    三基色LED有两种:共阴三基色LED和共阳三基色LED,如下图所示。

    wps1

    wps2wps3

    上图右图示一款插脚封装的共阳三基色LED实物图及引脚定义。

    1.6.2. 硬件电路

    既然三基色LED是封装在一起的三个不同颜色的LED,LED的正极连在一起引出(共阳)或LED的负极连在一起引出(共阴)。

    那么,三基色LED在电路中接法的接法,就相当于3个共用公共端的LED。

    共阴三基色LED,在电路中的接法如下:

    wps4

    共阴三基色LED的控制逻辑:

    a. IO输出高电平(value=1),LED点亮;IO输出低电平(value=0),led熄灭;

    b. 与micropython的pwm占空比一致;

    共阳三基色LED,在电路中的接法如下:

    wps5

    共阳三基色LED的控制逻辑:

    a. IO输出高电平(value=1),LED熄灭;IO输出低电平(value=0),led点亮;

    b. 与micropython的pwm占空比相反,故赋值占空比时使用1023-duty;

    示意图中:

    R01=R02=R03=1K。

    R、G、B通道电流wps6

    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跨行代码使用“\”。

    ----*----*----*----*----*----*----*----*----*----*----*----
    史久超 email:shijiuchao1983@163.com tel:15999550975 qq:157185173
  • 相关阅读:
    Ubuntu 16.09下iptables通过raw表实现日志输出和调试
    CentOS 6.9永久设置静态路由表以及路由表常用设置
    Linux下添加静态路由表设置网关出现SIOCADDRT: Network is unreachable的问题分析
    Linux下使用ISC DHCP可以实现动态推送静态路由表
    Linux下使用ping出现destination is unreachable的问题可能性
    树莓派(Debian)系统开启iptables的raw表实现日志输出
    MySQL时间戳与日期互转
    树莓派(Debian)系统设置了静态IP之后还会获取动态IP的问题解决(scope global secondary eth0)
    Linux下同一网段内的IP中两台主机通信不经过路由器(ARP)(转)
    OpenWrt包管理软件opkg的使用(极路由)
  • 原文地址:https://www.cnblogs.com/horal/p/15549385.html
Copyright © 2020-2023  润新知