使用 RPi 制作 3600 个 Neopixel 动画很慢

问题描述 投票:0回答:1

我有带三线连接的 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 来说,应该在这种情况下使用一些扩展,比如帽子?

raspberry-pi spi led adafruit neopixel
1个回答
0
投票

WS2812B(以及可能兼容的 TX1818)LED 灯带使用基频为 800kHz 的协议。

所以如果我们计算一下:

800kHz ÷ 每个颜色 8 位 ÷ 每个像素 3 种颜色 ÷ 3600 像素 = 9.3 帧/秒。

所以这是最优化的情况,每秒可以显示9.3帧。因此,如果

pixels.show()
得到完美优化,则需要 0.1 秒(1 帧 / 9.3 帧/秒)。

如果你想达到每秒30甚至60次更新,你确实需要拆分它。

© www.soinside.com 2019 - 2024. All rights reserved.