归档时间:六月, 2014

随声而动的彩灯

六 08 2014 由 创建在标签 开发

在网络上看到有人用Arduino搭建了一个音乐控制的彩色LED灯带。其使用的是PC分析输入音频的频谱,然后通过串口将分析好的频谱数据发送给Arduino,最后由Arduino控制并显示出来。

由于音频数据的处理借助于电脑,这就对显示带来局限性,所以移动性差。音频的频谱其实就是傅里叶变换,将时域分量转换成频域,DSP中也提到了快速傅里叶变换(FFT)的算法,降低了计算的次数,而且当前MCU的处理能力也在不断提高,有的MCU直接提供了FFT算法。所以就打算用MCU来做一个彩带控制器。

总体结构

其基本原理如下图所示:

音频经过放大器放大后给MCU中的AD采样,采用后的数据再经过FFT变换,转换成频域的数据,再将每个不同频率的功率转换成LED阵列显示。下面将逐个介绍每个模块的实现。

放大器

使用TI的TLV2782来放大、滤波,其原理图如下图所示。

RGB LED阵列

对于RGB LED的控制都是使用PWM来控制,初步设计时想使用8*8的LED阵列,这样要对每一个LED控制会比较麻烦,即使使用视觉残留原理,通过MCU来控制每个LED也是一个不小的运算,而且IO口的资源也不能满足这样的控制。如果让每排的LED使用同样的颜色,这样会大大减少IO的使用。就在我究竟如何设计时,万能的淘宝给我带来了好消息,有自带RGB控制器的LED。看了介绍后发现十分满足自己的需求。网上搜了一圈之后就决定使用WS2812B,其特点可以看一下Datasheet。

但是在使用高速模式时,其时间较短,所以时序要求比较严格,在调试时甚至尝试用汇编来写代码,但控制也不能十分精准,最终不得不放弃。而国外也有一些网友用了一个曲线救国的方式,使用SPI和DMA的方式来控制LED显示。将LED的显示数据进行编码后存储起来,然后通过DMA将数据通过SPI口发送出去,通过硬件来保证时序,这也是低速设备运行的局限。

也想过用速度较快的ARM,但是考虑到手头上的ARM没有提供较好的接口,想要使用硬件控制时序的方式也不是件容易的事情,毕竟汇编代码和阻塞的处理对时间要求较高的场景不是一个很好的选择。如果要有更好的表现和更多的LED控制,可以考虑使用FPGA来控制WS2812B的时序。但是经过试验,MCU的SPI已经够用了,就没有去深究如何通过FPGA去控制LED。有兴趣的时候也可以研究一下。

MCU

MCU主要做三件事:采样,FFT计算,显示各个频率的功率。以前玩过一段时间的430,所以在选型的时候也就选了一款熟悉的产品MSP430F5438。

采样:使用Timer来控制采样频率(奈奎斯特定理),通过DMA来保存采样的数据。

FFT:TI一款EVB板的参考代码中有用汇编写的FFT运算,但是其采样点比较多,当前只使用了8*8的LED阵列,为了减少运算,直接使用8点的FFT运算,放弃了TI原有的FFT。

显示:在RGB LED阵列中已经结束如何实现。

电源

使用开关电源将220V转换成5V,然后通过TPS7301来给MCU和运放提供3.3V的电压。同时也用5V为LED阵列供电。LED阵列同时显示白光的时候电流比较大,为了保证安全和稳定,使用开关电源,不过这也有点奢侈。64个LED用1A的手机充电器其实也能够满足。

参考文章

1. FFT

2. WS2812b RGB-LED controlled with an MSP430

无评论