我被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个像素。但是,它不会遗漏一个像素,因此在到达最后一个像素之前停止。在
明白了!在
不仅复制了我预期的3个数组元素。它将filter_pixel返回的值从整个缓冲区的pixel_index复制到末尾。在
设定复制上限解决了我的问题。在
^{pr2}$相关问题 更多 >
编程相关推荐