基于RP2350B实现的音乐播放器
该项目使用了CircuitPython,实现了基于RP2350B实现的音乐播放器的设计,它的主要功能为:播放三首不同乐曲,按键切换功能,暂停锁定,音量调节。
标签
嵌入式系统
开发板
硬禾学堂
音乐播放器
RP2350B
Ggbooo
更新2025-07-11
浙江师范大学
12

RP2350B 核心板蜂鸣器音乐播放系统项目总结报告

一、项目介绍

本项目基于RP2350B 核心板,通过 PWM(脉冲宽度调制)技术实现不同音调的生成,并驱动板载蜂鸣器输出音乐。项目实现了三首经典曲目的播放功能,包括《两只老虎》《小星星》和《生日快乐歌》,用户可通过核心板上的按键进行曲目切换、音量调节、播放控制以及系统锁定 / 解锁操作。同时,通过 OLED 显示屏实时显示当前播放曲目的汉字名称,提升了人机交互体验。

本项目的核心目标是将数字信号处理与硬件控制相结合,通过编程实现音频信号的生成与输出,验证PWM 技术在音频领域的应用,并实现完整的交互式音乐播放系统。项目的完成不仅展示了 RP2350B 核心板的强大性能,也为嵌入式系统在多媒体领域的应用提供了实践案例。

二、使用到的硬件介绍

1. RP2350B 核心板

· 芯片特性采用双核ARM Cortex-M33 处理器,工作频率最高可达 133MHz,集成 2MB Flash 和 256KB SRAM,支持丰富的外设接口。

· 关键功能提供PWM 输出通道、ADC 输入接口、SPI 通信接口等,为本项目的音频生成、按键检测和 OLED 显示提供硬件支持。

2. 蜂鸣器

· 类型电磁式蜂鸣器,工作电压0-3.3v

· 连接方式通过GPIO 引脚(GP20)连接至核心板,由 PWM 信号驱动发声。

· 作用将电信号转换为声音信号,输出不同音调的音频。

3. OLED 显示屏(SSD1306)

· 显示参数128×32 像素,单色 OLED,支持 SPI 通信。

· 接口配置:通过GP44(MOSI)、GP45(SCK)、GP41(CS)、GP42(DC)、GP43(RESET)引脚与核心板连接。

· 功能实时显示当前播放曲目的汉字名称、系统状态(锁定/ 解锁)和音量等级。

4. 按键输入模块

· 数量4 个模拟按键,通过 ADC 引脚(GP47)检测不同按键状态。

· 功能

· 按键1(55000-58000 ADC 值):切换播放曲目

· 按键2(51000-54000 ADC 值):调节音量(低 / 中 / 高)

· 按键3(44000-47000 ADC 值):播放当前选中曲目

· 按键4(29000-32000 ADC 值):锁定 / 解锁系统

5. 模拟 SPI 模块

· 实现方式通过软件模拟SPI 通信协议,使用 GPIO 引脚模拟时钟(SCK)和数据(MOSI)信号。

· 作用OLED 显示屏通信,传输显示数据和控制指令。

三、方案框图和项目设计思路介绍

1. 方案框图

            

2. 项目设计思路

1)整体架构设计

项目采用模块化设计思想,将系统分为以下几个功能模块:

· PWM 音频生成模块负责产生不同频率的PWM 信号,对应不同音调

· 按键检测模块通过ADC 读取按键状态,实现按键消抖和功能识别

· OLED 显示模块处理汉字点阵数据,在屏幕上显示曲目名称和状态

· 音乐播放控制模块:管理曲目切换、音量调节和播放逻辑

2)关键技术实现思路

· PWM 音调控制:通过设置PWM 输出的频率来生成不同音调,例如 C4(261Hz)、D4(293Hz)等,频率计算公式为:frequency = 1 / period,其中period 为信号周期。

· 按键消抖:采用软件延时消抖方法,每次按键检测后延时100ms,避免抖动导致的误触发。

· 汉字显示:使用16×16 点阵字模,将汉字转换为二进制数据数组,通过 SPI 发送至 OLED 显示屏逐点绘制。

· 音量调节:通过调整PWM 信号的占空比实现音量控制,占空比越大,蜂鸣器发声幅度越大。

3)交互逻辑设计

系统采用状态机设计思想,主要状态包括:

· 待机状态:显示当前曲目名称,等待按键输入

· 播放状态:按顺序播放当前曲目音符,同时检测按键操作

· 锁定状态:按键功能禁用,防止误操作,OLED 显示 "LOCK"

四、软件流程图和关键代码介绍

1. 软件流程图

2. 关键代码介绍

1)PWM 音频生成与播放

# 蜂鸣器初始化
buzzer = pwmio.PWMOut(board.GP20, duty_cycle=0, frequency=440, variable_frequency=True)
# 播放单个音符def play_note(frequency, volume):
    if frequency > 0:
        buzzer.frequency = frequency  # 设置音调频率
        buzzer.duty_cycle = 2 ** volume  # 设置音量(占空比)
    time.sleep(NOTE_DURATION)  # 音符持续时间
    buzzer.duty_cycle = 0  # 停止播放
    time.sleep(0.05)  # 音符间隔
# 播放完整曲目def play_song(song):
    global pause, current_value, volume
    for note in song:
        if not pause:
            current_value = adc.value
            play_note(note, volume)  # 播放音符
            key_scan(current_value)  # 检测按键

 

代码解析通过pwmio.PWMOut创建蜂鸣器控制对象,frequency参数控制音调,duty_cycle通过2 的幂次调节音量。play_note函数实现单个音符的播放,play_song函数按顺序播放曲目列表中的音符,同时检测按键状态。

2)按键检测与消抖

def key_scan(current_value):
    global flag, pause, volume
    if 55000 <= current_value <= 58000:
        if not pause:
            flag += 1
            flag %= 3  # 循环切换3首曲目
    elif 51000 <= current_value <= 54000:
        if not pause:
            # 音量调节逻辑
            if volume == 5:
                volume = 7
            elif volume == 7:
                volume = 9
            elif volume == 9:
                volume = 5
    elif 44000 <= current_value <= 47000:
        if not pause:
            song = songs[flag]
            play_song(song)  # 播放当前曲目
    elif 29000 <= current_value <= 32000:
        pause = not pause  # 锁定/解锁切换
    time.sleep(0.1)  # 100ms延时消抖

 

代码解析通过ADC 读取的电压值范围判断按下的按键,每个按键对应不同的 ADC 值区间。time.sleep(0.1)实现软件消抖,避免按键抖动导致的多次触发。锁定状态(pause=True)时,除按键4 外其他按键功能禁用。

3)OLED 汉字显示

# 模拟SPI实现
class SoftSPI:
    def __init__(self, sck, mosi, miso=None):
        self.sck = digitalio.DigitalInOut(sck)
        self.mosi = digitalio.DigitalInOut(mosi)
        self.sck.direction = digitalio.Direction.OUTPUT
        self.mosi.direction = digitalio.Direction.OUTPUT
        
    def write(self, buffer):
        for byte in buffer:
            for i in [7, 6, 5, 4, 3, 2, 1, 0]:
                self.sck.value = False
                self.mosi.value = (byte >> i) & 0x01
                self.sck.value = True
# 汉字显示函数
def display_chinese(oled, font_data, x, y):
    for i in range(16):
        byte1 = font_data[i * 2]
        byte2 = font_data[i * 2 + 1]
        for j in range(16):
            if j < 8:
                pixel = byte1 & (0x80 >> j)
            else:
                pixel = byte2 & (0x80 >> (j - 8))
            if pixel:
                oled.pixel(x + j, y + i, 1)
# 主显示函数
def show(flag):
    global pause, volume
    oled.fill(0)  # 清屏
    
    # 显示锁定/解锁状态
    if not pause:
        oled.text("UNLOCK", 85, 10, 1, size=1)
    else:
        oled.text("LOCK", 85, 10, 1, size=1)
        
    # 显示音量状态
    if volume == 5:
        oled.text("LOW", 85, 21, 1, size=1)
    elif volume == 7:
        oled.text("MID", 85, 21, 1, size=1)
    elif volume == 9:
        oled.text("HIGH", 85, 21, 1, size=1)
        
    # 显示曲目名称(汉字)
    if flag == 0:
        display_chinese(oled, FONT_LIANG, 0, 12)
        display_chinese(oled, FONT_ZHI, 20, 12)
        display_chinese(oled, FONT_LAO, 40, 12)
        display_chinese(oled, FONT_HU, 60, 12)  # 《两只老虎》
    elif flag == 1:
        display_chinese(oled, FONT_XIAO, 10, 12)
        display_chinese(oled, FONT_XING, 30, 12)
        display_chinese(oled, FONT_XING, 50, 12)  # 《小星星》
    elif flag == 2:
        display_chinese(oled, FONT_SHENG, 0, 12)
        display_chinese(oled, FONT_RI, 20, 12)
        display_chinese(oled, FONT_KUAI, 40, 12)
        display_chinese(oled, FONT_LE, 60, 12)  # 《生日快乐歌》
    oled.show()  # 刷新显示

 

代码解析通过SoftSPI类软件模拟SPI 通信协议,实现与 OLED 显示屏的数据传输。display_chinese函数根据16×16 点阵字模数据逐点绘制汉字,show函数整合状态显示和曲目名称显示,实时更新OLED 内容。

五、实物功能展示图及说明

1. 硬件连接图片

 

2. 功能演示说明

1)曲目切换功能

· 操作:按下按键1(ADC 值 55000-58000)

· 现象OLED 显示曲目名称切换,依次为《两只老虎》《小星星》《生日快乐歌》

· 示例:切换至《小星星》时,OLED 显示 "小星星" 三个汉字

2)音量调节功能

· 操作:按下按键2(ADC 值 51000-54000)

· 现象:音量在"LOW"(低)、"MID"(中)、"HIGH"(高)之间循环切换

· 效果:蜂鸣器发声幅度随音量等级变化,"HIGH" 状态声音最大

3)音乐播放功能

· 操作:按下按键3(ADC 值 44000-47000)

· 现象:蜂鸣器播放当前选中曲目,OLED 保持显示曲目名称

· 示例:播放《生日快乐歌》时,蜂鸣器按旋律输出音符

4)锁定 / 解锁功能

· 操作:按下按键4(ADC 值 29000-32000)

· 现象OLED 右上角显示 "LOCK"(锁定)或 "UNLOCK"(解锁)

· 效果:锁定状态下,除按键4 外其他按键操作无效,防止误触

 

 

3. 显示效果图片

 

 

说明

· 左侧显示曲目名称(汉字):图中为《两只老虎》

· 右侧显示系统状态:"UNLOCK"(解锁)和 "MID"(中等音量)

六、项目中遇到的难题和解决方法

1. 按键消抖问题

1)难题描述

初始版本中未添加消抖处理,按键触发时经常出现多次响应,导致曲目频繁切换或音量快速变化,用户体验差。

2)解决方法

key_scan函数中添加time.sleep(0.1)延时,每次按键检测后等待100ms 再进行下一次检测,有效消除了机械按键的抖动影响。同时,在 ADC 值判断中设置合理的范围(如 55000-58000),避免电压波动导致的误识别。

2. OLED 汉字显示乱码

1)难题描述

初次实现汉字显示时,屏幕出现乱码或部分像素错误,点阵数据传输不正确。

2)解决方法

· 检查字模数据格式:确认16×16 点阵数据按行存储,每个汉字对应 32 字节(16 行 ×2 字节 / 行)

· 优化SPI 通信逻辑:在SoftSPI.write函数中,确保数据按位传输顺序正确(高位先行)

· 调整显示坐标:通过display_chinese函数的xy参数校准汉字显示位置,避免重叠

3. 音量调节效果不明显

1)难题描述

初始版本中通过直接设置duty_cycle值调节音量,但效果不明显,音量区间划分模糊。

2)解决方法

采用2 的幂次计算占空比:buzzer.duty_cycle = 2 ** volume,其中volume5、7、9 三个等级。该方法使音量变化呈指数级,符合人耳听觉特性,低音量和高音量差异明显,调节效果更直观。

4. 播放音乐时按键响应延迟

1)难题描述

播放较长曲目时,按键响应存在明显延迟,尤其是在音符持续期间无法及时切换曲目。

2)解决方法

play_song函数中,每次播放音符后立即调用key_scan函数检测按键,确保在音乐播放过程中仍能实时响应按键操作。同时,优化音符间隔时间(time.sleep(0.05)),在不影响音乐流畅度的前提下提升交互响应速度。

七、对本次活动的心得体会

1. 技术收获

1)PWM 技术的实际应用

通过本次项目,深入理解了PWM 在音频生成中的应用原理,掌握了通过调节频率控制音调、调节占空比控制音量的方法。实际操作中发现,不同蜂鸣器的频率响应特性存在差异,需要根据硬件特性调整参数以获得最佳音质。

2)嵌入式系统交互设计

学习了如何在资源有限的嵌入式系统中实现人机交互功能,包括按键检测、状态显示和事件处理。特别是模拟按键通过ADC 检测的方式,相比数字按键更节省 IO 资源,但需要更复杂的阈值判断和消抖处理。

3)汉字显示技术

掌握了OLED 显示屏的汉字显示原理,包括点阵字模的生成、SPI 通信协议的软件实现以及汉字绘制算法。理解了在嵌入式系统中处理字符显示时,需要考虑存储效率和显示效果的平衡。

2. 项目经验总结

1)模块化设计的重要性

项目采用模块化设计,将功能划分为PWM 控制、按键检测、OLED 显示等独立模块,显著提高了代码的可读性和可维护性。在调试过程中,可针对单个模块进行测试,快速定位问题。

2)硬件与软件的协同优化

项目中多次遇到硬件特性与软件设计不匹配的情况,如蜂鸣器驱动能力不足、ADC 采样精度影响按键检测等。解决这些问题需要同时调整硬件连接和软件算法,体现了嵌入式系统开发中软硬件协同优化的重要性。

3)用户体验的考量

在功能实现的基础上,注重用户体验的优化,如音量调节的线性感、按键反馈的及时性、OLED 显示的清晰度等。这些细节优化虽然不影响核心功能,但能显著提升系统的易用性。

3. 对活动的建议

1)硬件文档完善

建议提供更详细的RP2350B 核心板硬件手册,特别是外设接口的电气特性和推荐连接方式,帮助开发者更快掌握硬件设计。

2)示例代码扩展

希望可以有示例代码,展示一部分功能演示,如软件spi配置、oled显示例程等,为开发者提供更全面的参考。

3)技术支持优化

建议建立更便捷的技术支持渠道,如论坛专区或实时问答平台,方便开发者在项目中遇到问题时及时获取帮助。

4)活动流程细化

在活动规则中,可进一步细化项目提交的格式要求,如视频拍摄角度、报告章节编排等,使参与者能更清晰地了解任务标准。

4. 未来改进方向

· 功能扩展:增加更多曲目存储,支持用户自定义曲目上传;添加SD 卡接口,实现音乐文件的读取播放。

· 交互优化:引入触摸屏或编码器,提升人机交互的便捷性;增加音效处理,如回声、颤音等效果。

· 性能提升:优化代码效率,降低CPU 占用率;实现休眠模式,减少系统功耗。

 

通过本次项目,不仅巩固了嵌入式系统开发的理论知识,也积累了丰富的实践经验。从硬件连接到软件编程,从功能实现到问题调试,每一个环节都带来了宝贵的学习机会,为今后的嵌入式项目开发奠定了坚实基础。

 

软硬件
元器件
RP2350B
高性能、安全微控制器,48 GPIO,10×10 QFN 80 pin
附件下载
基于RP2350B实现的音乐播放器.zip
团队介绍
个人作品
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号