内容介绍
内容介绍
项目介绍
使用RP2350B核心板搭配综合技能训练板,利用PWM制作一个音乐播放器。
- 通过PWM产生不同的音调,并驱动板上蜂鸣器将音调输出
- 能够播放三首不同的曲子,可以切换播放
- 曲子的切换使用核心板上的按键,需要有按键消抖的功能
- 播放的曲子的名字在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
方案框图和项目设计思路介绍

RP2350B可以使用C/C++、Python和Arduino进行开发,由于本板卡使用的Flash为2MB容量的,可以使用的MyPython固件不好找,所以本次选用Arduino进行开发。
本项目主要实现三部分功能:
- 显示歌名:主要实现OLED驱动以及显示中文的功能,使用Adafruit_SSD1306库,通过软件SPI的方式实现,中文显示通过drawBitmap将中文当作图片进行显示。
- 播放音乐:主要实现蜂鸣器驱动,使用PWM功能,利用tone接口控制PWM输出频率,创建一个频率与音符对应的文件,方便构建歌曲。
- 按键切歌:主要实现ADC驱动,使用ADC采集输入的模拟量,并通过判断模拟量的值是否小于某个数判断按键是否按下,通过演示判断的方式实现按键抖动识别。
软件流程图和关键代码介绍

初始化部分
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:欢乐斗地主

播放歌曲2:两只老虎

播放歌曲3:欢乐颂

项目中遇到的难题和解决方法
问题:OLED屏碎了。
解决办法:购买了一个新的并更换。
对本次活动的心得体会
活动挺好的,希望下次板卡外部接口可以直接接到默认的硬件复用IO上,Flash选型可以更加贴近官方一点。
附件下载
sketch_jun16a.zip
代码
团队介绍
无
团队成员
冷月烟
评论
0 / 100
查看更多
猜你喜欢
基于RP2350B制作音乐播放器该项目使用了RP2350B核心板,实现了PWM音乐播放器的设计,它的主要功能为:利用PWM引脚控制蜂鸣器进行音乐播放,用OLED显示屏显示歌曲名字,并且可以使用按钮进行音乐切换和选择。
一颗星
256
基于RP2350B实现利用PWM制作一个音乐播放器该项目使用了RP2350B,实现了PWM制作一个音乐播放器的设计,它的主要功能为:可以按键切换的音乐播放器。
冲向天空的猪
513
使用RP2350B实现基于PWM的音乐播放器该项目使用了RP2350B,实现了基于PWM的音乐播放器的设计,它的主要功能为:通过PWM(脉宽调制)技术控制蜂鸣器播放音乐,实现简易音乐播放器功能。用户可通过按键切换曲目,并支持文本形式存储音乐文件。项目旨在帮助初学者理解PWM原理、音频信号处理及嵌入式系统开发流程。支持按键控制播放状态(播放/停止、切歌)。。
鲜de芒果
915