Audio Board: Unterschied zwischen den Versionen
Marcel (Diskussion | Beiträge) (→Software) |
Marcel (Diskussion | Beiträge) (→Datenerfassung) |
||
Zeile 57: | Zeile 57: | ||
* adc.cpp, adc.h | * adc.cpp, adc.h | ||
* Nutzt ADCA Ch0, ADCB Ch0, DMA Ch1 und DMA Ch2 | * Nutzt ADCA Ch0, ADCB Ch0, DMA Ch1 und DMA Ch2 | ||
− | + | verbessern | |
+ | <br /> | ||
+ | |||
+ | Mit '''adc_startSampling()''' wird die Messung gestartet. '''adc_check()''' prüft ob die Messung fertig ist und setzt den globalen adc_state, welcher innerhalb der Hauptschleife abgefragt wird. | ||
== Auswertung == | == Auswertung == |
Version vom 18. Januar 2015, 15:15 Uhr
Ein Projekt, welches Lichter oder sonstige Geräte in Abhängigkeit von einem Audiosignal ansteuern kann. Die ursprüngliche Idee war es eine Matrix aus RGB-LEDs so anzusteuern, dass eine Lichtshow abläuft, welche durch die Frequenz und Geschwindigkeit eines Liedes beeinflusst wird.
Inhaltsverzeichnis
Idee
Ich wollte eine Beleuchtung haben, welche je nach Takt bzw. Frequenz einer Melodie ihre Farbe ändert. Es gibt zwar einige Projekte, welche LEDs aufblinken lassen, wenn ein Beat innerhalb eines Frequenzbandes vorliegt (z.B. diese Lichtorgel). Jedoch gibt es kein Projekt, welches komplexere zusammenhänge zwischen Licht und Musik erlaubt und vollkommen autark, ohne z.B. einen PC, arbeitet.
Konzept und Vorüberlegungen
Ein analoges Audiosignal von einem Klinkenstecker wird durch einen Mikrocontroller eingelesen. Die Daten werden ausgewertet und folgende Parameter berechnet: Amplitude, Beats und Intensität verschiedener Frequenzen. Diese Werte werden benutzt, um Farbveränderungen bzw. Animationen auf einer LED-Matrix zu steuern.
In einem ersten Test wurde eine Eingangs- und Filterstufe aufgebaut, welche ein Mono-Audiosignal aufbereitet. Ein atmega328 hat dieses Abgetastet und eine FFT des Signals durchgeführt. Damit wurde eine einzelne RGB-LED angesteuert. Diese hat ihre Farbe in Abhängigkeit der Frequenz geändert. Mit diesem System wurden die Grenzen des 16MHz schnellen atmega328 ausgetestet. Da dieser Controller nut mit 16MHz läuft waren diese Grenzen zwar schnell erreicht, jedoch waren die Ergebnisse schon sehr schön. Das Einlesen der Daten und die FFT wurde 10x pro Sekunde durchgeführt, so dass die resultierenden Daten für eine flüssige Animation gesorgt hat. Für ein Stereo-Signal wären jedoch nur noch 5 Updates der Daten pro Sekunde und Kanal möglich.
Für das fertige System sollte also ein anderer Controller zum einsatz kommen. Die Anforderungen waren: 2 ADC, DMA, auch für Hobby-Bastler leicht zu beschaffen, programmieren und löten. Daher wurde ein atxmega128-A3U gewählt. Dieser ist durch den Bootloader von diesem Projekt einfach zu programmieren, auch ohne Programmiergerät. Vorprogrammierte Controller sind bei ebay durch den Händler matrixprog erhältlich. Durch die Kombination aus 2 unabhängigen ADC und DMA kann ein Stereo-Audiosignal problemlos umgewandelt werden. Es sind genügend Pins und Hardwareresourcen vorhanden, um weitere Geräte, wie z.B. Taster und LCD anzuschliessen. Auch die Audio-Eingangsstufe wurde leicht angepasst.
Hardware
Das Audiosignal wird über einen Stereo-Klinkenstecker in das System eingegeben. Die Audio-Eingangsstufe beinhaltet eine AGC, welche die maximale Amplitude des Signales so begrenzt, dass es einem Überseuern entgegen wirkt. Ausserdem wird ein Bandpass-Filter eingesetzt, welcher alle Signale zwischen ca. 16Hz und 16kHz durchlässt. Der Aufbau der Eingangsstufe orientiert sich an diesem Projekt.
Als Controller wird ein atxmega128A3U eingesetzt. Die Hauptgründe dafür sind, dass er über 2 unabhängige ADC verfügt, damit linker und rechter Kanal gleichzeitig in ein digitales Signal umgewandelt werden kann, und dass DMA vorhanden ist, damit dieses Umwandeln komplett von der Hardware erledigt werden kann. Durch die Pinkompatibilität ist es möglich alle Controller der atxmega A3U Reihe einzusetzten. Je nach Anwendung ist jedoch mindestens der 128A3U anzuraten, da die kleineren Controller über weniger RAM verfügen. Alle nicht benutzten Leitungen sind herausgeführt und können frei verwendet werden.
Die Spannungsversorgung erfolgt entweder über USB oder ein 5V Netzteil. Dieses wird über einen Spannungsregler auf 3,3V heruntergesetzt, um den Controller damit zu versorgen. Es ist auch möglich das Board direkt mit 3,3V zu versorgen.
Download KiCAD und Gerber Dateien
Technische Details und Anmerkungen
- Der Controller arbeitet mit 3,3V, daher niemals mehr an den Signalleitungen anlegen
- Den internen Spannungsregler niemals mit mehr als 5V betreiben
- Jumper JP1 offen lassen, wenn mit Stereo-Signalen gearbeitet wird. Schliessen, um aus einem Stereo-Signal ein Mono-Signal zu machen
- Benutzte Pins:
- Port A, Pin 7: Audio Input
- Port B, Pin 0: Analoge Referenz Spannung
- Port B, Pin 1: Audio Input
- Port D, Pin 6 und 7: USB
- Pin Header P17 "Stereo Pot" war vorgesehen, um ein Potentiometer anzuschliessen, damit die Empfindlichkeit der Eingangsstufe eingestellt werden kann. Es hat sich jedoch gezeigt, dass dieses nicht notwendig ist. An P17 können Pin 1 und 3 bzw. Pin 2 und 4 direkt mit einem 100 Ohm Widerstand verbunden werden. (Wichtig für Nachbau!)
- Taster SW1 ist nicht verbunden. Dieser kann, je nach verwendetem Bootloader oder anderen Ansrpüchen frei benutzt werden
Konkreter Testaufbau
Ein Anwendungsbeispiel ist die Ansteuerung einer Matrix aus RGB LEDs. Es werden LEDs mit einem WS2812 Controller verwendet, da diese schon einen Treiber eingebaut haben und der Hardware Aufbau (zu ungunsten des Softwareteils) vereinfacht wird. Auf die LEDs wurden billige Tischtennisbälle (Bastelladen, EBay) geklebt und dienen als Diffusionsfläche für das Licht.
Auf einem kleinen Stück Lochrasterplatine befindet sich ein ca. 1" kleines OLED Display, welches mit I2C angesteuert wird, und ein Drehgeber mit eingebautem Taster. Diese Platine wird derzeit zum debuggen benutzt und soll es später ermöglichen zwischen unterschiedlichen Betriebsmodi zu wählen.
Der Audioverstärker mit Lautsprecher dient lediglich als Debug-Ausgabe für das Audiosignal, damit zu hören ist was am Ende des AGC und Filters herauskommt.
Das PC Netzteil versorgt die LEDs mit 5V und wird benötigt, da USB nicht genug Strom liefern kann. Die Versorgung der Logik erfolgt wahlweise über USB oder ebenfalls das Netzteil.
In der finalen Version soll die Logik in einem Holzkasten verschwinden und das PC Netzteil soll gegen ein kompakteres 5V Netzteil ausgetauscht werden. Dieser Kasten kann dann an die Wand gehängt werden und erzeugt dynamische Animationen mit Farbwechseln und -verläufen in Abhängigkeit zum eingegebenen Audiosignal. Eine mögliche Erweiterung wäre es ein Mikrofon einzusetzten, um das Audiokabel einzusparen. Dann würden jedoch alle Umgebungsgeräusche mit aufgenommen. Dies kann je nach Situation ein Vorteil oder Nachteil sein.
Software
Die Software ist natürlich je nach der Anwendung sehr unterschiedlich. Daher wird ein Basis-Quelltext angeboten, welcher die Datenerfassung und -auswertung für das Matrix-Projekt beinhaltet. Weitere Anpassungen sollten problemlos möglich sein.
Download des Quelltext (als Atmel Studio Projekt)
Im folgenden werden die grundlegenden Gedanken und Funktionen besprochen. Diese sollten eine eigenständige Weiterentwicklung vereinfachen.
Datenerfassung
- adc.cpp, adc.h
- Nutzt ADCA Ch0, ADCB Ch0, DMA Ch1 und DMA Ch2
verbessern
Mit adc_startSampling() wird die Messung gestartet. adc_check() prüft ob die Messung fertig ist und setzt den globalen adc_state, welcher innerhalb der Hauptschleife abgefragt wird.
Auswertung
- fffft.S, fffft.h, CFFT.cpp, CFFT.h
Für die Berechnung der FFT wird die FFT Lib von elmchan verwendet.