这,是多邻国的钢琴课
这,是我做的电子琴里的钢琴课
这这这,谁能分得清哪个才是多邻国!
说点实在的,我为啥做它?
我的初衷是——希望在没有网络的环境,也能随时练习钢琴。
并且能像多邻国那样,有可视化的辅助。
还希望成本能低一点,以防自己三分钟热度。
正好,本人有一定的物联网基础,于是,我就用尽可能简单的方式,花20元,做出了它!方案已全开源!就算是小白,也能尝试复刻!
- 通过触摸琴键弹琴:支持12键同时触摸实现和弦演奏
- OLED实时显示:按键和音符信息
- 支持手机不联网远程控制:通过Web界面控制
- 教学模式:内置小星星、两只老虎等经典曲目,通过OLED屏幕预览教学,类似多邻国的钢琴教学功能
- 混音播放:支持多音符同时发声
- 可在Web界面调节:音符持续时间、八度偏移、触摸灵敏度
- 自动播放功能:可播放预设曲目,当MP3用哈哈
演示一下!▼

原理图
PCB图
- 主控:ESP8266 NodeMCU开发板,内置WiFi功能
- 触摸芯片:SC12B,实现12路电容触摸检测
- OLED显示屏:128x32
- 无源蜂鸣器音频输出,实现多音符混音
- 支持5个八度音域,共60个音符
- 本项目的硬件成本来说应该是比较低的,主要的部分就是ESP8266和SC12B,TP4056不需要也可以删掉
钢琴使用电容触控,那如何在PCB设计中,提高其抗干扰能力呢?
将触控PAD与铺地间距控制在1.5mm,就能有效平衡系统抗干扰度和触控灵敏度。
如何提高钢琴按键的灵敏度呢?
在电容触控PAD的背面,我做了镂空处理,以减少寄生电容,改善灵敏度。还需要在触控区和主电路区域放置地过孔隔离。
走线规则
对于相邻触摸信号线距离及铺地距离设置在15mil,避免串扰


对于触控信号线走线线宽设置为5mil

所有信号线均不跨越其他信号线,走线周围0.5mm内不走其他信号线
如果想让触控延时尽量保持一致,还可为每条触控信号线设置等长处理
封装
钢琴键已设计成封装,方便引用。
丝印部分参考:https://oshwhub.com/47uF/mini_piano 工程修改
-
软件环境:VSCode + PlatformIO
-
开发语言:C/C++
-
框架:Arduino Framework
通过以下开源库协助本项目开发
- Adafruit SSD1306:用于OLED显示屏驱动
- ESPAsyncWebServer:用于Web服务器功能
- ArduinoJson:用于JSON数据处理
- SC12B:基于liuquanli1970/SC12B开源库修改适配
本项目采用模块化设计,各功能模块独立开发,便于维护和扩展
-
audio.h/.cpp:音频播放和混音处理
-
display.h/.cpp:OLED显示控制
-
touch.h/.cpp:触摸检测和多键处理
-
network.h/.cpp:WiFi和Web服务器
-
music.h/.cpp:曲谱数据和播放控制
-
SC12B.h/.cpp:触摸芯片驱动
-
config.h:系统配置参数
-
main.cpp:主程序入口

SC12B一共支持两种控制方法,分别是I2C控制和BCD端口输出。
BCD端口输出很简单,只需要ADC检查电压就可以,但BCD的缺点也很明显,四个接口要配置四个不常见的电阻,而且只能单向输出触控信号,无法深入控制IC,并且BCD产生的模拟电压也无法检查多点触控。显然不符合本项目要求。
因此这里我们选择IIC控制。
基于liuquanli1970/SC12B提供的库移植修改。
SC12B.h
这里我们将writeRegister移动到public公开,方便外部调用。

SC12B.cpp
这里我们将begin函数中内容修改成如下,使用默认地址和默认IIC。

寄存器列表
touchPannel.writeRegister(REG_Senset0, sensitivityLevel);
写入传感器0的灵敏度寄存器
touchPannel.writeRegister(REG_SensetCOM, sensitivityLevel);
写入公共传感器的灵敏度寄存器
寄存器定义 (在 SC12B.h 中)

而在硬件中还有一个可调电容可以调节灵敏度
主机发送:
START -> 0x40(写) -> ACK -> 0x08(REG_OUTPUT1) -> ACK -> RESTART -> 0x41(读) -> ACK
从机响应:
DATA1 -> ACK -> STOP
多次采样:
连续5次轮询避免单次采样的不稳定性
1ms间隔确保采样的时间分散性
防抖处理:
20ms防抖时间避免按键抖动
只有状态真正改变才处理
这部分通过路由创建RESTful API,然后页面按钮触发发get/post,由路由监听到后执行对应任务。
魔改方向 ”
本项目提供了一个完整的简易电子琴方案,你可以基于此项目进行以下“魔改”拓展:
-
增加更多内置曲目和教学内容
-
支持MIDI输出,播放加钢琴教学
-
支持自定义音色和乐器声音
-
添加节拍器和调音器功能
-
添加功放或大喇叭扩音量
-
添加TF卡存储歌曲
其实我本来想做MIDI这个的,因为MIDI格式是可以映射到琴键的,可以接个max98357,然后上位机解析MIDI到json格式,再去把数据处理就能映射了,这样你就能直接导入MIDI格式的音乐去学习弹奏。
比如这组midi解析的数据,我们可以得到
- G1 (midi: 31) - 低音G
- G2 (midi: 43) - 中音G
- G3 (midi: 55) - 高音G
- D3 (midi: 50) - D音
- B3 (midi: 59) - B音

这就能映射到琴键上了,但我们这里的项目主要是入门为主,所以这里我给大家提供一个思路,大家可以自己去实现,如果后续有空的话可以出个pro版,当然如果你有更好的方法也可以自己尝试。
成本说明
电路外壳均可在嘉立创免费打样
本项目器件成本为20,20足够做一个可使用的基础版电子琴
目前,项目已全开源!
——想复刻?想给作者点赞?下面会附上开源网址↓,欢迎大家在遵循作者开源协议的情况下,友好复刻学习~~
开源网址: