Motivation
Für das Verständnis dieses Eintrags sollte man unbedingt diesen hier gelesen haben: https://www.hacknology.de/projekt/2020/nodesp/
Um die Schwächen der ersten Implementierung zu beseitigen, sollen ein I2S-Mikrofon und DMA-Transfer genutzt werden.
1. Versuch
Zunächst habe ich mir das I2S-Mikrofon von Adafruit besorgt (SPH0645 auf Breakout-Board). Außerdem habe ich zunächst noch im alten Kontext ‘NodeMCU’ gearbeitet. Nach längerem rumprobieren ohne Erfolg (inkl. fast aller im Internet auffindbarer Timing-Tricks), gab ich das Projekt zunächst wieder auf. Auch mit dem Oszi konnte ich das eigentliche Problem nicht identifizieren?!
Immer wieder war ich bei meinen Recherchen auch auf Hinweise gestoßen, wonach speziell dieses Mikrofon an der ESP32-I2S-Schnittstelle Probleme bereite, mit dem INMP441 jedoch eine Lösung bereit stünde. Ich habe mir dann diesen Typ schließlich ebenfalls besorgt.
2. Versuch
Nachdem ich zwischendurch mal was Lustigeres eingeschoben hatte ( https://www.hacknology.de/projekt/2020/pimpedwebcam/ ), habe ich mich schließlich an die Fortsetzung meiner Versuche gemacht. Zufällig hatte ich mir im Frühjahr auch ein Odroid-Go besorgt. Dies sollte die Basis meiner weiteren Versuche bilden.
Odroid-Go
Das Odroid-Go ist ein Konsolen-Emulator auf ESP32-Basis (siehe https://wiki.odroid.com/odroid_go/odroid_go ); Zu dieser Plattform finden sich nützliche Programmierhinweise z.Bsp. hier http://cool-web.de/esp8266-esp32/odroid-go-esp32-mit-arduino-programmieren-gpio-pinout-und-library-funktionen.htm . Mit diesen Informationen bewaffnet, sollte doch was gehen?
Aufbau
Das MEMS-Mikrofon (INMP441) habe ich leider verkehrt herum mit seinen Steckerleisten versehen (… funktioniert trotzdem ;-) .
Pin 1 auf der Steckerleiste am Odroid-Go ist auf der Rückseite gekennzeichnet. Die Verbindungsdrähte habe ich wie folgt aufgelegt:
Odroid-Go. | Aderfarbe | INMP441 |
---|---|---|
1/GND | sw | GND |
3/GPIO12 | ws | SCK |
4/GPIO15 | gr | WS |
5/GPIO4 | vt | SD |
6/VCC(3,3V) | ge | VDD |
Programmierung
Die Programmierung muß leider ohne Debugger erfolgen. Außerdem wird das Programm in eine ‘Firmware’-Datei konvertiert - und nicht direkt aus VSC geladen. Hierbei wird ein Bild für die Auswahl im Start-Programm hinzugefügt. Das Ergebnis wird unter odroid/firmware/NodeSP2.fw auf der vorbereiteten Micro-SD-Speicherkarte abgelegt. (alle Anleitungen hierzu unter https://wiki.odroid.com/odroid_go/odroid_go ). Wenn man jetzt beim Einschalten des Odroid-Go die Taste B gedrückt hält, wird das Start-Programm aktiviert. Hier kann mittels der Odroid-Funktionstasten (Steuerkreuz für rauf & runter, Taste A zur Auswahl) das gewünschte Programm (hier: NodeSP2) ausgewählt werden zwecks flashen (von externer Speicherkarte auf internen Speicher). Ein entsprechendes Script (ggf. an lokale Verhältnisse anpassen!) liegt mit den Sourcen auf https://git.hacknology.de/projekte/NodeSP2 .
Das Programm aktiviert die I2S-Schnittstelle, weist die passenden ESP32-I/O-Pins zu und startet eine im Hintergrund laufende Datensammel-Task. Diese füllt (ggf.) wechselweise zwei Ergebnispuffer. Das Auslesen erfolgt in der Standard-Arduino Task (loop()!) in der auch die Darstellung der Daten auf dem Display und die Tastenabfrage durchgeführt werden. Folgende Tasten sind mit Funktionen belegt: Steuerkreuz Rauf bzw. Runter ermöglichen das Verändern der Dämpfung (‘Empfindlichkeit’). Start Führt eine Geräuschunterdrückungsmessung durch, die anschließend angewandt wird Volume Schaltet die Tastenabfrage ab (falls der Lautsprecher aktiv ist, knackt es dort dann weniger …). Empfehlung: Lautsprecher ausstecken!
Da im Programm auch zwei boolsche Variablen zwischen beiden Tasks geteilt werden, d.h. beide haben - unter bestimmten Umständen - Schreibberechtigung, habe ich noch eine einfache (inlined!) Semaphorenlogik hinzugefügt … die hier eigentlich völlig überflüssig ist, jedoch zeigt wie der ESP32 atomare Operationen ermöglicht (S32C1I).
Showtime!
Zum Schluß noch ein kleines Demo:
Was bleibt zu tun?
Man könnte einen steckbaren Aufsatz für das Odroid-Go als Mikrofonhalterung mit FreeCAD konstruieren für den 3D-Drucker (oder gibt’s vielleicht schon?) …