Превратите сенсорный экран ESP32 в пианино – без звуковых файлов
Приподнятые клавиши, настоящие аккорды и звук, генерируемый на чипе
Играбельное пианино на сенсорном экране. Клавиши выглядят приподнятыми и нажимаются при касании, сенсорная панель отслеживает пять пальцев, чтобы вы могли играть аккорды, и каждая нота синтезируется процессором — здесь нет звуковых файлов и SD-карты.
922-Это статья об ИИ-музыке проект здесь.
923-Пианино (это текущая статья)
Оно полностью офлайн. Прошейте и играйте.
Robojax_Makerfab при оформлении заказа на странице продукта MaTouch AI ESP32-S3. Это ничего вам не стоит, а помогает поддерживать бесплатный код и учебные материалы здесь.Два макета и почему существуют оба
Этот скетч имеет две совершенно разные клавиатуры, а кнопка LAYOUT в верхнем левом углу переключает между ними. Надпись на этой кнопке показывает, в каком режиме вы сейчас находитесь, так что она также служит индикатором — нажмите её, и она изменится.
KEYS — настоящее пианино
Семь белых клавиш на всю ширину с пятью чёрными клавишами сверху, точно как на настоящей клавиатуре. Именно с этого плата начинает работу. Поскольку помещается только одна октава, кнопки - и + рядом с LAYOUT перемещают вас вверх и вниз; голубое значение между ними показывает, где вы находитесь, от C3 до C6.
GRID — четыре октавы, без фальшивых нот

Четыре ряда по семь, всего 28 клавиш. Каждый ряд — это октава, самая низкая внизу; каждый столбец — это нота — C, D, E, F, G, A, B. Ни диезов, ни бемолей, поэтому вся доска — это до мажор, и нет фальшивых нот. Вы можете дать её человеку, который никогда ничего не играл, позволить ему нажимать наугад, и это всё равно будет звучать как музыка.
Почему в качестве настоящей клавиатуры помещается только одна октава
Это арифметика, которая определяет весь проект. Экран имеет ширину 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 записей — проходите её быстро для высокой ноты, медленно для низкой — поэтому тригонометрия не вычисляется для каждого сэмпла. Для теплоты смешиваются три гармоники.
Каждая нота также получает короткую огибающую атаки и затухания, примерно шесть миллисекунд на вход и семьдесят на выход. Без неё вы слышите щелчок каждый раз, когда нота начинается или заканчивается, потому что вы включаете waveform на полной амплитуде. Эта огибающая — разница между инструментом и пищалкой.
До пяти нот смешиваются одновременно, что соответствует пяти точкам касания, которые сообщает панель. i2s_write() блокируется, когда аудиобуфер заполнен, что удобно задаёт темп всей программы в реальном времени — таймеры и прерывания не нужны.
Кнопки
- LAYOUT переключает между KEYS и GRID. Надпись показывает, в каком режиме вы находитесь.
- - и + перемещают октаву. Только в режиме KEYS.
- VOL открывает панель громкости поверх клавиатуры — перетащите ползунок, чтобы установить уровень. Нажмите VOL снова, чтобы закрыть её.
- DEMO самостоятельно играет мелодию, подсвечивая каждую клавишу по мере воспроизведения.
- WAVE циклически переключает тон между SOFT, ORGAN и BRIGHT. По умолчанию установлен ORGAN, который лучше всего подходит для этого маленького динамика, но попробуйте все три.
Регулировка громкости
Усилитель на этой плате действительно громкий — 3,2 Вт на 4 Ом динамик — поэтому возможность убавить звук важна. Нажатие VOL выдвигает панель поверх клавиатуры с большим перетаскиваемым ползунком; текущий уровень также постоянно отображается в верхней панели.
Пока панель открыта, она намеренно поглощает все касания ниже верхней панели, поэтому вы не сможете случайно сыграть ноты через неё. Настройка применяется как единое умножение при масштабировании смешанного аудио до 16-бит, что не требует затрат во время выполнения и одинаково влияет на демо-мелодию. Измените VOL_STEPS в скетче, если нужны более мелкие или более крупные шаги, чем стандартные десять.
Никакого WiFi, никаких аккаунтов, ничего настраивать не нужно
Стоит сказать прямо, потому что каждый другой проект в этой серии требует где-то аккаунт: этот — нет. Здесь нет secrets.h, который нужно заполнять, нет API-ключа, нет сети. Прошейте и играйте. Из всего, что создано для этой платы, именно это стоит отдать новичку.
Попробуйте аккорд
Нажмите три или четыре клавиши одновременно. Сенсорный контроллер отслеживает пять пальцев, поэтому все они звучат вместе — именно в этот момент устройство перестаёт ощущаться как пищалка и начинает ощущаться как инструмент.
О плате MaTouch AI ESP32-S3 2.8"
Каждый проект на этой странице работает на MaTouch AI ESP32-S3 2.8" TFT ST7789V от Makerfabs. Это универсальная плата: цветной сенсорный экран, 3-мегапиксельная камера, два микрофона и настоящий усилитель динамика — всё управляется ESP32-S3 с 8 МБ PSRAM. Именно эта комбинация делает возможными эти AI-проекты на одной плате без каких-либо дополнительных устройств.
8 МБ PSRAM важнее любого другого числа здесь. Именно она позволяет плате одновременно хранить в памяти кадр камеры, несколько секунд записанного аудио или фото в base64-кодировке — ни одно из этого не помещается в обычную RAM ESP32.
Документация производителя: страница вики Makerfabs.
Каждый другой проект для этой платы — камера, офлайн-распознавание лиц, AI-голосовой помощник, AI-зрение и проект рисования — имеет свой собственный учебник. Ссылки на все из них находятся ниже этой статьи.
Основные характеристики
- Процессор: ESP32-S3, двухъядерный 240 МГц, WiFi 2,4 ГГц + Bluetooth 5.0
- Память: 16 МБ флеш-памяти, 8 МБ PSRAM (требуется почти для каждого проекта здесь)
- Дисплей: 2,8" IPS, 320×240, драйвер ST7789V, SPI
- Сенсор: GT911 ёмкостный, отслеживает 5 пальцев одновременно
- Камера: OV3660, 3 мегапикселя, до 2048×1536
- Микрофоны: два I2S цифровых микрофона INMP441 (настоящая стереопара)
- Динамик: усилитель класса D MAX98357A, 3,2 Вт на 4 Ом
- Хранилище: слот для microSD-карты (режим SPI)
- Питание: USB-C, разъём для батареи JST, зарядное устройство TP4056, выключатель питания
- Также на плате: WS2812B RGB-светодиод, часы реального времени 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 при загрузке | Отключено |
| Скорость загрузки | 921600 |
| Стирать всю флеш-память перед загрузкой | Отключено |
| Порт | порт USB-C CH340K |
Если загрузка не удаётся: перевод платы в режим загрузки вручную
В большинстве случаев достаточно нажать Upload, и всё работает. Иногда это не срабатывает — IDE зависает на Connecting......, а затем завершает работу с ошибкой Failed to connect to ESP32-S3: No serial data received.
Это происходит потому, что IO0 на этой плате выполняет три задачи одновременно: это кнопка BOOT, это линия автоматического сброса от CH340K, и это линия данных для RGB-светодиода. Когда уже запущенный на плате скетч управляет этим светодиодом, он может конфликтовать с автоматическим сбросом, поэтому чип перезагружается в ваш старый скетч вместо загрузчика.
Исправление занимает пять секунд. Переведите плату в режим загрузки самостоятельно:
- Нажмите и удерживайте кнопку BOOT.
- Продолжая удерживать BOOT, нажмите RESET и отпустите RESET.
- Теперь отпустите BOOT. Экран становится пустым — это загрузчик ожидает.
- Нажмите Upload.
- Когда загрузка завершится, нажмите RESET один раз, чтобы запустить новый скетч.
Если подключение всё ещё не устанавливается, снизьте Upload Speed до 115200 и попробуйте снова. Также проверьте, включён ли переключатель питания платы — CH340K определяется и даёт COM-порт, даже когда сама плата выключена, что вводит людей в заблуждение.
Необходимые библиотеки
Для этого проекта нужна каждая библиотека из таблицы ниже — не больше и не меньше. Большинство устанавливаются напрямую через Tools → Manage Libraries в Arduino IDE, но GFX Library for Arduino должна быть установлена из ZIP-файла. Номера версий важны, поэтому, пожалуйста, используйте именно те, что указаны.
| Библиотека | Версия | Автор | Установка из |
|---|---|---|---|
| GFX Library for Arduino | 1.5.6 | moononournation | ZIP-файл — см. ниже |
| bb_captouch | 1.3.1 | Larry Bank | Менеджер библиотек |
| Adafruit NeoPixel | любая свежая | Adafruit | Менеджер библиотек |
Установка библиотеки GFX из ZIP-файла
- Скачайте ZIP. Он включён в загрузку этого проекта, или вы можете получить его из репозитория Arduino_GFX — нажмите зелёную кнопку Code, затем Download ZIP.
- Сохраните его в место, где вы сможете его снова найти. Не распаковывайте его.
- В Arduino IDE нажмите Sketch → Include Library → Add .ZIP Library.
- Найдите скачанный ZIP-файл и нажмите Open.
- IDE установит его и подтвердит внизу окна. Если у вас уже установлена версия 1.6, сначала удалите эту папку из
Documents/Arduino/libraries, иначе они будут конфликтовать.
Устранение неполадок
| Симптом | Причина и решение |
|---|---|
| Экран остаётся чёрным | Неправильная версия библиотеки GFX (используйте 1.5.6) или неправильные настройки платы. |
PSRAM alloc failed |
Tools → PSRAM не установлено в OPI PSRAM. |
| Ничего не загружается / нет COM-порта | Неправильный порт USB-C или не установлен драйвер CH340. |
Ресурсы и ссылки
Ресурсов пока нет.
Файлы📁
Нет доступных файлов.