Verwenden Sie dabei als Kodierung Unsigned 8 Bit PCM. Fast jedes Audioschnittwerkzeug ist in der Lage, diese Aufgabe zu erledigen. Falls Sie noch kein Audio-Tool auf Ihrem Rechner haben, installieren Sie am besten Audacity [10]: Die freie Software lässt sich leicht bedienen und ist für Linux, MacOS und Windows verfügbar.
Um die WAV-Datei in ein Array für die Arduino IDE umzuwandeln, setzen Sie das Kommandozeilenwerkzeug Xxd ein, das Hexdumps erstellt. Es findet sich im Fundus aller gängigen Linux-Distributionen, auch in den Pi-OS-Repos. Windows-User müssen es aus dem Internet herunterladen [11].
Mit dem Kommando xxd -i Eingabe.wav > Ausgabe.h erzeugen Sie nun aus der Tondatei den gewünschten Hexdump. In unserem Beispiel lautet der Aufruf konkret xxd -i horse.wav > horse.h. Die Ausgabedatei müssen Sie jetzt nur noch in Ihr Arduino-Projekt hineinkopieren und die IDE einmal neu starten. Anschließend sehen Sie einen zusätzlichen Reiter mit dem Namen Ihrer Datei (Abbildung 3).
Danach müssen Sie die Definition der Arrays noch ein wenig anpassen. Sie erweitern sie um das Schlüsselwort PROGMEM, damit die Daten nicht im Variablenspeicher des ESP32 landen. Die konkrete Definition für das Pferde-Beispiel würde unsigned char PROGMEM horse_wav[] lauten.
Programm
In Listing 1 sehen Sie das Programm, das den Versuchsaufbau steuert. Die ersten fünf Zeilen importieren die Sounds für die Tiere sowie die Bibliothek zur Soundwiedergabe, die nächsten fünf erzeugen Klassen für jeden Sound und für den Audioausgang. Dieses Projekt erfordert in der einleitenden Funktion setup() keinen Code (Zeilen 12 und 13).
Listing 1
ESP32_Sound.ino
#include "cat.h"
#include "cow.h"
#include "dog.h"
#include "horse.h"
#include "XT_DAC_Audio.h"
XT_Wav_Class PlayDog(dog_wav);
XT_Wav_Class PlayCat(cat_wav);
XT_Wav_Class PlayCow(cow_wav);
XT_Wav_Class PlayHorse(horse_wav);
XT_DAC_Audio_Class DacAudio(25,0);
void setup() {
}
int level = 20;
int t5=0,t6=0,t7=0,t8=0;
void loop() {
DacAudio.FillBuffer();
if(touchRead(T5)<level) t5++; else t5=0;
if(touchRead(T6)<level) t6++; else t6=0;
if(touchRead(T7)<level) t7++; else t7=0;
if(touchRead(T8)<level) t8++; else t8=0;
if (t5>3&PlayDog.Playing==false)DacAudio.Play(&PlayDog);
if (t6>3&PlayCat.Playing==false)DacAudio.Play(&PlayCat);
if (t7>3&PlayCow.Playing==false)DacAudio.Play(&PlayCow);
if (t8>3&PlayHorse.Playing==false)DacAudio.Play(&PlayHorse);
}
Jetzt folgt ein etwas kniffligerer Teil: Die Touch-Sensoren erzeugen stark schwankende Werte. Über die Variable level (Zeile 15) legen wir fest, ab welchen Wert die Sensoren auslösen sollen. Der Wert der Variablen kann sich dabei von Aufbau zu Aufbau unterscheiden.
Die Sensoren produzieren im Betrieb zu allem Übel noch einiges an Rauschen, melden sich also eventuell auch ohne Berührung. Um das Problem zu lösen, fragen wir zuerst den Wert der Sensoren ab (Zeile 18). Anschließend prüfen wir, ob der Schwellwert unterschritten wurde (Zeile 19 bis 22) – die Touch-Eingänge haben normalerweise einen hohen Wert, der sich verringert, sobald man sie berührt.
Löst ein Sensor viermal hintereinander aus, wird der Sound abgespielt (Zeile 23 bis 26). Das steuern die in Zeile 16 definierten Variablen t5 bis t8. Damit es nicht zu wild wird, verhindern wir das Abspielen eines Sounds, falls er schon läuft. Verschiedene Tiere wie Hund und Katze im Duett dürfen hingegen gleichzeitig loslegen. Möchten Sie das Spektakel live hören, schauen Sie doch einmal bei Youtube [12] vorbei.
Fazit
Der ESP32 bietet beeindruckende Möglichkeiten. Er bringt viele I/O-Schnittstellen mit, die man vor einigen Jahren noch extern an Mikrocontroller anschließen musste. In Kombination mit der leitenden Farbe lassen sich viele interessante Projekte aufbauen, der eigenen Fantasie sind dabei kaum Grenzen gesetzt. (cla)
Der Autor
Martin Mohr hat die komplette Entwicklung der modernen Computertechnik live miterlebt. Nach dem Studium entwickelte er Überwiegend Java-Applikationen. Mit dem RasPi erwachte seine alte Liebe zur Elektronik wieder.
Infos
- Leitfähige Farbe: Martin Mohr, “Malen statt Ätzen”, RPG 01-02/2022, S. 30, https://www.raspi-geek.de/46345
- Mini-Boxen: https://www.amazon.de/Trust-Lautsprecher-USB-Stromversorgung-Smartphone-schwarz/dp/B00JRW0M32/
- Verstärkermodul: https://www.amazon.de/gp/product/B08SM2XGMV/
- Lautsprecher: https://www.amazon.de/gp/product/B0894NY3SZ/
- Bilder: https://www.vecteezy.com/free-vector/animal-icons
- Farbe: https://www.reichelt.de/leitfaehige-farbe-stift-10-ml-bc-ep-10ml-p178668.html
- Sounds: https://freeanimalsounds.org/farm-animals/
- ESP32-Basics: Martin Mohr, “Sanfter Einstieg”, RPG 01-02/2022, S. 56, https://www.raspi-geek.de/47058
- Soundbibliothek: https://www.xtronical.com/the-dacaudio-library-download-and-installation/
- Audacity: https://www.audacityteam.org
- Xxd for Windows: https://sourceforge.net/projects/xxd-for-windows
- Hund, Katze und Kuh im Konzert: https://youtu.be/WTURHKR34mE






