第1章 项目介绍
1.1 项目功能介绍
1.可以通过电子琴拓展板上的主按键进行弹奏,支持两个按键同时按下(和弦)并且声音不失真,通过有上方的“上“、”下”两个按键对音程进行扩展,同时按住上和主琴键,能够升调,按住下和主琴键,能够降调。
2.使用扬声器进行播放时,输出的音调信号支持该音调的单频正弦波与多次谐波成分。
3.音乐的播放支持两种方式,通过开关进行切换: 当开关切换到蜂鸣器端,可以通过蜂鸣器来进行音乐播放。当开关切换到扬声器端,可以通过模拟扬声器来进行音乐播放
4.支持记录功能,用户按下琴键时开启记录,电子琴每20秒重置一次记录文件,可以记录旋律并播放。
本文完成了该链接下的任务:https://www.eetree.cn/task/839
1.2 设计思路
本项目首先基于硬禾新品RP2350B核心板的硬件功能,实现完整电子琴的若干基础功能。
基于RP2350B的原理图,扫描所有GPIO 测试通断获得拓展板对应的琴键映射。使用micropython下的GPIO操作功能实现获取用户操作,使用PWM输出到蜂鸣器或喇叭,使用文件读写功能实现按键记录,写入部分函数实现正弦波、谐波的PWM转换。
通过函数实现谐波等,输入到扬声器。
1.3 硬件框图
核心板
电子琴拓展板
1.4 软件流程图
1.5 项目方案框图
第2章 硬件介绍
2.1 核心板
硬禾版本的RP2350B核心板,兼容了原小脚丫FPGA核心板的信号定义,可以使用为小脚丫FPGA定制的各种扩展板进行设计。
由于RP2350的强大性能 - 双核Arm处理器 + 双核RISC-V处理器,以及可编程IO(PIO),该芯片不仅支持通用的外设总线(I2C、SPI以及UART)访问,还可以通过适当的配置让PIO访问高速外设,在很多场景下能够完成FPGA才能实现的功能。
相对于RP2040和RP2350A只有30个IO,RP2350B拥有48个IO,这增加的18个IO就可以通过合理的配置,可以访问更多的外设。
支持:
8颗单色LED,用于各种LED相关的编程练习,比如心跳灯、流水灯、呼吸灯
2个三色LED,用于使用RGB三种颜色的编程练习,比如交通灯的控制,在这里2颗三色灯是通过一根串行信号线来控制,同小脚丫FPGA核心板通过6根IO来控制不同,主要是为了节省IO信号线的数量
2个7段数码管,用于计数、显示数字信息,可以显示0-99之间的数字,在这里我们使用了两颗74HC595将3根控制信号线转换为7段数码管的驱动信号
4个拨码开关,用于设置、切换一些状态,其状态是使用模拟信号的方式送到RP2350B的ADC进行判断
4个轻触按键,用于控制信息的输入,其状态是使用模拟信号的方式送到RP2350B的ADC进行判断
https://www.eetree.cn/platform/4125
2.2 电子琴拓展板
硬禾科技为“暑假在家一起练”设计过一款电子琴套件,这个STEP_RP2350B核心板同样也可以使用。
有别于其它电子琴只用单调发音的蜂鸣器,这个电子琴在保留了蜂鸣器的基础上(用于对比),直接采用了扬声器,英文叫Speaker,它的音质洪亮、圆润,只要你能给它足够好的信号,它都能完美地播放出来,别说可以播放电子琴、钢琴的声音,即便小提琴、摇滚乐的声音它也能绘声绘色地给你播放出来
资料位置:https://www.eetree.cn/platform/1105
第3章 实现的功能及图片展示
正常按下后,与电子琴功能一致,会顺序模仿12345671(升调)的简谱音频。
同时按住上、下和音调键,可以实现升调、降调
单独按下升调键,启动回放,回放优先级高于按键。拨动中间的选项键,可以指向使用蜂鸣器或喇叭播放音频。
上位机显示交互:
音量调节
第4章 主要代码片段及说明
音频实现和键盘映射:MAP
note_frequencies = {
'C': 262,
'D': 294,
'E': 330,
'F': 349,
键盘映射:
key_map = {
4: 'C', # 1
6: 'D', # 2
8: 'E', # 3
9: 'F', # 4
11: 'G', # 5
键盘记录模块:
def record_key(gpio):
global record_start_time
elapsed = time.time() - record_start_time
with open(RECORD_FILE, 'a') as f:
f.write(f"{elapsed:.2f}:{gpio}\n")
谐波成分
# 定义谐波成分:(振幅比例, 倍频)
harmonics = [
(1.0, 1), # 基频
(0.4, 2), # 二次谐波
(0.2, 3), # 三次谐波
(0.1, 4), # 四次谐波(轻微加入)
]
波形构建
# 构建多谐波叠加的波形
waveforms = []
for amp, order in harmonics:
lut = [int(((math.sin(2 * math.pi * i / 64 * order) + 1) * 16383) * amp) for i in range(64)]
waveforms.append(lut)
第5章 遇到的主要难题及解决方法
存储问题,使用micropython时,操作内部文件容易将文件系统环境搞崩,最后只采取append和write模式仅对txt实现读写,取得了稳定的效果。
由于需要定义的按键非常多,为了加速开发进度,不再读原理图,直接扫描板卡的对应按键,具体实现操作为上拉电阻,检测到按下时,print突然上电的GPIO号,快速判别出电子琴拓展板的所有内容。
谐波生成部分,阅读了一部分的乐理知识,同时调试了播放时长等内容。
重播问题,按下回放键后可能会出现 很长时间没有声音的情况,以为属于bug ,最后发现是因为时间播放功能记录的实现,导致了会复刻原按键时间间隔顺序,如果开始录制的前10秒不按键,重播时会停止演奏10秒,最终采用20秒删除一次文件内容实现。
第6章 对本活动心得体会
需达到除代码之外的约1500字