holzskelett

This commit is contained in:
Alexander Alber 2022-10-13 21:15:03 +02:00
parent 9e2918133e
commit 060324c5a3
7 changed files with 25 additions and 13 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
venv

View File

@ -1,3 +1,4 @@
Fusion Zauberstab
=================
<!--- Vorspann --->
@ -36,7 +37,7 @@ Fusion Zauberstab
- Aufbau des Projekts
- Apps
# Bedienung (teil von software?)
# Bedienung (Teil von Software?)
- Double tap
- Verwendung von Interrupts
- ESP32 Deep Sleep
@ -52,4 +53,4 @@ Fusion Zauberstab
# Praxistest
- (Fusion Bilder)
- beaterkennung funktioniert je nach musik, fackel immer
- beaterkennung funktioniert je nach musik, fackel immer

View File

@ -5,12 +5,11 @@ Die erste von zwei Animationen besteht aus einer Welle, welche von jedem zweiten
Dafür muss zu jedem Zeitpunkt sowohl die Frequenz als auch die Phase des beats bekannt sein, und das auch über kürzere Störungen oder komplexere Rythmen hinweg.
Die zentrale Idee des Algorithmus ist es, Bandpassfilter mit schwacher Dämpfung als Phasenschätzer zu missbrauchen.
Hierfür wird eine ganze Reihe an Bandpässen mit unterschiedlichen Durchlassfrequenzen parallel geschaltet. Diese Durchlassfrequenzen gehören zu unterschiedlichen beat-Geschwindigkeiten. In unserem Fall von 105 bis 150bpm, weil sich hier die elektronische Tanzmusik meistens abspielt. Auf jeden dieser Bandpässe wird nun die Signalenergie gegeben. Der Bandpass, der sich daraufhin am meisten aufschwingt, hat dann offensichtlich am besten die richtige Geschwindigkeit getroffen.
Hierfür wird eine ganze Reihe an Bandpässen mit unterschiedlichen Durchlassfrequenzen parallel geschaltet. Diese Durchlassfrequenzen gehören zu unterschiedlichen beat-Geschwindigkeiten. In unserem Fall von 105 bis 150bpm, der typische Bereich elektronischer Tanzmusik. Auf jeden dieser Bandpässe wird nun die Signalenergie gegeben. Der Bandpass, der sich daraufhin am meisten aufschwingt, hat dann offensichtlich am besten die richtige Geschwindigkeit getroffen.
Jetzt nochmal von vorne und im Detail - diesen Abschnitt gerne überspringen: Zuerst sammeln wir samples vom Mikrofon. Wir ziehen den gleitenden Durchschnitt ab, um ein Audiosignal zu erzeugen, welches um Null herum schwingt. Über jeweils ein chunk - eine Vierzigstelsekunde - summieren wir über quadrierte samples, um die Signalenergie in diesem chunk zu erhalten. Alles weitere passiert nun ebenfalls 40 mal die Sekunde. Wir geben die Signalenergie gleichzeitig auf alle Bandpässe - ebenfalls 40 an der Zahl - und schauen welcher davon sich am weitesten aufschwingt. Als relativen Amplitudenschätzer filtern wir die Absolutwerte aller Bandpassausgänge und setzen regelmäßig den Bandpass mit dem höchsten entsprechenden Wert auf aktiv. Nun haben wir das Problem, dass der Bandpass einmal pro beat schwingt, unsere gewollte Animation aber zwei beats benötigt. Wir müssen also irgendwie die Frequenz halbieren. Dafür verzögern wir das Signal um Pi/4 und schätzen mit der atan2-Funktion die Phase. Mit der bekannten Phase und einem einfachen Zustandsautomat konstruieren wir uns eine neue Phase, die nur halb so schnell steigt. Diese skalieren wir linear auf eine Sollposition des Maximums der Lichtwelle.
Im Detail: Zuerst sammeln wir samples vom Mikrofon. Wir ziehen den gleitenden Durchschnitt ab, um ein Audiosignal zu erzeugen, welches um Null herum schwingt. Über jeweils ein chunk - eine Vierzigstelsekunde - summieren wir über quadrierte samples, um die Signalenergie in diesem chunk zu erhalten. Alles weitere passiert nun ebenfalls 40 mal die Sekunde. Wir geben die Signalenergie parallel als input auf alle Bandpässe - zufällig ebenfalls 40 an der Zahl. Der Bandpass, der sich am weitesten aufschwingt, wird wohl der richtige sein. Nun haben wir das Problem, dass der Bandpass einmal pro beat schwingt, unsere gewollte Animation aber zwei beats benötigt. Wir müssen also irgendwie die Frequenz halbieren. Dafür verzögern wir das Signal um Pi/4 und schätzen mit der atan2-Funktion die Phase. Mit der bekannten Phase und einem einfachen Zustandsautomat konstruieren wir uns die Phase eines Schwingers mit halber Frequenz. Diese Phase skalieren wir linear und erhalten so die Sollposition des Maximums der Lichtwelle.
Wir wissen nun also zu jedem Zeitpunkt die Position des Scheitelpunktes der Lichtwelle. Die LEDs davor und dahinter werden ebenfalls angesteuert aber mit abfallender Helligkeit, so dass ein Verlauf entsteht.
Die Maxima für den roten und blauen Kanal sind dabei gegenläufig verschoben, so dass ein räumlicher Farbverlauf entsteht.
Wir wissen nun also zu jedem Zeitpunkt die Position des Scheitelpunktes der Lichtwelle. Um diese Position herum wird die Helligkeit langsam gesenkt und damit die Welle geformt. Die Maxima für den roten und blauen Kanal sind dabei gegenläufig verschoben, so dass ein räumlicher Farbverlauf entsteht.
Das Ganze ist hier illustriert:

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -0,0 +1,3 @@
import matplotlib.pyplot as plt

View File

@ -0,0 +1,10 @@
# Holzskelett
Um dem Ei trotz der dünnen Schalt ausreichend Steifigkeit zu verleihen, wird es innen durch ein Holzskelett verstärkt.
Dieses ist so konstruiert, dass es sich im Inneren des Vasenteils zusammen bauen und verkleben lässt und es so von innen aussteift.
Gleichzeitig sind alle Teile des Holzskelett prismatisch, lassen sich also im Lasercutter herstellen. Das ist hier dargestellt:
![holzskelett](grafiken/cad/zusammenbau4.png "Holzskelett")
In der Praxis überlebten die Eier dank dem Skelett auch die eine oder andere rauhe Behandlung und Katzenattacke.

View File

@ -1,21 +1,19 @@
# Konzept
Der weiße Teil des Eis besteht aus drei Teilen, die jeweils 3D-gedruckt sind. Der mittlere dieser Teile ist für schnellen Druck im Vasenmodus ausgeführt - mehr dazu später.
Der weiße Teil des Eis besteht aus drei vertikal gestapelten Teilen, die jeweils 3D-gedruckt sind. Das mittlere dieser Teile ist für schnellen Druck im Vasenmodus ausgeführt - mehr dazu später.
Im Inneren des mittleren weißen Teils befindet sich zur Stabilisierung ein geklebtes Skelett aus lasergeschnittenem Holz. Dieses ist formschlüssig mit dem mittleren weißen Teil verbunden und mit den äußeren weißen Teilen verschraubt.
Im Inneren der Vase befindet sich zur Stabilisierung ein geklebtes Skelett aus lasergeschnittenem Holz. Dieses ist formschlüssig mit der Vase verbunden und mit den anderen beiden weißen Teilen verschraubt.
Im Inneren des Holzskeletts ist eine Holzplatte eingespannt, welche als Träger der Elektronik fungiert.
Das Gesamtkonzept ist in der folgenden Explosionsansicht illustriert:
TODO explosionsansicht
![explosion](grafiken/cad/explosion.png "Explosionsansicht")
Das Ei sitzt auf einem gedruckten Sockel, die Verbindung wird über Schrauben hergestellt.
Das Ei sitzt verschraubt auf einem gedruckten Sockel. Dieser enthält einen kreisförmigen Schlitz, um ein handelsübliches Alurohr aus dem Baumarkt aufzunehmen. Die leichte Spielpassung in Verbindung mit den typischen Druckertoleranzen sorgt hier für einen stabilen Reibkraftschluss.
Der Sockel enthält einen runden Schlitz, um ein handelsübliches Alurohr aus dem Baumarkt hereinzustecken. Die leichte Spielpassung in Verbindung mit den typischen Druckertoleranzen sorgt hier für einen Reibkraftschluss.
Im Inneren befindet sich ein ESP32 als Mikrocontroller, ein Mikrofon, ein Beschleunigungssensor, ein 10Ah USB-Reiseakkupack und drei WS2812 LED-Bänder.
Im Inneren befindet sich ein ESP32 Mikrocontroller, ein Mikrofon, ein Beschleunigungssensor, ein 10Ah Reiseakku und drei WS2812 LED-Bänder.
Auf dem ESP32 läuft ein in C++ geschriebenes Programm, welches zwischen verschiedenen Animationen umschaltet. Die Umschaltung erfolgt durch den Beschleunigungssensor - ein doppeltes Aufstampfen des Stabes auf dem Boden wird hier als Umschaltsignal interpretiert.