基于Python和树莓Pi的LED条带矩阵FFT

2024-09-30 08:15:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我被Python和LED灯条卡住了。带有WS2801芯片并可通过SPI寻址的LED条被布置成如下矩阵:

     ----      ----      ----      ----
140 |    |    |    |    |    |    |    | 15
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
155 |    |    |    |    |    |    |    | 0
          ----      ----      ----

每个破折号代表一个LED(一个像素)。一列有16个像素,组成8行。在

编号从右下角开始。所以最右边的一列以索引0开始,以索引15结束。行之间的四个像素将不亮起。所以第二个最右边的列从索引20的顶部向下到索引35的底部。 最左边的一列从顶部的140到底部的155。在

我想做的是想象一首歌在演奏时的频谱。较低的频率应显示在左栏中,较高的频率应显示在右栏中。在

我的代码基于PixelPi(https://github.com/scottjgibson/PixelPi)。我省略了FFT部分,因为这部分不是问题所在。在

^{pr2}$

问题是这个代码只点亮最右边的列(0到15)。所有其他列似乎都是黑色的。在

当我将spidev.write(pixel_output)spidev.flush()放入col循环中,以便为每个列写入像素输出时,至少其他列中的一些灯亮起。然而,它们以某种方式随机出现,声音不再平滑。在

顺便说一句,LED灯带做得很好,像PixelPi的例子褪色和追逐。 这可能是因为我不知道的WS2801芯片的一些特性吗?或者我没有正确计算像素输出矩阵吗?在

更新:还有一件奇怪的事:

i = 0
x = 0
while x < 160:
    if i != 0 and i % 16 == 0:
    x = x + 4

    pixel_index = x * PIXEL_SIZE
    pixel_output[pixel_index:] = filter_pixel(WHITE, 1)

    i = i + 1
    x = x + 1

    print "i, x", i, x

    time.sleep(0.1)
    spidev.write(pixel_output)
    spidev.flush()

这实际上应该点亮像素0到最后一个,并在循环执行16次后去掉4个像素。但是,它不会遗漏一个像素,因此在到达最后一个像素之前停止。在


Tags: 代码outputindexled矩阵像素芯片write
1条回答
网友
1楼 · 发布于 2024-09-30 08:15:32

明白了!在

pixel_output[pixel_index:] = filter_pixel(WHITE, 1)

不仅复制了我预期的3个数组元素。它将filter_pixel返回的值从整个缓冲区的pixel_index复制到末尾。在

设定复制上限解决了我的问题。在

^{pr2}$

相关问题 更多 >

    热门问题