亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

用 Arduino 制作便携电容触控钢琴:分步指南

组件与物料

ProtoStax Arduino 透明亚克力外壳 (可堆叠模块化) ×1
Adafruit 12 路电容触控扩展板 (MPR121) ×1
Adafruit 压电蜂鸣器 PS1240 ×1
Arduino UNO ×1
导电胶铜箔胶带 (剪成琴键形状) ×1
22 AWG 排线套装 ×1

项目简介

本项目教你制作一台便携电容触控钢琴,包含:

最终得到一个紧凑便携的小钢琴,可随身携带演奏和编程新曲目!

触控检测: 使用 Adafruit MPR121 扩展板及其库,可轻松检测最多 12 个导电触点。正好对应一个八度的 12 个半音 (C, C#, D, D#, E, F, F#, G, G#, A, A#, B)。虽缺少高八度的 C,但已足够演奏许多曲目。后文还提供扩展八度的建议。

还可编程“秘密按键组合”触发预设曲目,突破单八度限制。

发声: 使用 Arduino 内置 tone() 库驱动压电蜂鸣器。也可接喇叭 (需串联限流电阻)。

琴键制作: 必须使用**带导电胶**的铜箔胶带,以便粘贴在连接扩展板的导线上导通。

外壳: ProtoStax 是笔者设计的可堆叠模块化外壳系统,支持不同原型阶段:初期开放访问,后期可加装侧壁和顶盖,还可横向或纵向堆叠扩展。本例使用透明亚克力版,适配 Uno/Leonardo 和 Mega/Due,自带防滑脚垫。顶盖即作为触控键盘面板,贴上铜箔胶带即成琴键。

步骤 1:将 Arduino 固定在外壳底板

先将 Arduino (以 Uno 为例) 固定在底板,提供保护同时完全开放访问。准备好后加装侧壁、顶盖并拧紧螺丝即可封装。

用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南

动图演示全过程:

用 Arduino 制作便携电容触控钢琴:分步指南

步骤 2:准备 MPR121 扩展板

剪 12 根 22 AWG 多股线焊接到 MPR121 扩展板的 12 个输入孔 (每输入有两个大孔供夹鳄鱼夹,中间小孔适合 22 AWG 导线)。板上还引出所有引脚焊盘。另焊接压电蜂鸣器:一脚接引脚 12,另一脚接 GND。导线自由端剥皮,用 6 种颜色循环标识以便后续对应琴键顺序。

用 Arduino 制作便携电容触控钢琴:分步指南

步骤 3:准备外壳

将扩展板插在 Arduino 上,装入上支撑件和侧壁。顶盖需额外钻 12 个孔 (对应琴键模板),可用激光切割或钻床 (贴美纹纸防裂),孔径 1/8 英寸 (约 3mm) 即可。将 12 根导线按编号 0-11 从左至右穿入顶盖孔,装上顶盖垫片并拧紧螺丝。将导线推回使仅金属露出。按琴键模板剪裁导电铜箔胶带,撕膜粘贴在顶盖对应位置,确保胶带覆盖穿出的导线金属部分。

用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南
用 Arduino 制作便携电容触控钢琴:分步指南

琴键与钻孔模板 (可打印在 A4 纸上按比例裁剪):

用 Arduino 制作便携电容触控钢琴:分步指南

成品效果 (首次使用铜箔胶带,手工略粗糙,后续会改进):

用 Arduino 制作便携电容触控钢琴:分步指南

步骤 4:演示代码

先安装 Adafruit_MPR121 库,再编译上传示例代码。代码包含钢琴基本功能和“秘密按键组合”触发预设曲目:

代码托管于 GitHub:ProtoStax_CapacitiveTouch_Piano_Demo

代码核心逻辑解析

代码分三部分:

  1. 通过 Adafruit_MPR121 库读取触控数据
  2. 根据触控数据决定播放对应音调,或检测多点触控触发预设曲目 (均使用 tone())
  3. 曲目编程方法,便于移植自定义乐曲

触控读取部分:

Adafruit_MPR121 cap = Adafruit_MPR121();
void setup() {
  // 默认地址 0x5A,接 3.3V 为 0x5B,接 SDA 为 0x5C,接 SCL 为 0x5D
  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 not found, check wiring?");
    while (1);
  }
}
void loop() {
  currtouched = cap.touched(); // 获取当前触控状态位掩码
}

触控响应与延音逻辑:

// 新按下:播放对应音调
if ((currtouched & _BV(i)) && !(lasttouched & _BV(i))) {
  tone(TONE_PIN, scale[i]);
}
// 释放且无其他键按下:停止发声 (允许滑指连奏和延音效果)
if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) && !currtouched) {
  noTone(TONE_PIN);
}

秘密组合触发预设曲目:

if (currtouched == 2193) { // C E G B
  playTune(melody, MELODY_LENGTH(melody), 2);
} else if (currtouched == 181) { // C D E F G
  playTune(melody2, MELODY_LENGTH(melody2), 48);
} else if (currtouched == 2565) { // C D A B
  playTune(melody3, MELODY_LENGTH(melody3), 1);
} else if (currtouched == 3075) { // C C# A# B
  playTune(melody4, MELODY_LENGTH(melody4), 1);
}

playTune() 播放曲目数组:

void playTune(Note *m, int mSize, int speedUp) {
  noTone(TONE_PIN);
  for (int thisNote = 0; thisNote < mSize; thisNote++) {
    int noteDuration = 1000.0 * m[thisNote].duration / speedUp;
    tone(TONE_PIN, m[thisNote].frequency, noteDuration);
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(TONE_PIN);
  }
  delay(100);
}

音符结构定义与示例曲目 (音阶上下行):

typedef struct Note { int frequency; float duration; } Note;

Note melody2[] = {
  {NOTE_C, NOTE_WHOLE}, {NOTE_CS, NOTE_WHOLE}, {NOTE_D, NOTE_WHOLE},
  {NOTE_DS, NOTE_WHOLE}, {NOTE_E, NOTE_WHOLE}, {NOTE_F, NOTE_WHOLE},
  {NOTE_FS, NOTE_WHOLE}, {NOTE_G, NOTE_WHOLE}, {NOTE_GS, NOTE_WHOLE},
  {NOTE_A, NOTE_WHOLE}, {NOTE_AS, NOTE_WHOLE}, {NOTE_B, NOTE_WHOLE},
  {NOTE_AS, NOTE_WHOLE}, {NOTE_A, NOTE_WHOLE}, {NOTE_GS, NOTE_WHOLE},
  {NOTE_G, NOTE_WHOLE}, {NOTE_FS, NOTE_WHOLE}, {NOTE_F, NOTE_WHOLE},
  {NOTE_E, NOTE_WHOLE}, {NOTE_DS, NOTE_WHOLE}, {NOTE_D, NOTE_WHOLE},
  {NOTE_CS, NOTE_WHOLE}, {NOTE_C, NOTE_WHOLE}
};

利用 pitches.h 和 noteDurations.h 中的宏 (如 NOTE_C, NOTE_WHOLE, DOTTED(NOTE_QUARTER)) 可直接从乐谱转写旋律数组。示例中已转写《小星星》《两只老虎》《哦!苏珊娜》 (含附点节奏),供参考。

步骤 5:进阶玩法

  1. 自行转写乐谱,设定专属“秘密按键”触发。
  2. 增加第二个蜂鸣器实现两音复调:tone() 占用 Timer2,可用 NewTone 库 (基于 Timer1) 同时播放第二声部。
  3. 加装物理按键切换高/低八度,配合触控键扩展音域。

更多创意欢迎留言讨论!祝制作愉快!😊

代码仓库

ProtoStax_CapacitiveTouch_Piano_Demo

ProtoStax 钢琴演示代码 (配合 ProtoStax 外壳、Adafruit MPR121 扩展板、压电蜂鸣器、Arduino)
GitHub 仓库

自定义零件与外壳

ProtoStax 电容触控钢琴琴键剪裁模板 & 顶盖钻孔模板

用 Arduino 制作便携电容触控钢琴:分步指南

原理图

用 Arduino 制作便携电容触控钢琴:分步指南

制造工艺

  1. 钢琴:从古老渊源到现代大师之作
  2. 移动厕所:历史、设计与环境影响
  3. 自动钢琴:融合原声传统与自动化精准
  4. DIY 蓝牙控制 Arduino 间谍小车
  5. FlickMote:基于手势的智能家居红外遥控器
  6. DIY Arduino TV-B-Gone:万能关机遥控器
  7. 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
  8. Arduino 触控打砖块:在 2.4 英寸 TFT LCD 上重现经典街机
  9. 将 MIDI 键盘变身智能钢琴导师:Arduino + LED 灯带 + MuseScore
  10. DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
  11. Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
  12. Arduino 项目优化供电方案:从按键开关到电池监测与数据记录