我有带三线连接的 SPI RGB LED 灯条:
– TX1818 驱动程序(制造商称“它与 TM1812、UCS1903、SM16703、WS2811–2815 兼容”)
– 12V,9.3 W/m,5060,60/米
– 3600 像素,60 条线,每条 1 米长,60 像素
– 每 4 条线连接到电源,每个电源 20 条线
– 部分中的每条线路并联连接到电源
– 所有线路都有公共地并通过公共数据线连接
– 控制器和矩阵之间的数据线长度约为2米
数据线和公共地连接到 RPi 4b (21 GPIO)。 RPi 板上有 Raspberry Pi 操作系统,所有软件都是最新的。
问题: show() 方法需要大约 0.2 秒以上的时间来执行(使用 adafruit- Circuitpython-neopixel 和 rpi_ws281x python 库,在更新矩阵值后调用)
import numpy as np
from PIL import Image, ImageSequence
import time
import board
import neopixel
PIN = board.D21
NUM_PIXELS = 3600
MATRIX_SIZE = 60
ORDER = neopixel.RGB
pixels = neopixel.NeoPixel(
PIN, NUM_PIXELS, auto_write=False, pixel_order=ORDER
)
# USING rpi_ws281x
# from rpi_ws281x import *
# LED_FREQ_HZ = 800000
# LED_DMA = 10
# LED_BRIGHTNESS = 100
# LED_INVERT = False
# LED_CHANNEL = 0
# LED_STRIP = ws.WS2811_STRIP_GRB
# pixels = Adafruit_NeoPixel(NUM_PIXELS, PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP)
# pixels.begin()
def readImage(path = ‘./some.gif’):
return np.array([np.array(frame.copy().convert('RGB').getdata(),dtype=np.uint8).reshape(frame.size[0] * frame.size[1],3) for frame in ImageSequence.Iterator(Image.open(path))])
image = readImage()
def printFrame(pixels, frame):
for rowIdx in range(NUM_PIXELS):
pixels[rowIdx] = frame[rowIdx]
def animate(pixels, frames):
for frame in frames:
start = time.time()
printFrame(pixels, frame)
pixels.show()
print(time.time() - start) # 0.3+ for adafruit-circuitpython-neopixel
# 0.2+ for rpi_ws281x
time.sleep(1/60)
while True:
animate(pixels, image)
我也有 Arduino Mega Rev3,但内存不够 3600 像素。
我考虑过将矩阵分成三部分 60x20(1200 像素),每个部分连接到单独的 SPI GPIO,但找不到可以将多个通道作为一个整体处理的库。
也许我缺少什么?一些隐藏的设置?或者对于 RPi 来说,应该在这种情况下使用一些扩展,比如帽子?
WS2812B(以及可能兼容的 TX1818)LED 灯带使用基频为 800kHz 的协议。
所以如果我们计算一下:
800kHz ÷ 每个颜色 8 位 ÷ 每个像素 3 种颜色 ÷ 3600 像素 = 9.3 帧/秒。
所以这是最优化的情况,每秒可以显示9.3帧。因此,如果
pixels.show()
得到完美优化,则需要 0.1 秒(1 帧 / 9.3 帧/秒)。
如果你想达到每秒30甚至60次更新,你确实需要拆分它。