任务介绍和项目介绍
以前没有接触过使用MicroPython语言进行开发,故在在众多项目中,选择了RP2040系统板和麦克风模块,结合MicroPython进行音频处理和实时显示这一项目。
这一项目主要任务就是通过麦克风模块的输出进行AD采集、信号处理您使用显示屏显示实时显示音量,配合其他的外设来控制显示的刷新率主题以及一键归零。
硬件介绍
1. RP2040 系统板
RP2040是Raspberry Pi推出的一款低功耗微控制器,具有双核ARM Cortex-M0+处理器,支持丰富的I/O接口。外接12MHZ晶振提供时钟,以及一个复位按键组成。
2. 麦克风模块
使用的麦克风模块为电容式麦克风,麦克风输出通过电容去除直流成分并通过运放将其信号进行放大,从而提供高灵敏度的音频信号输出。通过ADC接口,主控可以将模拟音频信号转换为数字信号。
3. LCD 显示屏
LCD显示屏分辨率为240*240,控制芯片采用ST7789使用SPI接口进行控制显示内容,用于实时显示音量条和峰值信息。
4. 姿态传感器
姿态传感器使用MMA7660FFC来对板卡的运动状态进行反馈,用于判断设备的静止状态,能够监测加速度和角速度。该芯片采用IIC协议进行通信。
5. 摇杆模块
摇杆模块采用两路ADC采集(X,Y两路可看成坐标)来代表摇杆的位置。根据摇杆不同的位置调节数据刷新率,提供直观的用户交互方式。
6.按键
按键另一端连接GND,在按下时会将信号拉低,用来控制显示音量的主题和划线的颜色
方案框图和项目设计
设计思路介绍:首先在使用串口调试显示出麦克风输出的电压值,并对采集到的数据进行简单的滤波。第二步将采集到的数据使用LCD显示屏进行显示,完成任务中的显示实时显示音量,再将采集到的数据画成波形以及将采集到的最大值进行保持显示,最后使用按键控制切换主题和显示的颜色并使用摇杆来控制刷新率。

软件介绍
PR2040是树莓派推出的微控制器,使用ARM M0+内核,支持MicroPython和C++/C两种语言来进行开发,我选择了官方推荐的MicroPython,初步接触到了MicroPython的简单语法和类的概念
1. 麦克风模块
将麦克风模块连接完成后,利用RP2040的ADC接口采集音频信号后进行直流去除和短时RMS计算,并将采集到的数值进行量化基础代码如下:
volume_ADC= ADC(Pin(26)) #选择ADC0来作为麦克风的数据采集,引脚编号26
raw_value = self.adc.read_u16() >> 4 #读取AD采集的值
#中间进行数据处理包括去除直流分量以及滤波算法
quantized = self._linear_quantize(normalized_volume) #将采集数据进行量化
以上的代码执行完后就可以进行应用显示音量的大小了
2. LCD 显示屏
应用显示屏,初始化SPI接口,使用官方的软件库即可,代码如下:
#初始化SPI接口
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
#应用官方库的ST7789类中的显示函数即可
3、摇杆应用和麦克风模块的应用大部分是一样的,不在赘述
4、按键驱动
首先因未在连接主控另一端的地方没有上拉电阻,所以要将IO配置上拉输入模式,在开始时仅在while中读取状态,会出现按下无反应的情况,固改用外部中断方式来进行检测,以下是基础代码:
self.pin6 = machine.Pin(pin6, machine.Pin.IN, machine.Pin.PULL_UP) #初始化按键A为上拉输入模式
self.pin6.irq(trigger=machine.Pin.IRQ_FALLING, handler=self._handle_pin6) #开启按键的中断触发,并指定中断服务函数
#编写函数名为:_handle_pin6的中断服务函数
软件流程图:

功能展示图及说明
简单说明如下:
设置有三个模式:
①实时音量显示模式:

②峰值保持模式:

③波形模式:

按键B按下可三个模式循环切换,按下按键A即可切换当前显示的颜色,在模式②时静止1s就会波峰归零,在模式③上下拉动摇杆可以改变刷新率
具体功能演示见B站。
心得体会
无意中发现了电子森林这么一个宝藏平台,这也是我参加的第一个活动,也是首次使用树莓派和MicorPython语言实现了一个简单的小任务,接触到了一些新奇的语言和平台,收获颇丰