龙空技术网

「树莓派」 玩转全彩WS2812 RGB灯(Python)

电子芯吧客 330

前言:

当前我们对“树莓派驱动ws2812”大概比较注重,我们都想要了解一些“树莓派驱动ws2812”的相关知识。那么小编在网摘上汇集了一些对于“树莓派驱动ws2812””的相关文章,希望同学们能喜欢,兄弟们快快来了解一下吧!

RGB灯介绍

WS2812 是集控制电路和发光电路于一体的智能外控LED光源,其外型与一个5050的LED灯珠相同,每个灯珠即为一个像素点。每个像素点的RGB三基色可实现256级亮度显示,可产生16777216种色彩,扫描频率不低于400Hz/s,串行级联接口,只需一根信号线完成数据接收和解码。当刷新率30帧/秒时,级联数不小于1024个,数据发送速率可达800Kbps,产生的光颜色高度一致,性价比较高。

WS2812引脚示意图

引脚编号 引脚名称 说明 1 DO 控制数据信号输出端 2 DI 控制数据信号输入端 3 VCC 控制电路电源正极 4 NC 空脚 5 VDD LED电源正极 6 VSS 电源负极

数据时序图

0,1码的高低电平时间:

T0H 0 码, 高电平时间 0.35us ±150ns T0L 0 码, 低电平时间 0.8us ±150ns T1H 1 码, 高电平时间 0.7us ±150ns T1L 1 码, 低电平时间 0.6us ±150ns RES 低电平时间 约 50us -

TH+TL=1.25μs±600ns

时序图:

数据传输方式:

其中 D1 为 MCU 端发送的数据, D2 、 D3 、 D4 为级联电路自动整形转发的数据。

24bit数据的构成:

这是按照GRB顺序发送数据。

安装RGB LED相关库

先安装相关库。

sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixelsudo python3 -m pip install --force-reinstall adafruit-blinka
CircuitPython不支持python2.x版本。

RGB LED和树莓派连接方式:

RGB LED 树莓派 VCC +5V GND GND DI D18 (GPIO1)

只有树莓派的 D10, D12, D18 或 D21引脚才能驱动WS2812 RGB灯。示例1:点亮RGB

实现点亮一个RGB灯。

#!/usr/bin/env python# coding=utf-8import timeimport boardimport neopixel# 定义RGB控制引脚,必须选择 D10, D12, D18 或者 D21pixel_pin = board.D18# 串联RGB灯珠的数量,这里只点亮第一个num_pixels = 1# 定义RGB数据顺序:RGB 或者 GRBCOLOR_ORDER = neopixel.GRBpixels = neopixel.NeoPixel(    pixel_pin, num_pixels, brightness=0.3, auto_write=False, pixel_order=COLOR_ORDER)# 点亮第一个RGB灯,显示红色pixels.fill((255, 0, 0))pixels.show()
程序必须用python3以root身份执行。

效果图:

示例2:RGB动态显示

实现一个红、绿、蓝、彩虹循环的示例程序。

#!/usr/bin/env python# coding=utf-8import timeimport boardimport neopixel# 定义RGB控制引脚,必须选择 D10, D12, D18 或者 D21pixel_pin = board.D18# 串联RGB灯珠的数量num_pixels = 3# 定义RGB数据顺序:RGB 或者 GRBCOLOR_ORDER = neopixel.GRBpixels = neopixel.NeoPixel(    pixel_pin, num_pixels, brightness=0.3, auto_write=False, pixel_order=COLOR_ORDER)def wheel(pos):    if pos < 0 or pos > 255:        r = g = b = 0    elif pos < 85:        r = int(pos * 3)        g = int(255 - pos * 3)        b = 0    elif pos < 170:        pos -= 85        r = int(255 - pos * 3)        g = 0        b = int(pos * 3)    else:        pos -= 170        r = 0        g = int(pos * 3)        b = int(255 - pos * 3)    return (r, g, b) if COLOR_ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0)def rainbow(wait):    for j in range(255):        for i in range(num_pixels):            pixel_index = (i * 256 // num_pixels) + j            pixels[i] = wheel(pixel_index & 255)        pixels.show()        time.sleep(wait)while True:    pixels.fill((255, 0, 0)) # 红    pixels.show()    time.sl<ickey>eep(1)    pixels.fill((0, 255, 0)) # 绿    pixels.show()    time.sl<ickey>eep(1)    pixels.fill((0, 0, 255)) # 蓝    pixels.show()    time.sl<ickey>eep(1)    rainbow(0.01)  # 彩虹
程序必须用python3以root身份执行。

效果图:

附:neopixel库的官方文档:Adafruit CircuitPython NeoPixel Library

标签: #树莓派驱动ws2812