Zet een ESP32-touchscreen om in een piano – geen geluidsbestanden nodig
Verhoogde toetsen, echte akkoorden, en het geluid gegenereerd op de chip
Een bespeelbare piano op het touchscreen. De toetsen zien er verhoogd uit en drukken in wanneer je ze aanraakt, het touchpaneel volgt vijf vingers zodat je akkoorden kunt spelen, en elke noot wordt gesynthetiseerd door de processor - er zijn geen geluidsbestanden en er is geen SD-kaart bij betrokken.
922-Dit is een AI-muziekartikel project is hier.
923-De Piano (dit is het huidige artikel)
Het is volledig offline. Flash het en speel.
Robojax_Makerfab in bij het afrekenen op de MaTouch AI ESP32-S3-productpagina. Het kost je niets om te gebruiken, en het helpt de gratis code en tutorials hier te ondersteunen.Twee lay-outs, en waarom beide bestaan
Deze sketch heeft twee volledig verschillende toetsenborden, en een LAYOUT-knop in de linkerbovenhoek wisselt ertussen. Het label op die knop vertelt je in welke je nu zit, dus het dient ook als indicator - tik erop en het verandert.
KEYS - een echte piano
Zeven witte toetsen over de volledige breedte met vijf zwarte toetsen erbovenop, precies zoals een echt toetsenbord. Dit is waar de board mee start. Omdat er maar één octaaf past, verplaatsen de - en +-knoppen naast LAYOUT je omhoog en omlaag; de cyaan uitlezing ertussen toont waar je bent, C3 tot en met C6.
GRID - vier octaven, geen verkeerde noten

Vier rijen van zeven, 28 toetsen tegelijk. Elke rij is een octaaf, laagste onderaan; elke kolom is een noot - C, D, E, F, G, A, B. Geen kruisen, geen mollen, dus de hele board is C-majeur en er zijn geen verkeerde noten. Je kunt het aan iemand geven die nog nooit iets heeft gespeeld, laat ze er willekeurig op slaan, en het klinkt nog steeds als muziek.
Waarom één octaaf alles is wat past als een echt toetsenbord
Dit is de rekenkunde die het hele project vormgeeft. Het scherm is 320 pixels breed maar slechts ongeveer 2,2 inch breed, dus een vingertop bedekt ongeveer 45 pixels.
- Eén octaaf - zeven witte toetsen van ongeveer 45 pixels elk. Comfortabel.
- Twee octaven - veertien witte toetsen van ongeveer 22 pixels elk. Een halve vingertop. Onbespeelbaar.
Dus een echte pianolay-out kan hier maar één octaaf tonen, daarom bestaan de octaafknoppen - en daarom bestaat het raster als alternatief wanneer je bereik en betrouwbaarheid wilt in plaats van realisme.
De lay-out wijzigen in code
Drie instellingen nabij de bovenkant van de sketch beheren dit alles:
| Instelling | Wat het doet |
|---|---|
BOOT_LAYOUT |
Welk toetsenbord verschijnt bij het inschakelen. LAYOUT_KEYS voor de piano, LAYOUT_GRID voor het raster. |
ROWS |
Hoeveel octaven het GRID toont. Standaard 4. |
COLS |
Noten per rij in het GRID. Standaard 7, de zeven natuurlijke noten. |
BASE_OCTAVE |
Op welk octaaf de onderste rij van het GRID start. Standaard 3. |
ROWS en COLS beïnvloeden alleen het GRID. De KEYS-lay-out bouwt zijn octaaf uit zijn eigen tabellen en negeert ze, dus het wijzigen van die nummers zal geen zwarte toetsen toevoegen of de piano veranderen.Hoe de verhoogde look is gedaan
Een lichte rand langs de bovenkant en links van elke toets, en een donkere rand langs de onderkant en rechts, leest voor het oog als iets dat uitsteekt. Het indrukken van een toets wisselt ze om en verdonkert het oppervlak, wat leest als ingedrukt. Het is twee regels code per rand en het is overtuigend.
Hoe het geluid wordt gemaakt
Er zijn geen opnames ergens op deze board. Geen samples, niets op de geheugenkaart. Elke noot is een faseaccumulator die door een sinus-tabel van 512 items stapt - stap er snel doorheen voor een hoge noot, langzaam voor een lage - dus er wordt geen trigonometrie per sample berekend. Drie harmonischen worden gemengd voor warmte.
Elke noot krijgt ook een korte aanvals- en release-envelop, ongeveer zes milliseconden in en zeventig uit. Zonder dit hoor je een klik elke keer dat een noot start of stopt, omdat je een golfvorm inschakelt op volledige amplitude. Die envelop is het verschil tussen een instrument en een pieper.
Er worden maximaal vijf noten tegelijk gemengd, wat overeenkomt met de vijf aanraakpunten die het paneel rapporteert. i2s_write() blokkeert wanneer de audiobuffer vol is, wat het hele programma handig op realtime tempo houdt - er zijn geen timers of interrupts nodig.
De knoppen
- LAYOUT wisselt tussen KEYS en GRID. Het label toont in welke modus je je bevindt.
- - en + verplaatsen het octaaf. Alleen in de KEYS-lay-out.
- VOL opent een volumepaneel boven het toetsenbord - sleep de balk om het niveau in te stellen. Tik nogmaals op VOL om het te sluiten.
- DEMO speelt zelf een melodie af en licht elke toets op terwijl deze gaat.
- WAVE schakelt de toon tussen SOFT, ORGAN en BRIGHT. Het start op ORGAN, wat het beste past bij deze kleine luidspreker, maar probeer alle drie.
Volumeregeling
De versterker op dit bord is echt luid - 3,2 W in een 4 Ω-luidspreker - dus de mogelijkheid om het volume te verlagen is belangrijk. Tikken op VOL schuift een paneel over het toetsenbord met een grote versleepbare balk; het huidige niveau wordt ook permanent weergegeven in de bovenste balk.
Terwijl het paneel open is, slikt het opzettelijk elke aanraking onder de bovenste balk in, zodat je niet per ongeluk noten kunt laten klinken. De instelling wordt toegepast als een enkele vermenigvuldiging wanneer de gemengde audio wordt geschaald naar 16-bit, wat niets kost tijdens het draaien en de demomelodie eveneens beïnvloedt. Pas VOL_STEPS in de sketch aan als je fijnere of grovere stappen wilt dan de standaard tien.
Geen WiFi, geen accounts, niets om in te stellen
Het is de moeite waard om dit duidelijk te zeggen, omdat elk ander project in deze serie een account ergens nodig heeft: dit project niet. Er is geen secrets.h om in te vullen, geen API-sleutel, geen netwerk. Flashen en spelen. Van alles wat voor dit bord is gebouwd, is dit het project om aan een beginner te geven.
Probeer een akkoord
Druk drie of vier toetsen tegelijk in. De aanraakcontroller volgt vijf vingers, dus ze klinken allemaal samen - dat is het moment waarop het niet meer als een pieper voelt, maar als een instrument.
Over het MaTouch AI ESP32-S3 2.8" bord
Elk project op deze pagina draait op de MaTouch AI ESP32-S3 2.8" TFT ST7789V van Makerfabs. Het is een alles-in-één-bord: een kleuren-touchscreen, een 3 megapixelcamera, twee microfoons en een echte luidsprekerversterker, allemaal aangestuurd door een ESP32-S3 met 8 MB PSRAM. Die combinatie maakt deze AI-projecten mogelijk op een enkel bord zonder iets anders erop aan te sluiten.
De 8 MB PSRAM is belangrijker dan elk ander getal hier. Het is wat het bord in staat stelt om een cameraframe, een paar seconden opgenomen audio of een base64-gecodeerde foto tegelijkertijd in het geheugen te houden - niets daarvan past in het normale RAM-geheugen van de ESP32.
Fabrikantdocumentatie: Makerfabs-wikipagina.
Elk ander project voor dit bord - de camera, offline gezichtsherkenning, de AI-stemassistent, AI-visie en het tekenproject - heeft zijn eigen tutorial. Links naar allemaal staan onder dit artikel.
Belangrijkste specificaties
- Processor: ESP32-S3, dual-core 240 MHz, WiFi 2.4 GHz + Bluetooth 5.0
- Geheugen: 16 MB flash, 8 MB PSRAM (vereist door bijna elk project hier)
- Display: 2.8" IPS, 320×240, ST7789V-driver, SPI
- Aanraking: GT911 capacitief, volgt 5 vingers tegelijk
- Camera: OV3660, 3 megapixel, tot 2048×1536
- Microfoons: twee INMP441 I2S digitale microfoons (een echt stereopaar)
- Luidspreker: MAX98357A klasse-D-versterker, 3,2 W in 4 Ω
- Opslag: microSD-kaartsleuf (SPI-modus)
- Voeding: USB-C, JST-accuconnector, TP4056-lader, aan/uit-schakelaar
- Ook op het bord: WS2812B RGB-LED, PCF8563T realtimeklok met batterijback-up en een MAX17048-accu-indicator die niet in de officiële specificaties staat vermeld
USB CDC On Boot in op Disabled. Gebruik de verkeerde poort en audio zal zich misdragen of uploads zullen mislukken.Voed je het via een accu? De twee USB-C-aansluitingen, de TP4056-lader en de aan/uit-schakelaar worden volledig uitgelegd, met het schema, in het bordtestartikel — inclusief welke aansluiting laadt en of de schakelaar aan of uit moet staan.
Arduino IDE-instellingen
Deze instellingen zijn belangrijk. De meeste problemen die mensen met dit bord melden, zijn een van deze die verkeerd is, en ze worden gereset wanneer je de core-versie wijzigt, dus controleer ze opnieuw na elke wijziging.
| Instelling | Waarde |
|---|---|
| Board | ESP32S3 Dev Module |
| ESP32 core-versie | 2.0.17 |
| PSRAM | OPI PSRAM |
| Flash-grootte | 16MB (128Mb) |
| Partitieschema | 16M Flash (3MB APP/9.9MB FATFS) |
| USB CDC bij opstarten | Uitgeschakeld |
| Uploadsnelheid | 921600 |
| Flash volledig wissen vóór uploaden | Uitgeschakeld |
| Poort | de CH340K USB-C-poort |
Als het uploaden mislukt: het board handmatig in downloadmodus zetten
Meestal druk je gewoon op Upload en het werkt. Soms niet - de IDE blijft bij Connecting...... hangen en geeft dan op met Failed to connect to ESP32-S3: No serial data received.
Dat gebeurt omdat IO0 op dit board drie taken tegelijk heeft: het is de BOOT-knop, het is de auto-resetlijn van de CH340K, en het is de datalijn voor de RGB-LED. Wanneer de sketch die al op het board draait die LED aanstuurt, kan deze de automatische reset verstoren, waardoor de chip opnieuw opstart in je oude sketch in plaats van in de bootloader.
De oplossing duurt vijf seconden. Zet het board zelf in downloadmodus:
- Houd de BOOT-knop ingedrukt.
- Terwijl je BOOT nog ingedrukt houdt, druk je op RESET en laat je RESET los.
- Laat nu BOOT los. Het scherm wordt leeg - dat is de bootloader die wacht.
- Klik op Upload.
- Wanneer het klaar is, druk je eenmaal op RESET om de nieuwe sketch uit te voeren.
Als het nog steeds geen verbinding maakt, verlaag dan Upload Speed naar 115200 en probeer het opnieuw. Controleer ook of de aan/uit-schakelaar van het board aan staat - de CH340K wordt geënumeerd en geeft je een COM-poort, zelfs wanneer het board zelf is uitgeschakeld, wat mensen voor de gek houdt.
Vereiste bibliotheken
Dit project heeft elke bibliotheek in de onderstaande tabel nodig - niets meer, niets minder. De meeste installeer je rechtstreeks via Tools → Manage Libraries in de Arduino IDE, maar GFX Library for Arduino moet vanuit een ZIP-bestand worden geïnstalleerd. De versienummers zijn belangrijk, dus gebruik precies de vermelde versies.
| Bibliotheek | Versie | Auteur | Installeren vanuit |
|---|---|---|---|
| GFX Library for Arduino | 1.5.6 | moononournation | ZIP-bestand - zie hieronder |
| bb_captouch | 1.3.1 | Larry Bank | Library Manager |
| Adafruit NeoPixel | elke recente | Adafruit | Library Manager |
De GFX-bibliotheek installeren vanuit een ZIP-bestand
- Download het ZIP-bestand. Het is inbegrepen in de download van dit project, of je kunt het verkrijgen via de Arduino_GFX-repository - klik op de groene Code-knop en vervolgens op Download ZIP.
- Sla het op een plek op waar je het terug kunt vinden. Pak het niet uit.
- Klik in de Arduino IDE op Sketch → Include Library → Add .ZIP Library.
- Blader naar het ZIP-bestand dat je hebt gedownload en klik op Open.
- De IDE installeert het en bevestigt dit onderaan het venster. Als je al een 1.6-versie hebt geïnstalleerd, verwijder dan eerst die map uit
Documents/Arduino/libraries, anders zullen de twee conflicteren.
Problemen oplossen
| Symptoom | Oorzaak en oplossing |
|---|---|
| Scherm blijft zwart | Verkeerde GFX-bibliotheekversie (gebruik 1.5.6) of verkeerde boardinstellingen. |
PSRAM alloc failed |
Tools → PSRAM staat niet op OPI PSRAM. |
| Niets uploadt / geen COM-poort | Verkeerde USB-C-poort, of de CH340-driver is niet geïnstalleerd. |
Hulpmiddelen en referenties
Nog geen middelen.
Bestanden📁
Geen bestanden beschikbaar.