基于RP2350B制作一个音乐播放器
该项目使用了RP2350B,实现了音乐播放器的设计,它的主要功能为:利用PWM制作一个音乐播放器。
标签
PWM
音乐播放器
RP2350B
冷月烟
更新2025-07-08
189

 项目介绍

使用RP2350B核心板搭配综合技能训练板,利用PWM制作一个音乐播放器。

  1. 通过PWM产生不同的音调,并驱动板上蜂鸣器将音调输出
  2. 能够播放三首不同的曲子,可以切换播放
  3. 曲子的切换使用核心板上的按键,需要有按键消抖的功能
  4. 播放的曲子的名字在OLED屏幕上显示出来(汉字显示)

简短的使用到的硬件介绍

STEP_RP2350B核心板

RP2350 - 双核Arm处理器 + 双核RISC-V处理器,以及可编程IO(PIO),该芯片不仅支持通用的外设总线(I2C、SPI以及UART)访问,还可以通过适当的配置让PIO访问高速外设。

核心板支持:

  • 8颗单色LED
  • 2个三色LED
  • 2个7段数码管
  • 4个拨码开关
  • 4个轻触按键

小脚丫FPGA综合训练板

板上具有

  • 128*32分辨率的OLED单色显示屏
  • 蜂鸣器,使用PWM驱动
  • DS18B20温度传感器
  • 一个电位计 + 串行ADC
  • 由20个电阻构成的10bit R-2R DAC

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


未命名绘图.drawio (3).png

RP2350B可以使用C/C++、Python和Arduino进行开发,由于本板卡使用的Flash为2MB容量的,可以使用的MyPython固件不好找,所以本次选用Arduino进行开发。

本项目主要实现三部分功能:

  1. 显示歌名:主要实现OLED驱动以及显示中文的功能,使用Adafruit_SSD1306库,通过软件SPI的方式实现,中文显示通过drawBitmap将中文当作图片进行显示。
  2. 播放音乐:主要实现蜂鸣器驱动,使用PWM功能,利用tone接口控制PWM输出频率,创建一个频率与音符对应的文件,方便构建歌曲。
  3. 按键切歌:主要实现ADC驱动,使用ADC采集输入的模拟量,并通过判断模拟量的值是否小于某个数判断按键是否按下,通过演示判断的方式实现按键抖动识别。

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

未命名绘图.drawio (4).png

初始化部分

void setup() {
  play_num = 0;
  delay(500);
  display.begin(SSD1306_SWITCHCAPVCC);
}

歌名显示部分

if(play_num == 0)
{
display.clearDisplay();
display.drawBitmap(24,8,hlddz_16x16[0],16,16,WHITE);
display.drawBitmap(24+16*1,8,hlddz_16x16[1],16,16,WHITE);
display.drawBitmap(24+16*2,8,hlddz_16x16[2],16,16,WHITE);
display.drawBitmap(24+16*3,8,hlddz_16x16[3],16,16,WHITE);
display.drawBitmap(24+16*4,8,hlddz_16x16[4],16,16,WHITE);
display.display();
melody = melody1;
noteDurations = noteDurations1;
itoneLen = itoneLen1;
}
else if(play_num == 1)
{
display.clearDisplay();
display.drawBitmap(32,8,hzlh_16x16[0],16,16,WHITE);
display.drawBitmap(32+16*1,8,hzlh_16x16[1],16,16,WHITE);
display.drawBitmap(32+16*2,8,hzlh_16x16[2],16,16,WHITE);
display.drawBitmap(32+16*3,8,hzlh_16x16[3],16,16,WHITE);
display.display();
melody = melody2;
noteDurations = noteDurations2;
itoneLen = itoneLen2;
}
else
{
display.clearDisplay();
display.drawBitmap(40,8,hls_16x16[0],16,16,WHITE);
display.drawBitmap(40+16*1,8,hls_16x16[1],16,16,WHITE);
display.drawBitmap(40+16*2,8,hls_16x16[2],16,16,WHITE);
display.display();
melody = melody3;
noteDurations = noteDurations3;
itoneLen = itoneLen3;
}

音乐播放部分

int noteDuration = 1000 / noteDurations[thisNote];
tone(20, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(20);
thisNote ++;
if(thisNote >= itoneLen) thisNote = 0;

按键切歌部分

if(analogRead(47) < 500)
{
delay(20);
if(analogRead(47) < 500)
{
while(analogRead(47) < 500);
play_num++;
if(play_num >= 3) play_num = 0;
break;
}
}

实物功能展示图及说明

播放歌曲1:欢乐斗地主

微信截图_20250625225058.png

播放歌曲2:两只老虎

1750863128604.png

播放歌曲3:欢乐颂

image.png

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

问题:OLED屏碎了。

解决办法:购买了一个新的并更换。

对本次活动的心得体会

活动挺好的,希望下次板卡外部接口可以直接接到默认的硬件复用IO上,Flash选型可以更加贴近官方一点。

附件下载
sketch_jun16a.zip
代码
团队介绍
团队成员
冷月烟
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号