一、所选任务介绍
本次开发任务为 “声音音量条显示”,是基于树莓派 RP2040 嵌入式系统学习平台的综合性嵌入式开发任务,核心目标是实现音频信号的实时采集、处理与可视化展示,并结合人机交互、传感器感知等功能完成多维度的系统控制。
任务核心要求可拆解为四大模块:
- 音频信号处理:通过 ADC(模数转换器)对音频信号进行采样,首先完成直流分量去除,再通过计算短时均方根(RMS)或包络值作为音量量化指标,确保音量值的精准性;
- 可视化与人机交互:在 LCD 显示屏上实时渲染音量条,并实现峰值保持效果,同时支持通过按键切换不同的显示主题(如色彩、音量条样式等);
- 参数调节与数据存储 / 上报:利用摇杆组件调节音频信号的增益(放大 / 缩小音量值)或音量条的刷新率,可选实现最大音量值的板载 Flash 存储或 USB 串口上报功能;
- 智能感知与自动控制:通过姿态传感器检测设备是否处于静止状态,当静止时长达到 1 秒后,自动更新噪声基准值(用于优化音量检测的准确性),或一键归零已保持的音量峰值。
该任务覆盖了嵌入式系统中模拟信号采集、数字信号处理、外设驱动、人机交互、传感器应用、数据存储 / 通信等核心知识点,是对 RP2040 平台开发能力的综合验证。
二、项目介绍
本项目以树莓派 RP2040 微控制器为核心,搭建了一套集音频采集、处理、可视化、交互控制于一体的声音音量条显示系统。系统通过麦克风模块将声音信号转换为模拟电信号,经 RP2040 的 ADC 外设完成采样后,在芯片内部进行直流去除、短时 RMS 计算等数字信号处理,得到实时音量值;随后通过 LCD 屏以音量条形式可视化展示音量变化,并实现峰值保持效果;用户可通过按键切换显示主题,通过摇杆调节音频增益或显示刷新率;姿态传感器实时检测设备状态,在设备静止后自动更新噪声基准,确保音量检测的准确性;同时通过 USB 串口上报至电脑端。
项目整体遵循模块化设计原则,将硬件驱动、信号处理、人机交互、通信等功能解耦,既保证了系统的稳定性与可维护性,也便于后续功能扩展。最终实现的系统可实时、直观地展示环境声音音量变化,具备灵活的交互控制能力和智能的环境自适应能力,可作为嵌入式系统学习中 “模拟信号采集与数字信号处理” 的典型教学案例。
三、使用到的硬件介绍
1. 核心控制模块:树莓派 RP2040 开发板
RP2040 是树莓派基金会推出的首款微控制器芯片,采用双核 ARM Cortex-M0 + 架构,主频最高 133MHz,内置 264KB SRAM、2MB 板载 Flash,支持 30 个 GPIO 口、2 个 SPI、2 个 I2C、2 个 UART、4 个 12 位 ADC(采样率最高 500kSPS),同时支持 USB 1.1 Host/Device、低功耗模式等特性。本项目中 RP2040 作为核心,负责音频 ADC 采样、信号处理、外设驱动(LCD、按键、摇杆、姿态传感器)、数据存储及串口通信等全部核心逻辑。
2. 音频采集模块:驻极体麦克风模块
采用带放大电路的驻极体麦克风模块,可将声音信号转换为 0-3.3V 的模拟电压信号(匹配 RP2040 的 ADC 输入范围),输出的模拟信号直接接入 RP2040 的 ADC 引脚,为音量检测提供原始信号源。
3. 显示模块: SPI 接口 LCD 屏(240×240 分辨率)
采用 ST7789 驱动芯片的 SPI 接口 LCD 屏,具备体积小、功耗低、通信速率快的特点,通过 SPI 总线与 RP2040 通信,负责实时显示音量条、峰值标记、显示主题等内容,是系统的可视化输出核心。
4. 人机交互模块
- 按键:轻触按键,接入 RP2040 的 GPIO 口(配置为上拉输入),用于切换 LCD 显示主题;
- 摇杆模块(PS2 摇杆):包含 X 轴、Y 轴两个模拟输出(接 ADC)。
5. 姿态传感器模块:MMA7660
通过 I2C 总线与 RP2040 通信,可实时输出设备的加速度和角速度数据,系统通过分析加速度数据的变化量判断设备是否处于静止状态。
6. 通信模块
USB 串口:RP2040 内置 USB 串口功能,通过 USB 线与电脑连接,可将实时音量值、最大音量值等数据上报至电脑端串口助手。
7. 电源模块
采用 5V USB 供电,通过板载稳压电路转换为 3.3V,为 RP2040、LCD 屏、麦克风、传感器等所有外设供电,保证系统供电稳定。
四、方案框图和项目设计思路介绍
1. 方案框图

2. 项目设计思路
(1)信号采集与处理层
- ADC 采样:配置 RP2040 的 ADC 通道,以 10kHz 采样率采集麦克风输出的模拟音频信号,保证采样率满足音频信号(20Hz-20kHz)的 Nyquist 采样定理;
- 直流去除:音频信号经麦克风放大后会叠加直流偏置,通过计算采样数据的滑动平均值作为直流分量,用原始采样值减去该平均值,实现直流去除,保留纯交流音频信号;
- 短时 RMS 计算:将去除直流后的采样数据计算每个窗口内数据的均方根(RMS),作为实时音量量化指标;
(2)人机交互层
- 按键处理:每次按键触发后切换 LCD 显示颜色;
- 摇杆调节:通过 ADC 采集摇杆 X 轴的模拟值(0-4095),调整音量计算的增益系数;
- 峰值保持:记录音量值的最大值,在 LCD 上用特殊颜色标记峰值位置,或通过按键归零。
(3)可视化层
- 基于 ST7789 驱动库,实现 LCD 屏的初始化、清屏、画点、画线等基础绘图功能;
- 将实时音量值映射为 LCD 屏上的竖条高度,实时刷新音量条;
- 音量条颜色可切换。
(4)数据通信层
- USB 串口通信:配置 RP2040 的 USB CDC 串口功能,将最大音量值按固定格式上报至电脑端。
(5)姿态感知层
- 通过 I2C 总线初始化 MMA7660,实时读取加速度数据(X/Y/Z 轴);
- 计算连续加速度数据,小于预设阈值,判定为静止。
五、调试软件及编程语言、关键代码介绍
1. 调试软件及编程语言
- 编程语言:Python;
- 开发 / 调试环境:Thonny
2. 关键代码介绍
声音信号处理
def get_rms_volume(x):
# 1. 快速采样填充缓冲区
last_sample = 2048
sum_squares = 0
# 采样循环
for i in range(window_size):
# read_u16 返回 0-65535, 右移 4 位变为 0-4095
raw_val = adc.read_u16() >> 4
audio_buffer[i] = raw_val
# 2. 直流去除 并 计算平方和
dc_estimate = 2048.0
for i in range(window_size):
current_sample = audio_buffer[i]
# 更新直流估计值
dc_estimate = (HPF_ALPHA * dc_estimate) + ((1.0 - HPF_ALPHA) * current_sample)
# 去除直流
ac_signal = current_sample - dc_estimate
# 累加平方
sum_squares += ac_signal * ac_signal
# 3. 计算 RMS
if window_size == 0:
return 0.0
mean_square = sum_squares / window_size
rms = math.sqrt(mean_square)
# 4. 归一化
normalized_volume = rms / x #1448.0
if normalized_volume > 1.0:
normalized_volume = 1.0
return normalized_volume
三轴数据处理
def read_acceleration():
# 读取三轴原始数据
data = i2c.readfrom_mem(MMA7660_ADDR, MMA7660_XOUT, 3)
# 转换为有符号值(处理MMA7660的6位数据格式)
x = data[0] & 0x3F # 只保留低6位有效数据
y = data[1] & 0x3F
z = data[2] & 0x3F
# 转换为有符号数(-32 ~ +31)
x = x if x < 0x20 else x - 0x40
y = y if y < 0x20 else y - 0x40
z = z if z < 0x20 else z - 0x40
# 转换为实际加速度值(1LSB = 1.5g / 32 = 0.046875g)
x_accel = x * 0.046875 * GRAVITY
y_accel = y * 0.046875 * GRAVITY
z_accel = z * 0.046875 * GRAVITY
return x_accel, y_accel, z_accel
def calculate_magnitude(x, y, z):
"""计算合加速度的模长"""
return math.sqrt(x**2 + y**2 + z**2)
def is_static():
"""优化后的静止判断逻辑:双条件判断"""
magnitudes = []
# 采集多次合加速度数据
for _ in range(SAMPLING_COUNT):
x, y, z = read_acceleration()
mag = calculate_magnitude(x, y, z)
magnitudes.append(mag)
time.sleep(0.01) # 10ms间隔,匹配64Hz采样率
# 计算关键指标
avg_mag = sum(magnitudes) / len(magnitudes) # 合加速度平均值
variance = sum([(m - avg_mag)**2 for m in magnitudes]) / len(magnitudes)
std_dev = math.sqrt(variance) # 标准差(波动程度)
# 双条件判断静止:
# 1. 合加速度平均值接近重力加速度(静止时合加速度≈9.81m/s²)
# 2. 标准差小于阈值(波动小)
is_baseline = abs(avg_mag - GRAVITY) < BASELINE_TOLERANCE
is_stable = std_dev < STATIC_THRESHOLD
return is_baseline and is_stable
六、实物展示图及说明

上图为实物展示图,图中通过USB给RP2040开发供电,用杜邦线连接麦克风模块,采集到的音量显示在LCD上。

上图为开发板上报信息,包括了采集到的最大音量,以及开发板处于静止还是运动状态。
七、项目中遇到的难题及解决方法
- ADC 采样音频信号无法得到有效数据,用示波器定位问题,麦克风模块是好的。问题出现在程序编写,采样频率太低了,针对20Hz~20KHz的音频信号,需要提高采样频率才能采集到有用的信息。
- 运动和静止的判断阈值判断,通过串口将信息上传,然后统计临界值进行校正,去除噪声干扰。
八、心得体会
本项目以 RP2040 为核心,学习了音频 ADC 的基础知识,掌握了采样、直流去除、短时 RMS 计算。学习了姿态感知的基础知识,学会了静止和运动状态的判断。还学习了LCD显示的实现。