简介:覆盆子Pi光谱分析仪与RGB发光二极管带和Python
我能够让它做2048pt的fft和实时解码mp3,虽然这对Pi来说应该不难,因为已经有很多8bit的uc来做实时fft,所有的事情都是用Python完成的,这使得它方便(对我来说)最终通过web浏览器、sms和其他东西添加控件。不过,没有多少空余的空间,当我移动鼠标时,它会窒息。
大部分的代码已经可以使用了,我的目标是从第一次使用Pi的用户的角度,粗略地记录实现这个功能的步骤。我还对FFT分析块做了一些调整,以加快速度。
硬件:(谢谢你的玩具Adafruit!)
- 拉斯皮——我想我的喘不过气来了,拉斯比安,3.10.19版
- 15英尺(1米)RGB LED灯带125美元(约160个LED)通过SPI控制,内置PWM控制,你只需发送更新-非常好。我只是用一个条带绕成5列,然后写到条带的不同部分。这样我就有三条线连接到Pi:地,SPI时钟和SPI数据。
- 驱动LED的10A 5V电源,25美元,你可能也可以用它来推动pi。
- 这些是最基本的,但是你可能会想要一些其他的东西:
- USB WiFi适配器7.61美元(RTL8188CUS芯片组驱动程序内置于Wheezy OS!)。我用过这些说明让它工作。
- SD卡(我有一个8GB)
- USB电力扬声器10美元
- 电源USB集线器插入键盘,鼠标,WiFi,
- 一些手机充电器通过它的USB电源接口为Pi供电
- 以太网电缆通过笔记本电脑预wifi连接到互联网
- USB键盘、鼠标、HDMI显示器
- 电线,一些内螺纹到内螺纹跨接导线
- 我只是用了这个很棒的基于Pi的xmas灯控制器代码来自克里斯·伊迪,托德吉尔斯和瑞安詹宁斯。它是一个完整的指挥中心,用于向音频(WAV,MP3等)进行编排Xmas灯。他们的代码可让您根据频段设置播放列表并打开和关闭120VAC电源。您甚至可以通过SMS消息对歌曲进行投票!它们的代码在音乐中查看频段,如果声音交叉阈值,则会打开GPIO引脚。我更改了代码以在RGB LED条带上显示实际频带级别,而不是仅具有开/关阈值。基于代码中的相似之处,我怀疑他们从中获得了他们的FFT处理代码python实时FFT演示.
- LPD8806 RGB发光二极管带的Python控制通过SPI。
- 这与此项目无关,但我使用了基尼编码的IDE。
第1步:连接LED条带和设置RGB LED软件
一个好的将RGB LED条带连接到Raspi的图表可以在adafruit的网站上找到。
将5V,地,时钟和数据线焊接到LED条带的输入端,连接到PI,如链接或我的照片中所示。一定要将5V电源的地面连接到PI的地面!
抓住那个软件并按照说明使Pi能够输出到SPI。使用硬件SPI是很重要的,因为任何比特碰撞方法都不够快。
我在Bashrc中添加了将目录添加到我的PythonPath,所以我可以从任何地方调用函数。
内部。bashrc:
export PYTHONPATH=$PYTHONPATH:/home/pi/RPi-LPD8806-master
通过运行示例代码来测试条带是否工作:
python example.py.py.
我们稍后将下载的xmas-light代码希望以root运行,当您使用前面的sudo运行时,环境变量,特别是PYTHONPATH不会被传输。
我必须通过打字编辑/ etc / sudoers
sudo misudo.
然后在底部添加
默认值env\u keep=SYNCHRONIZED\u LIGHTS\u HOME
默认值env\u keep+=PYTHONPATH
第一行是我们稍后需要安装的XMA灯具包的东西。当您将其运行为sudo时,这些环境变量确保这些环境变量粘在一起。
要测试是否设置正确,请关闭终端并重新打开,然后键入
sudo python.
从引导导入*
LED。填充(颜色(50,50,50),0,10)
LED.Update()
应该打开前10个LED。
最后一步是做出一些修改以加速写入条带。
INSION LEDSTRIP.PY,在DEF __init__行中确保使用_py_spi = true
定义初始化(self,发光二极管,使用spi)= 真的 ,dev =“/ dev / spidev0.0”,驱动程序=“LPD8806”):
现在在LPD8806.py内,我们将要将SPI速度改为16MHz
如果self.use_py_spi:
self.spi = spidev.spidev()
self.sf.spi.max_speed_hz = 16000000.
打印“py spidev MHz:%d%”(self.spi.max\u speed\u hz/1000000.0)
打印语句只是为了确保所有设置都正确。
LPD8806.py文件的最终变更是更新()函数。无论出于什么原因,我注意到LED.Update()正在服用长的时间,upword为25ms。为了获得良好的视觉效果,我希望我的整个分析和显示循环运行到20Hz,或每循环50毫秒,并刻出半个时间等待LED条带不起作用。奇怪地,在16MHz,它应该少于一个ms。每个LED,152个LED,(3 * 152 * 8位/ 16m)= .2ms!(不是25ms)当我将范围达到SPI端口时,每个字节都在16MHz出来,但每个字节都会在每个调用self.spi.xfer2()后有一个160us暂停。我的解决方案是将整个字节字节收集到缓冲区中,只能调用self.spi.xfer2():
def更新(self,buffer):
如果self.use_py_spi:
对于范围(self.leds)的x:
温度缓冲区=温度缓冲区+ [我在缓冲区[x]]
#self.spi.xfer2([i代表缓冲区中的i[x]])
self.spi.xfer2文件(温度缓冲区)
self.spi.xfer2([0x00,0x00,0x00])#零填充最后一个,以防止结尾出现杂色
self.sf.spi.xfer2([0x00])#Once更多的感觉 - 这有帮助:) time2 = time.time()
在16MHz时写出152个LED应该不应该暂时 - 你应该在第一个的同时看到最后一个LED变化
其他人有挣扎有了这个并绕过它,用单个垂直LED条带查看惊人的POV视频效果(在8MHz通过猫5到20英尺的猫5!):
第2步:安装LightShow PI并配置环境变量和声音
现在我们已经快速写入LED条带,并且可以从任何地方从root运行的Python播放,是时候安装了奇妙的圣诞节了灯编排软件,并更新它以控制LED条。
下载后代码来自Bitbucket,按照说明安装安装。
在运行sudo之前./install.sh,您应该编辑文件并更改install_dir。然后运行
sudo./install.sh文件
我遗憾地遇到了各种各样的问题。安装了大多数软件(需要一段时间),但我必须手动设置环境的东西。BASH脚本的末尾将安装dir install到/ etc /环境添加。我也将它添加到我的.bashrc之后:
导出同步的\u灯光\u HOME=“/HOME/pi/xmas2”
导出pythonpath = $ pythonpath:/ home / pi / rpi-lpd8806-master
第二行是LED灯。脚本试图将path变量添加到/etc/environment,但我不得不将其添加到.bashrc。我真的不太了解linux,所以你应该访问谷歌+社区询问安装帮助。确保sudoers也有这条线,以确保当您将事物运行为sudo时,确保环境变量粘在周围。
默认值env\u keep=SYNCHRONIZED\u LIGHTS\u HOME
第一步,试着运行一首歌,看看代码是否抛出任何错误:
sudo py / synchronizer_lights.py --file / home/pi/some_random_music_file.mp3
听不到任何声音?我不得不将我的音频从默认的HDMI换掉到板载1/8“杰克:
Amixer cset numid = 3 1
我也不得不上升卷
Amixer设置PCM 1
第3步:编辑默认值和运行自定义同步_lights_led_strip.py
我对/config/defaults.cfg做了以下更改:
gpio_引脚=7,0,1,2,3
我只有5列,所以我只是将输出列表截断为5个数字。
如果要使用播放列表,请更改PlayList_Path
我也改变了以下内容
min_frequency = 50.
max_frequency = 150000.
注释出custom_channel_frequencies。我只是想均匀地分开min和max频率。
最后,运行自定义脚本:
sudo py / synchronizer_lights.py --file / home/pi/some_random_music_file.mp3
用于调试,考虑添加-v 2 --readcache 0
我能够解码MP3并在歌曲开始时只有几个故障的同时播放它们。基本代码有一个功能,它将所有级别写入缓存文件,因此当它再次播放歌曲时它不必运行FFT。ReadCache 0如果您不想删除它每次生成的.gz缓存,请关闭此操作。
--------------------
我对原来的改变中的一些亮点
--------------------
主要变化包括剥离GPIO代码并用代码替换它来将级别发送到RGB LED条带。更好的方法是要修改硬件_controller.py文件,但无论需要对原始的一些更改,因为我不再使用ON / OFF信号了。
我花了大部分时间来优化calculate_levels()函数的速度。我发现那条线
data = np.array(数据,dtype ='h')
,它只是从Python数组创建Numpy数组,拍摄了10ms,这与所有FFT处理一样多!通过将其替换为直接加载二进制内存阵列的函数来大大加速这一点:
np.flbuffer(数据......
当我用纯正弦波进行测试时,我其余的更改才真正影响到事情(见附件测试文件)。对原始代码的动态调整使得它工作得很好,尽管有下面的内容。太好了!
由于音频是立体声,因此我抛出了偶数,因为那些表示右声道。原始代码正在分析立体声信号,就像它是单声道一样,这可能为最低频带添加了一点能量。
数据[:]=数据_立体声[::2]
FFT也在非窗口的音频块上运行。当您在歌曲中间雕刻的块的块上运行FFT时,那么它的边缘就会看起来像陡峭的液滴到FFT算法。这在所有乐队中增加了一堆能量。解决方案是逐渐减少每个块,或“窗口”。您可以在窗口屏幕之前和之后看到附加到此页面的图片。
窗口= np.hanning(len(数据))
数据=数据*窗口
最后,当声音的力量增加10倍时,我们听到了一倍,所以我总结每个频带中的所有箱,并采取那些LOG10,因此当我们听到声音双倍时,LED反弹两倍。
要出现测试,请尝试运行附加的声音文件。粉红色噪声文件应报告每个频带相同的总功率。这很有意思,因为第一个乐队中只有5个左右的箱子,而且最后一个乐队,但如果你加起来所有的能量,它们应该是相同的,尽管箱数有差异。粉红色的噪音听起来像整个频谱的响度都是相同的响度。粉红色的噪声扫描文件具有带通滤波器的扫描滤波器从低到高,您可以在视频中看到此演示。
6讨论
3年前
是否有可能与WS2812BS执行此操作?
3年前
我可以使用任何类型的python吗?
4年前
好的!我正在考虑用它用作家居装饰,也许在磨砂玻璃后面。你能用麦克风响应外部声音吗?或许将立体声输出接线到它?
5年前
有没有办法可以将输出反转到LED,以便它们被反转...... kike
https://www.youtube.com/watch?v=ozyq-g3klvu.
5年前
很好,谢谢,把这个和猪一起吃会很酷的
6年前介绍
嗨斯科特,
谢谢你提供一个指导。
是否可以使用您的代码来驱动WS2801 LED?
它们可以单独寻址,就像您使用的LPD8806条带一样。