ESP32タッチスクリーンをピアノに変える – サウンドファイル不要
浮起的琴键、真正的和弦,以及芯片上生成的声音
触摸屏上可弹奏的钢琴。琴键看起来凸起,触摸时会按下,触摸面板可追踪五根手指,因此您可以弹奏和弦,每个音符都由处理器合成——不涉及声音文件,也不使用SD卡。
922-这是AI音乐文章项目在这里。
923-钢琴(即当前文章)
它完全离线。烧录后即可弹奏。
Robojax_Makerfab。您使用它无需任何费用,同时有助于支持这里的免费代码和教程。两种布局,以及为何两者并存
此草图包含两个完全不同的键盘,左上角的LAYOUT按钮可在它们之间切换。该按钮上的标签会告诉您当前处于哪种模式,因此它也兼作指示器——点击它即可切换。
KEYS——真正的钢琴
七个白键横跨整个宽度,五个黑键位于其上,与真正的键盘完全一致。这是该板启动时的默认模式。由于只能容纳一个八度,LAYOUT旁边的-和+按钮可让您上下移动;它们之间的青色读数显示当前位置,从C3到C6。
GRID——四个八度,没有错音

四行七列,共28个键同时可用。每行是一个八度,最低的在底部;每列是一个音符——C、D、E、F、G、A、B。没有升号,没有降号,因此整个板面是C大调,没有错音。您可以把它交给从未弹过任何乐器的人,让他们随意敲击,听起来仍然像音乐。
为何真正的键盘只能容纳一个八度
这是决定整个项目形态的算术。屏幕宽320像素,但实际宽度仅约2.2英寸,因此一个指尖大约覆盖45像素。
- 一个八度——七个白键,每个约45像素。舒适。
- 两个八度——十四个白键,每个约22像素。半个指尖宽。无法弹奏。
因此,真正的钢琴布局在这里只能显示一个八度,这就是八度按钮存在的原因——也是当您想要音域和可靠性而非真实感时,网格布局作为替代方案的原因。
在代码中更改布局
草图顶部附近的三个设置控制所有这些:
| 设置 | 功能 |
|---|---|
BOOT_LAYOUT |
开机时显示哪个键盘。LAYOUT_KEYS为钢琴,LAYOUT_GRID为网格。 |
ROWS |
GRID显示的八度数。默认4。 |
COLS |
GRID中每行的音符数。默认7,即七个自然音。 |
BASE_OCTAVE |
GRID底行起始的八度。默认3。 |
ROWS和COLS仅影响GRID。KEYS布局根据自身表格构建八度并忽略它们,因此更改这些数字不会添加黑键或改变钢琴。凸起效果是如何实现的
每个键的顶部和左侧有浅色边缘,底部和右侧有深色边缘,视觉上会让人感觉是凸出的。按下键时,这些边缘互换并加深键面,看起来像是被按进去了。每条边缘只需两行代码,效果却很逼真。
声音是如何生成的
这块板上没有任何录音。没有采样,存储卡上也没有任何内容。每个音符都是一个相位累加器,逐步遍历一个512项的正弦表——快速遍历产生高音,慢速遍历产生低音——因此每个样本无需计算三角函数。混合三个谐波以增加温暖感。
每个音符还带有短暂的起音和释音包络,大约6毫秒起音、70毫秒释音。没有它,每次音符开始或停止时您都会听到咔嗒声,因为您是在全振幅下切换波形。这个包络就是乐器与蜂鸣器之间的区别。
最大五个音符混合在一起,与面板报告的五个触摸点对应。i2s_write()在音频缓冲区满时会阻塞,这恰好以实时方式控制整个程序的节奏——无需定时器或中断。
按钮
- LAYOUT在KEYS和GRID之间切换。标签显示当前所在模式。
- -和+移动八度。仅限KEYS布局。
- VOL在键盘上方打开音量面板——拖动滑块设置音量。再次点击VOL关闭。
- DEMO自动播放一首曲子,并随播放点亮每个按键。
- WAVE在SOFT、ORGAN和BRIGHT之间循环音色。默认从ORGAN开始,这最适合这个小扬声器,但三种都可以试试。
音量控制
这块板上的放大器声音真的很大——4 Ω扬声器下输出3.2 W——所以能调低音量很重要。点击VOL会在键盘上方滑出一个带大拖拽滑块的面板;当前音量也永久显示在顶部栏中。
面板打开时,它会故意吞掉顶部栏下方的所有触摸,因此你不会意外通过它触发音符。该设置是在混合音频缩放为16位时通过一次乘法应用的,运行时零成本,并且对演示曲目同样生效。如果默认的十级不够精细或需要更粗,可在草图中调整VOL_STEPS。
无WiFi,无账户,无需设置
值得明确说明,因为这个系列中的其他每个项目都需要某个账户:这个不需要。没有需要填写的secrets.h,没有API密钥,没有网络。烧录即可播放。在为这块板构建的所有项目中,这是最适合交给初学者的一个。
试试和弦
同时按下三四个键。触摸控制器跟踪五根手指,所以它们会一起发声——那一刻它就不再像蜂鸣器,而开始像一种乐器。
关于MaTouch AI ESP32-S3 2.8"板
此页面上的每个项目都运行在Makerfabs的MaTouch AI ESP32-S3 2.8" TFT ST7789V上。这是一块一体化板:彩色触摸屏、3百万像素摄像头、两个麦克风和一个真正的扬声器放大器,全部由带8 MB PSRAM的ESP32-S3驱动。正是这种组合使得这些AI项目能在单块板上实现,无需连接其他任何东西。
8 MB的PSRAM比这里任何其他数字都重要。它让板子能同时在内存中保存一帧摄像头图像、几秒录音或base64编码的照片——这些都无法容纳在ESP32的正常RAM中。
制造商文档:Makerfabs wiki页面。
这块板的其他每个项目——摄像头、离线人脸识别、AI语音助手、AI视觉和绘图项目——都有自己的教程。所有链接都在本文下方。
主要规格
- 处理器:ESP32-S3,双核240 MHz,WiFi 2.4 GHz + 蓝牙5.0
- 内存:16 MB闪存,8 MB PSRAM(这里几乎所有项目都需要)
- 显示屏:2.8" IPS,320×240,ST7789V驱动,SPI
- 触摸:GT911电容式,同时跟踪5根手指
- 摄像头:OV3660,3百万像素,最高2048×1536
- 麦克风:两个INMP441 I2S数字麦克风(真正的立体声对)
- 扬声器:MAX98357A D类放大器,4 Ω下3.2 W
- 存储:microSD卡槽(SPI模式)
- 电源:USB-C、JST电池连接器、TP4056充电器、电源开关
- 板上其他组件:WS2812B RGB LED、PCF8563T电池供电实时时钟,以及一个未在官方规格中列出的MAX17048电池电量计
USB CDC On Boot设置为Disabled。用错端口会导致音频异常或上传失败。用电池供电?两个USB-C插座、TP4056充电器和电源开关在板测试文章中有完整说明,包括原理图——包括哪个插座充电以及开关应开还是关。
Arduino IDE设置
这些设置很重要。人们报告这块板的大多数问题都是其中之一设置错误,而且它们会在更改核心版本时重置,所以任何更改后都要再检查一遍。
| 設定 | 値 |
|---|---|
| ボード | ESP32S3 Dev Module |
| ESP32 コアバージョン | 2.0.17 |
| PSRAM | OPI PSRAM |
| フラッシュサイズ | 16MB (128Mb) |
| パーティションスキーム | 16M Flash (3MB APP/9.9MB FATFS) |
| USB CDC On Boot | 無効 |
| アップロード速度 | 921600 |
| アップロード前にフラッシュを全消去 | 無効 |
| ポート | CH340K USB-Cポート |
アップロードが失敗する場合: ボードを手動でダウンロードモードにする
ほとんどの場合、Upload を押すだけで動作します。しかし、時々動作しないことがあります - IDE は Connecting...... のまま止まり、その後 Failed to connect to ESP32-S3: No serial data received というエラーで諦めてしまいます。
これは、このボードでは IO0 が同時に 3 つの役割を担っているために発生します: BOOT ボタン、CH340K からの自動リセットライン、そして RGB LED のデータラインです。ボード上で既に実行中のスケッチがその LED を駆動していると、自動リセットと競合する可能性があり、その結果チップはブートローダではなく古いスケッチで再起動してしまいます。
修正には 5 秒かかります。自分でダウンロードモードにしてください:
- BOOT ボタンを押したままにします。
- BOOT を押したまま、RESET を押して、RESET を離します。
- 次に BOOT を離します。画面が真っ白になります - これはブートローダが待機している状態です。
- Upload をクリックします。
- 完了したら、RESET を 1 回押して新しいスケッチを実行します。
それでも接続できない場合は、Upload Speed を 115200 に下げて、もう一度試してください。また、ボードの電源スイッチがオンになっているか確認してください - CH340K はボード自体の電源がオフでも列挙されて COM ポートを提供するため、人を騙すことがあります。
必要なライブラリ
このプロジェクトには、下の表のすべてのライブラリが必要です - それ以上でもそれ以下でもありません。ほとんどは Arduino IDE の Tools → Manage Libraries から直接インストールできますが、GFX Library for Arduino は ZIP ファイルからインストールする必要があります。バージョン番号が重要なので、記載されているものを正確に使用してください。
| ライブラリ | バージョン | 作者 | インストール元 |
|---|---|---|---|
| GFX Library for Arduino | 1.5.6 | moononournation | ZIP ファイル - 下記参照 |
| bb_captouch | 1.3.1 | Larry Bank | ライブラリマネージャ |
| Adafruit NeoPixel | 最新版であれば可 | Adafruit | ライブラリマネージャ |
ZIP ファイルから GFX ライブラリをインストールする
- ZIP をダウンロードします。これはこのプロジェクトのダウンロードに含まれているか、Arduino_GFX リポジトリから取得できます - 緑色の Code ボタンをクリックし、次に Download ZIP をクリックします。
- 再度見つけられる場所に保存します。解凍しないでください。
- Arduino IDE で、Sketch → Include Library → Add .ZIP Library をクリックします。
- ダウンロードした ZIP ファイルを参照して、Open をクリックします。
- IDE がインストールし、ウィンドウの下部で確認します。既に 1.6 バージョンがインストールされている場合は、先に
Documents/Arduino/librariesからそのフォルダを削除してください。そうしないと、2 つが競合します。
トラブルシューティング
| 症状 | 原因と修正 |
|---|---|
| 画面が真っ黒のまま | GFX ライブラリのバージョンが間違っている(1.5.6 を使用)か、ボード設定が間違っています。 |
PSRAM alloc failed |
Tools → PSRAM が OPI PSRAM に設定されていません。 |
| アップロードできない / COM ポートがない | USB-C ポートが間違っているか、CH340 ドライバがインストールされていません。 |
リソースと参考文献
まだリソースはありません。
ファイル📁
ファイルは利用できません。