我的订单购物车(0)联系客服 帮助中心供应商合作 嘉立创产业服务群
领券中心备货找料立推专区爆款推荐TI订货PLUS会员BOM配单PCB/SMT工业品面板定制

牛!工程师为学琴,手搓了一个电子琴……

2025-10-14 10:49:59阅读量:2441

这,是多邻国的钢琴课

 

多邻国的钢琴课

 

这,是我做的电子琴里的钢琴课

 

我的电子琴里的钢琴课

这这这,谁能分得清哪个才是多邻国!

说点实在的,我为啥做它?

我的初衷是——希望在没有网络的环境,也能随时练习钢琴

并且能像多邻国那样,有可视化的辅助。

还希望成本能低一点,以防自己三分钟热度。

正好,本人有一定的物联网基础,于是,我就用尽可能简单的方式,花20元,做出了它!方案已全开源!就算是小白,也能尝试复刻!

 

0电子琴功能&亮点
  • 通过触摸琴键弹琴:支持12键同时触摸实现和弦演奏
  • OLED实时显示:按键音符信息
  • 支持手机不联网远程控制:通过Web界面控制
  • 教学模式:内置小星星、两只老虎等经典曲目,通过OLED屏幕预览教学,类似多邻国的钢琴教学功能
  • 混音播放:支持多音符同时发声
  • 可在Web界面调节:音符持续时间、八度偏移、触摸灵敏度
  • 自动播放功能:可播放预设曲目,当MP3用哈哈

演示一下!▼

 

演示一下

电子琴

 

0硬件设计方案
原理图

原理图

 

PCB图

PCB图

01  参数说明
  • 主控:ESP8266 NodeMCU开发板,内置WiFi功能
  • 触摸芯片:SC12B,实现12路电容触摸检测
  • OLED显示屏:128x32
  • 无源蜂鸣器音频输出,实现多音符混音
  • 支持5个八度音域,共60个音符
  • 本项目的硬件成本来说应该是比较低的,主要的部分就是ESP8266和SC12B,TP4056不需要也可以删掉
02  PCB设计说明

钢琴使用电容触控,那如何在PCB设计中,提高其抗干扰能力呢?

将触控PAD与铺地间距控制在1.5mm,就能有效平衡系统抗干扰度和触控灵敏度。

PCB设计说明
PCB设计说明

如何提高钢琴按键的灵敏度呢?

在电容触控PAD的背面,我做了镂空处理,以减少寄生电容,改善灵敏度。还需要在触控区和主电路区域放置地过孔隔离。

 

提高钢琴按键的灵敏度

走线规则

对于相邻触摸信号线距离及铺地距离设置在15mil,避免串扰

 

走线规则

 

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

 

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

 

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

 

所有信号线均不跨越其他信号线,走线周围0.5mm内不走其他信号线

 

所有信号线均不跨越其他信号线

 

如果想让触控延时尽量保持一致,还可为每条触控信号线设置等长处理

封装

钢琴键已设计成封装,方便引用。

 

封装

丝印部分参考:https://oshwhub.com/47uF/mini_piano 工程修改

 

0软件开发原理
01  开发环境
  • 软件环境:VSCode + PlatformIO

  • 开发语言:C/C++

  • 框架:Arduino Framework

02  依赖库

通过以下开源库协助本项目开发

 

  • Adafruit SSD1306:用于OLED显示屏驱动
  • ESPAsyncWebServer:用于Web服务器功能
  • ArduinoJson:用于JSON数据处理
  • SC12B:基于liuquanli1970/SC12B开源库修改适配
03 模块化

本项目采用模块化设计,各功能模块独立开发,便于维护和扩展

 

  • 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:主程序入口

 

04  系统配置 (config.h)

系统配置

 

05  触摸控制接口选择

 

SC12B一共支持两种控制方法,分别是I2C控制和BCD端口输出。

BCD端口输出很简单,只需要ADC检查电压就可以,但BCD的缺点也很明显,四个接口要配置四个不常见的电阻,而且只能单向输出触控信号,无法深入控制IC,并且BCD产生的模拟电压也无法检查多点触控。显然不符合本项目要求。

因此这里我们选择IIC控制。

 

触摸控制接口选择
触摸控制接口选择

 

06  SC12B驱动库移植

基于liuquanli1970/SC12B提供的库移植修改。

SC12B.h

这里我们将writeRegister移动到public公开,方便外部调用。

 

SC12B驱动库移植

 

SC12B.cpp

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

 

SC12B.cpp

 

寄存器列表

 

寄存器列表

 

07  触摸灵敏度调节
依照数据手册提供的寄存器配置,我们在软件端设置了16个触控等级。
触摸灵敏度调节

touchPannel.writeRegister(REG_Senset0, sensitivityLevel);


写入传感器0的灵敏度寄存器


touchPannel.writeRegister(REG_SensetCOM, sensitivityLevel);


写入公共传感器的灵敏度寄存器

 

寄存器定义 (在 SC12B.h 中)

 

寄存器定义

 

而在硬件中还有一个可调电容可以调节灵敏度

 

一个可调电容可以调节灵敏度

 

08  触摸检测
触摸检测
触摸检测
对于触控的检查我们将使用上面的引脚,地址参考地址选择说明。
本项目中ASEL浮空,INT用于中断检测,当INT触发硬件中断则说明有按键被触摸,此时发送IIC轮询找到对应通道即可。

主机发送:


START -> 0x40(写) -> ACK -> 0x08(REG_OUTPUT1) -> ACK -> RESTART -> 0x41(读) -> ACK

从机响应:

DATA1 -> ACK -> STOP

多次采样:

连续5次轮询避免单次采样的不稳定性

1ms间隔确保采样的时间分散性

防抖处理:

20ms防抖时间避免按键抖动

只有状态真正改变才处理

 

09  HTML页面显示

这部分通过路由创建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音

 

HTML页面显示

 

这就能映射到琴键上了,但我们这里的项目主要是入门为主,所以这里我给大家提供一个思路,大家可以自己去实现,如果后续有空的话可以出个pro版,当然如果你有更好的方法也可以自己尝试。

成本说明

电路外壳均可在嘉立创免费打样

本项目器件成本为20,20足够做一个可使用的基础版电子琴

 

 

成本说明

 

0开源网址

目前,项目已全开源图片

——想复刻想给作者点赞下面会附上开源网址↓,欢迎大家在遵循作者开源协议的情况下,友好复刻学习~~

开源网址:

https://oshwhub.com/course-examples/eda-piano2