便携式电容式触摸钢琴
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
在这个项目中,我解释了如何使用
构建便携式电容式触摸钢琴- 一个 Arduino,
- 使用 MPR121 的 Arduino 电容式触摸屏,
- 压电蜂鸣器,
- 带导电胶的铜箔胶带(剪成钢琴键的形状),
全部封装在一个透明的亚克力外壳(用于 Arduino 的 ProtoStax)中,电容式触摸键贴在其顶部表面。这使它成为一款小巧精致的小钢琴,您可以随身携带、即兴演奏并编写新曲调!
对于电容式触摸感应,我使用 Adafruit 的 12 x Capacitive Touch Shield for Arduino 使用 MPR121,结合 Adafruit_MPR121 库,可以轻松检测和响应多达 12 个不同导电表面上的触摸。
等一下!八度有 12 个半音 - C、C#、D、D#、E、E#、F、G、G#、A、A#、B!完美的!好吧,如果 MPR121 处理 13 个输入就太好了——它可以让我们从 C 到更高八度的 C,但仍然有很多曲调可供选择! (并且我还在下面提供了有关如何通过扩展八度范围来进一步推进该项目的建议)
此外,您还可以在您自己的触摸序列(“秘密键”或组合键)中进行编程,以播放可以包含任意多个八度音程的任何随机曲调(仅受您的耳朵听到音符的能力的限制,或者您的压电/扬声器播放它!)。
对于输出,我使用 Arduino 的音色库通过压电蜂鸣器播放声音。您也可以使用扬声器 - 只需记住使用电阻器将电流限制为 Arduino 引脚可以提供的电流!
对于钢琴键,我使用带有导电粘合剂的铜箔胶带。使用导电粘合剂很重要,因为您要将胶带粘在连接到屏蔽层的电线上。
最后是外壳。你们中的一些人可能知道我已经创建了一个名为 ProtoStax 的新的可堆叠模块化外壳系统。这是我不得不抓挠的个人渴望 - 我想要一个支持原型制作不同阶段的外壳,在开始时提供保护和开放式访问,能够在以后添加侧壁和顶部,但也能够堆叠多个单元并排或一个在另一个之上,从而能够根据原型设计需求和添加其他电路板和组件进行扩展。
在这个例子中,我为 Arduino 使用了 ProtoStax,这是一个用于 Arduino 的透明亚克力外壳——它既适合 Uno/Leonardo 的足迹,也适合更大的 Mega/Due 足迹——它也是可堆叠和模块化的,并且为两者提供了舒适的空间盾牌(有一些小的修改,我将概述)。它清晰而坚固,还有橡胶脚垫,可以稍微抬高它并保护您的桌子表面。外壳的顶面还充当您的触摸钢琴的键盘——这是您粘贴导电铜箔胶带的地方!最后,您将拥有一个漂亮的小触摸钢琴,您可以轻松随身携带、展示和演奏! 😊
好的,让我们开始吧,好吗? 😊
第 1 步 - 将 Arduino 安装到机箱底板
让我们首先将 Arduino(在我们的示例中为 Uno)安装到外壳的底板上。这为它提供了保护,同时提供了对它的完全开放访问,以配置和设置 Arduino 并使用它。当您准备关闭它时,很容易添加侧壁和顶板并用螺钉固定所有东西。
将Arduino安装到底板上,并在平台配置中添加地脚和其他硬件以准备外壳 .请参阅幻灯片中的以下步骤 - 每张图片的标题都有编号,并为每个步骤提供额外说明。
图> 图> 图> 图> 图> 图> 图> 图>以下是 gif 动画的所有步骤:
第 2 步 - 为 Arduino 准备 MPR121 扩展板
我将 12 根 22 AWG 绞合线切割成长度。然后我将它们焊接到 MPR121 Shield 中。 Adafruit Shield 的 12 个输入端各有两个大孔,用于夹住鳄鱼夹。在这两个孔之间是一个较小的常规孔,可容纳 22 AWG 电线。
MPR121 屏蔽还通过接头旁边的孔暴露所有引脚。我还焊接了一个 Piezo Buzzer PS1240,一条腿插入引脚 12,另一条腿插入 GND。
我确保剥去每根电线的另一(自由)端。我对 12 个输入使用了 6 种不同颜色的重复图案,对它们进行颜色编码,以便稍后在组装时保持顺序。
第 3 步 - 准备外壳
接下来,我们需要准备外壳。我们首先将屏蔽插入安装在底板上的 Arduino。然后我们将上部支撑元件和侧壁插入墙槽。
图> 图> 图> 图>我已经取出了用于 Arduino 外壳的 ProtoStax 的顶部,并在其中添加了 12 个孔,以便将屏蔽输入端的电线插入。我使用激光切割机切割与钢琴键模板匹配的孔,但您也可以轻松地使用钻头(只需确保在钻孔前在亚克力板上使用一些遮蔽胶带)。小 1/8" 孔应该足够了。
然后,我小心地将屏蔽层中的电线插入顶板上的孔中 - 我确保将电线从孔 0 插入到最左侧的孔中,并将逐渐编号的电线(它们在屏蔽上编号)插入孔中从左到右。然后我在顶板下方添加顶部垫片,并拧入螺丝顶部完成外壳。
接下来,我将电线向后推,直到只有金属部件伸到外面为止。
然后,我从一卷带有导电粘合剂的铜箔上剪下来自模板的钢琴键形状的碎片(模板见下文)。然后我小心地剥下铜箔并将它们粘在外壳顶板上的相应位置,确保铜带粘贴在从孔中伸出的相应电线上。
图> 图> 图> 图> 图> 图>这是钢琴键和孔的模板。您应该可以在 8.5x11 信纸上打印此文件并使用正确的尺寸(如果您遇到问题,请告诉我!)
最后,它看起来像这样:(我可以用铜箔胶带做得更好,但这是我第一次使用它,所以希望我以后能更好地处理它!😊)
第 4 步 - 演示代码
您首先需要安装 Adafruit_MPR121 库。之后,您可以编译和上传示例草图,它将您的创作变成触摸钢琴,并包含用于演奏一些叮当声的秘密组合键。
- 按 C E G B 播放“一闪一闪的小星星”
- 按 C D E F G 放大和缩小比例
- 按 C D A B 播放“哦苏珊娜!”
- 按 C C# A# B 播放“Frere Jacques/Brother John”
我还让您可以轻松地根据自己的曲调乐谱转录自己选择的曲调。
如果您有兴趣阅读有关代码的更多信息(我知道您是!),请继续阅读!
让我们快速浏览一下代码的主要部分。你可以在这里快速参考演示代码 - https://github.com/protostax/ProtoStax_CapacitiveTouch_Piano_Demo/blob/master/ProtoStax_CapacitiveTouch_Piano_Demo.ino
代码可以分为3部分:
- 使用 Adafruit_MRP121 库从 MPR121 获取触摸数据。
- 决定如何处理触摸数据 - 即像钢琴一样弹奏相应的音调,或检测多点触控然后播放秘密叮当声,两者都使用内置的音调库。
- 编写曲调,包括如何添加自己的曲调
这是代码的电容式触摸部分的快速浏览。通常情况下,您声明了 Adafruit_MPR121 类的对象。在setup()中,你调用begin()方法来初始化它,你可以在loop()中使用cap.touched()方法获取当前触摸的pads。简单!
Adafruit_MPR121 cap =Adafruit_MPR121();void setup() {... // 默认地址为 0x5A,如果连接到 3.3V,则为 0x5B // 如果连接到 SDA,则为 0x5C,如果为 SCL,则为 0x5D if ( !cap.begin(0x5A)) { Serial.println("MPR121 未找到,检查接线?");而 (1); }...}void loop() { // 获取当前触摸的pads currtouched =cap.touched();}
使用触摸数据,您可以通过播放相应的提示音来响应触摸,并在未按下按钮时停止提示音:
// 如果之前*被*触过并且*没有*触过,则播放相应的音调! if ((currtouched &_BV(i)) &&!(lasttouched &_BV(i)) ) { // Serial.print("currtouched ="); Serial.print(currtouched); Serial.print(" lasttouched ="); Serial.print(lasttouched); Serial.print(" "); Serial.print(i); Serial.println("感动");音调(TONE_PIN, scale[i]); } // 如果它 * 被触摸过,现在 * 没有 *,另外,没有按下任何按钮,则停止音调 // 这允许当您将手指滑过琴键时音符之间的平滑过渡 // 这也允许为了维持给定的音符,通过触摸任何键并保持触摸 - 你可以按下另一个键,它会播放那个键,但不会停止播放 // 直到你松开你的第一个键 - 有点像钢琴的延音踏板! if (!(currtouched &_BV(i)) &&(lasttouched &_BV(i)) &&!currtouched) { //if (!(currtouched &_BV(i)) &&(lasttouched &_BV(i))) { / / Serial.print("currtouched ="); Serial.print(currtouched); Serial.print(" lasttouched ="); Serial.print(lasttouched); Serial.print(" "); Serial.print(i); Serial.println("发布"); noTone(TONE_PIN); }
我们通过播放相应的曲子来处理特殊键的多点触摸:
// 如果我们的“秘密”组合键被按下,则播放曲调! if (currtouched ==2193) { // C E G B playTune(melody, MELODY_LENGTH(melody), 2); // 播放 Twinkle Twinkle Little Star } 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); // 播放 Frere Jacques } else {...
playTune() 用于播放一个给定的曲子,它是一个“音符”数组
void playTune(Note *m, int mSize, int speedUp) { noTone(TONE_PIN); // 从一个干净的石板开始 for (int thisNote =0; thisNote
让我们看一看旋律——它由一系列音符组成。每个音符都有一个频率和一个持续时间。 =
typedef struct Note { int frequency;浮动持续时间; } 笔记; // 这个旋律正在播放从 C 到 B 再回到 CNote 的所有音符 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_WHOLE} NOTE_WHOLE}, {NOTE_CS, NOTE_WHOLE}, {NOTE_C, NOTE_WHOLE}};
这是pitches.h 和noteDurations.h 中的#defines 派上用场的地方。您可以使用这些来代替实际的频率和持续时间。例如,使用 NOTE_C 播放 C 音,使用 NOTE_WHOLE 将其作为一个完整的音符播放(NOTE_HALF、NOTE_QUARTER、NOTE_EIGHTH 是其他一些音符持续时间)。您还可以使用 DOTTED() 宏来指定“带点”的注释——例如 DOTTED(NOTE_QUARTER)。
[注意:点分音符是一个音符,其持续时间延长了另一个音符的持续时间的一半——例如,一个带点二分音符相当于整个音符的 3/4(1/2 音符加 1/2 1/2注)。 ]
这些将允许您获取任何乐谱并将其转录到您的旋律阵列中!
在演示中,我转录了“Twinkle Twinkle Little Star”、“Frere Jacques/Brother John”和“Oh Susanna!”所以你有一些东西可以玩(没有双关语?!😜) - 所有这些歌曲都在一个八度内,这是我试图坚持的键盘限制。当然,在弹奏秘曲时,您不受此限制,可以使用多个八度音程。 “哦,苏珊娜!”也有点复杂,使用二分音符、四分音符和八分音符以及“带点”的四分音符和二分音符——希望这能帮助您很好地了解如何轻松转录其他曲调。
让我们看看它的实际效果,好吗? 😊
第 5 步 - 更进一步!
这里有一些想法可以让这个项目更进一步!
1. 创建您自己的歌曲/曲调(或转录现有的)并分配您自己的“秘钥”来激活它们!
2. 添加第二个 Piezo 以获得 2 级和弦声音!音调库使用 Timer2 向压电蜂鸣器发送方波以播放音调。 Arduino Uno 有 3 个定时器,但定时器 0 是特殊的,用于millis() 和 pwm 之类的东西。这仍然让我们使用 Timer1。 NewTone 库是对使用 Timer1 的音调库的更优化重写。例如,您可以同时拥有两种音调,一种使用tone,另一种使用NewTone。
3. 添加一个或两个额外的按钮以添加附加功能 - 例如使用按钮按下将八度音程扩展到更高或更低的八度音程。通过将这些按钮与电容式触摸键一起按下,您可以在键盘上拥有更大的范围!
你还能想到更多吗?在下方写下评论让我们知道! 😊 也欢迎您提出任何问题! 😊
快乐制作! 😊
代码
ProtoStax_CapacitiveTouch_Piano_Demo
ProtoStax Piano 演示和 ProtoStax for Arduino Enclosure、Adafruit 12 x Capacitive Touch Shield for Arduino - MPR121、Piezo Buzzer 和 Arduino https://github.com/protostax/ProtoStax_CapacitiveTouch_Piano_Demo.git定制零件和外壳
用于为 ProtoStax 电容式触摸钢琴切割钢琴键和在顶板上钻孔的模板示意图
制造工艺