Код для поиска

Превратите сенсорный экран ESP32 в пианино – без звуковых файлов

Превратите сенсорный экран ESP32 в пианино – без звуковых файлов

Приподнятые клавиши, настоящие аккорды и звук, генерируемый на чипе

Играбельное пианино на сенсорном экране. Клавиши выглядят приподнятыми и нажимаются при касании, сенсорная панель отслеживает пять пальцев, чтобы вы могли играть аккорды, и каждая нота синтезируется процессором — здесь нет звуковых файлов и SD-карты.

922-Это статья об ИИ-музыке проект здесь.

923-Пианино (это текущая статья)

Оно полностью офлайн. Прошейте и играйте.

Сенсорное пианино на плате MaTouch AI ESP32-S3

Два макета и почему существуют оба

Этот скетч имеет две совершенно разные клавиатуры, а кнопка LAYOUT в верхнем левом углу переключает между ними. Надпись на этой кнопке показывает, в каком режиме вы сейчас находитесь, так что она также служит индикатором — нажмите её, и она изменится.

KEYS — настоящее пианино

MKRFAB3_4-D1.MOV.00_00_34_49.Still001

Семь белых клавиш на всю ширину с пятью чёрными клавишами сверху, точно как на настоящей клавиатуре. Именно с этого плата начинает работу. Поскольку помещается только одна октава, кнопки - и + рядом с LAYOUT перемещают вас вверх и вниз; голубое значение между ними показывает, где вы находитесь, от C3 до C6.

GRID — четыре октавы, без фальшивых нот

Макет GRID на MaTouch AI ESP32-S3 — четыре ряда по семь нот
Макет GRID на MaTouch AI ESP32-S3 — четыре ряда по семь нот

Четыре ряда по семь, всего 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.

Как создаётся приподнятый вид

Светлый край сверху и слева каждой клавиши и тёмный край снизу и справа воспринимаются глазом как выступающий объект. Нажатие клавиши меняет их местами и затемняет поверхность, что воспринимается как нажатие. Это две строки кода на край, и это убедительно.

Как создаётся звук

На этой плате нет никаких записей. Ни сэмплов, ничего на карте памяти. Каждая нота — это фазовый аккумулятор, проходящий через таблицу синусов из 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-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-светодиода. Когда уже запущенный на плате скетч управляет этим светодиодом, он может конфликтовать с автоматическим сбросом, поэтому чип перезагружается в ваш старый скетч вместо загрузчика.

Исправление занимает пять секунд. Переведите плату в режим загрузки самостоятельно:

  1. Нажмите и удерживайте кнопку BOOT.
  2. Продолжая удерживать BOOT, нажмите RESET и отпустите RESET.
  3. Теперь отпустите BOOT. Экран становится пустым — это загрузчик ожидает.
  4. Нажмите Upload.
  5. Когда загрузка завершится, нажмите 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-файла

  1. Скачайте ZIP. Он включён в загрузку этого проекта, или вы можете получить его из репозитория Arduino_GFX — нажмите зелёную кнопку Code, затем Download ZIP.
  2. Сохраните его в место, где вы сможете его снова найти. Не распаковывайте его.
  3. В Arduino IDE нажмите SketchInclude LibraryAdd .ZIP Library.
  4. Найдите скачанный ZIP-файл и нажмите Open.
  5. IDE установит его и подтвердит внизу окна. Если у вас уже установлена версия 1.6, сначала удалите эту папку из Documents/Arduino/libraries, иначе они будут конфликтовать.

Устранение неполадок

Симптом Причина и решение
Экран остаётся чёрным Неправильная версия библиотеки GFX (используйте 1.5.6) или неправильные настройки платы.
PSRAM alloc failed Tools → PSRAM не установлено в OPI PSRAM.
Ничего не загружается / нет COM-порта Неправильный порт USB-C или не установлен драйвер CH340.

Изображения

makerfabs_ESP32S3_cam_music_screen-10-
makerfabs_ESP32S3_cam_music_screen-10-
makerfabs_ESP32S3_cam_music_screen-12-
makerfabs_ESP32S3_cam_music_screen-12-
MKRFAB3_4-D1.MOV.00_00_34_49.Still001
MKRFAB3_4-D1.MOV.00_00_34_49.Still001
Нет кода.

Ресурсы и ссылки

Ресурсов пока нет.

Файлы📁

Нет доступных файлов.