RGB LED条带和Python的覆盆子PI谱分析仪

简介:覆盆子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软件

而不是处理每列的单独的LED条,我刚刚循环一个152个LED条带,并将其固定到婴儿门。这浪费了一些LED,因为我没有在转弯上显示任何东西,但是你可以通过切割柱子之间的焊条和焊接线来避免LED浪费。

一个好的将RGB LED条带连接到Raspi的图表可以在adafruit的网站上找到。

将5V,地,时钟和数据线焊接到LED条带的输入端,连接到PI,如链接或我的照片中所示。一定要将5V电源的地面连接到PI的地面!

抓住那个软件并按照说明使Pi能够输出到SPI。使用硬件SPI是很重要的,因为任何比特碰撞方法都不够快。

sudo raspi配置
要启用硬件SPI(请按照git页面上的说明进行操作)。

我在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.spi.open(0,0)
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讨论

    0
    raco35型

    3年前

    是否有可能与WS2812BS执行此操作?

    0
    Francis Nguyen.

    3年前

    我可以使用任何类型的python吗?

    0
    出租车

    4年前

    好的!我正在考虑用它用作家居装饰,也许在磨砂玻璃后面。你能用麦克风响应外部声音吗?或许将立体声输出接线到它?

    0
    Josiahs4.

    5年前

    有没有办法可以将输出反转到LED,以便它们被反转...... kike

    https://www.youtube.com/watch?v=ozyq-g3klvu.

    0
    阿尔诺

    5年前

    很好,谢谢,把这个和猪一起吃会很酷的

    嗨斯科特,

    谢谢你提供一个指导。

    是否可以使用您的代码来驱动WS2801 LED?

    它们可以单独寻址,就像您使用的LPD8806条带一样。