Merge #31 NodeSP2 added. Minor formatting and (re-)moved webm

epvpn
bruegeln 3 years ago
parent 8faef45da4
commit ebc0b09bb1

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

@ -0,0 +1,119 @@
---
title: NodeSP Part II (Digital)
author: kaqu
status: Aktiv
difficulty: geht so ...
time: ~1h
date: 2020-08-01
image: /projekt/2020/nodesp2/NodeSP2_Overview.jpg
keywords: Odroid-Go,ESP32,FFT,Assembler,S32C1I,Semaphore
---
## 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.
{{<fluid_img alt="Showtime" src="/projekt/2020/nodesp2/NodeSP2_Overview.jpg" >}}
## 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?!
<img width="320" height="240" alt="Oszi Timing 1" src="/projekt/2020/nodesp2/NodeSP2_Oszi1.png">
<img width="320" height="240" alt="Oszi Timing 2" src="/projekt/2020/nodesp2/NodeSP2_Oszi2.png">
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 ;-) .
{{<fluid_img alt="INMP441" src="/projekt/2020/nodesp2/NodeSP2_INMP441.jpg" >}}
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* |
{{<fluid_img alt="Connections" src="/projekt/2020/nodesp2/NodeSP2_Connections.jpg" >}}
## 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:
<video width="640" height="480" controls>
<source src="//media.hacknology.de/images/NodeSP2/NodeSP2.webm" type="video/webm">
Your browser does not support the video tag.
</video>
## 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?) ...
Loading…
Cancel
Save