基于RP2350B制作带有录制功能的电子琴
该项目使用了RP2350B及电子琴拓展板,实现了带有录制功能的电子琴的设计,它的主要功能为:录制; 谐波发生器 ; 蜂鸣器; 喇叭。
标签
数字逻辑
开发板
接口
墨非沧海
更新2025-07-11
吉林大学
7

第1章                    项目介绍

1.1       项目功能介绍

1.可以通过电子琴拓展板上的主按键进行弹奏,支持两个按键同时按下(和弦)并且声音不失真,通过有上方的“上“、”下”两个按键对音程进行扩展,同时按住上和主琴键,能够升调,按住下和主琴键,能够降调。

2.使用扬声器进行播放时,输出的音调信号支持该音调的单频正弦波与多次谐波成分。

3.音乐的播放支持两种方式,通过开关进行切换: 当开关切换到蜂鸣器端,可以通过蜂鸣器来进行音乐播放。当开关切换到扬声器端,可以通过模拟扬声器来进行音乐播放

4.支持记录功能,用户按下琴键时开启记录,电子琴每20秒重置一次记录文件,可以记录旋律并播放。

本文完成了该链接下的任务:https://www.eetree.cn/task/839

 

1.2       设计思路

本项目首先基于硬禾新品RP2350B核心板的硬件功能,实现完整电子琴的若干基础功能。

基于RP2350B的原理图,扫描所有GPIO 测试通断获得拓展板对应的琴键映射。使用micropython下的GPIO操作功能实现获取用户操作,使用PWM输出到蜂鸣器或喇叭,使用文件读写功能实现按键记录,写入部分函数实现正弦波、谐波的PWM转换。

通过函数实现谐波等,输入到扬声器。

image.png

 image.png

1.3       硬件框图

核心板

image.png

电子琴拓展板

 

 image.png

 

1.4       软件流程图

 image.png

image.png

1.5       项目方案框图

image.png


第2章                    硬件介绍

2.1         核心板

硬禾版本的RP2350B核心板,兼容了原小脚丫FPGA核心板的信号定义,可以使用为小脚丫FPGA定制的各种扩展板进行设计。

由于RP2350的强大性能 - 双核Arm处理器 + 双核RISC-V处理器,以及可编程IOPIO),该芯片不仅支持通用的外设总线(I2CSPI以及UART)访问,还可以通过适当的配置让PIO访问高速外设,在很多场景下能够完成FPGA才能实现的功能。

 

 

 

相对于RP2040RP2350A只有30IORP2350B拥有48IO,这增加的18IO就可以通过合理的配置,可以访问更多的外设。

支持:

8颗单色LED,用于各种LED相关的编程练习,比如心跳灯、流水灯、呼吸灯

2个三色LED,用于使用RGB三种颜色的编程练习,比如交通灯的控制,在这里2颗三色灯是通过一根串行信号线来控制,同小脚丫FPGA核心板通过6IO来控制不同,主要是为了节省IO信号线的数量

27段数码管,用于计数、显示数字信息,可以显示0-99之间的数字,在这里我们使用了两颗74HC5953根控制信号线转换为7段数码管的驱动信号

4个拨码开关,用于设置、切换一些状态,其状态是使用模拟信号的方式送到RP2350BADC进行判断

4个轻触按键,用于控制信息的输入,其状态是使用模拟信号的方式送到RP2350BADC进行判断

https://www.eetree.cn/platform/4125

2.2         电子琴拓展板

硬禾科技为“暑假在家一起练”设计过一款电子琴套件,这个STEP_RP2350B核心板同样也可以使用。

有别于其它电子琴只用单调发音的蜂鸣器,这个电子琴在保留了蜂鸣器的基础上(用于对比),直接采用了扬声器,英文叫Speaker,它的音质洪亮、圆润,只要你能给它足够好的信号,它都能完美地播放出来,别说可以播放电子琴、钢琴的声音,即便小提琴、摇滚乐的声音它也能绘声绘色地给你播放出来

资料位置:https://www.eetree.cn/platform/1105

 

 

第3章                    实现的功能及图片展示

正常按下后,与电子琴功能一致,会顺序模仿12345671(升调)的简谱音频。

image.png

同时按住上、下和音调键,可以实现升调、降调

image.png

单独按下升调键,启动回放,回放优先级高于按键。拨动中间的选项键,可以指向使用蜂鸣器或喇叭播放音频。

image.png

上位机显示交互:

image.png

 音量调节

image.png

 

第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时,操作内部文件容易将文件系统环境搞崩,最后只采取appendwrite模式仅对txt实现读写,取得了稳定的效果。

由于需要定义的按键非常多,为了加速开发进度,不再读原理图,直接扫描板卡的对应按键,具体实现操作为上拉电阻,检测到按下时,print突然上电的GPIO号,快速判别出电子琴拓展板的所有内容。

谐波生成部分,阅读了一部分的乐理知识,同时调试了播放时长等内容。

重播问题,按下回放键后可能会出现 很长时间没有声音的情况,以为属于bug ,最后发现是因为时间播放功能记录的实现,导致了会复刻原按键时间间隔顺序,如果开始录制的前10秒不按键,重播时会停止演奏10秒,最终采用20秒删除一次文件内容实现。

 

第6章                    对本活动心得体会

需达到除代码之外的约1500

 

 

附件下载
键盘v2普通版.py
普通版音色更加流畅
键盘v3谐波.py
谐波版实现了正弦波加谐波的简易功能,但是效果有限,音色未进一步优化
RPI_PICO2-20240809-v1.24.0-preview.201.g269a0e0e1.uf2
RP2350A固件micropython
adafruit-circuitpython-solderparty_rp2350_stamp_xl-zh_Latn_pinyin-9.2.7.uf2
RP2350B固件circuitpython ,可以用于reset
团队介绍
墨海纵横,鸢游四方
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号