eigengott
Geowizard
Angeregt durch den Reaktivlicht-Thread habe ich angefangen, an einem Reaktivaudiomodul basierend auf einem ATtiny zu basteln. Das Projekt ist noch nicht fertig, aber ich habe es immerhin schon geschafft, ein 30s langes Soundsample abzuspielen.
Zur Technik: Ich verwende einen ATtiny 44V. Der hat genügend Port-Pins, hardwareunterstütztes SPI, einen ADC, genügend RAM, Watchdog und extreme Stromparmodi. Die Samples speichere ich auf einer gewöhnlichen SD-Karte, die via SPI an den ATtiny angeschlossen wird. LDR zur Aktivierung wie beim Reaktivlicht. Audio momentan per direkt angeschlossenem Piezo-Element.
Da der ATtiny keinen DAC besitzt und ich auch keinen externen anschliessen möchte (von R2R-Frickeleien ganz abgesehen), benutze ich Fast-PWM via Timer0 zur Ausgabe. Die Samples werden als Comparematch-Wert genutzt, an dem der PWM-Ausgang umschaltet. Das Timing um das nächste Sample zu laden bekommt man praktischerweise auch gleich von Timer0 - es wird einfach der Overflow-Interrupt dafür genutzt.
Macht bei 8 MHz Takt, 256 Schritten pro PWM-Zyklus eine Samplerate von 31250 Hz mit 8 Bit breiten Samples. Kein HiFi aber auch kein extremes Gekrächze.
Schon etwas frickeliger ist das Anbinden der SD-Karte. Die will ordentlich Initialisiert werden und danach muss man blockweise lesen. Da der ATtiny 44 genügend RAM hat (256 Byte), werden jeweils Blöcke zu 64 Byte gelesen und in dem insgesamt 128 Byte grossen Sample-Buffer gespeichert. Und zwar jeweils in die Hälfte, in der der "Audioplayer" (also die Timer0-Overflow-Routine) gerade nicht liest.
Auf FAT usw. habe ich komplett verzichtet. Die SD-Karte wird frisch formatiert und dann die PCM-Datei darufgeschrieben. Die liegt damit unfragmentiert auf der Karte. Mit einem Hex-Editor lässt sich der erste Datenblock bestimmen und dann wird einfach sukzessive eine vorgegebene Anzahl Blöcke gelesen und als Audio ausgegeben.
Momentan fehlt noch die Reaktiv-Funktion (trivial, da Code im Prinzip vorhanden), PowerManagement für die Karte (sprich: abschalten wenn sie nicht benötigt wird), Audio-Verstärkung und -Filterung.
Zur Technik: Ich verwende einen ATtiny 44V. Der hat genügend Port-Pins, hardwareunterstütztes SPI, einen ADC, genügend RAM, Watchdog und extreme Stromparmodi. Die Samples speichere ich auf einer gewöhnlichen SD-Karte, die via SPI an den ATtiny angeschlossen wird. LDR zur Aktivierung wie beim Reaktivlicht. Audio momentan per direkt angeschlossenem Piezo-Element.
Da der ATtiny keinen DAC besitzt und ich auch keinen externen anschliessen möchte (von R2R-Frickeleien ganz abgesehen), benutze ich Fast-PWM via Timer0 zur Ausgabe. Die Samples werden als Comparematch-Wert genutzt, an dem der PWM-Ausgang umschaltet. Das Timing um das nächste Sample zu laden bekommt man praktischerweise auch gleich von Timer0 - es wird einfach der Overflow-Interrupt dafür genutzt.
Macht bei 8 MHz Takt, 256 Schritten pro PWM-Zyklus eine Samplerate von 31250 Hz mit 8 Bit breiten Samples. Kein HiFi aber auch kein extremes Gekrächze.
Schon etwas frickeliger ist das Anbinden der SD-Karte. Die will ordentlich Initialisiert werden und danach muss man blockweise lesen. Da der ATtiny 44 genügend RAM hat (256 Byte), werden jeweils Blöcke zu 64 Byte gelesen und in dem insgesamt 128 Byte grossen Sample-Buffer gespeichert. Und zwar jeweils in die Hälfte, in der der "Audioplayer" (also die Timer0-Overflow-Routine) gerade nicht liest.
Auf FAT usw. habe ich komplett verzichtet. Die SD-Karte wird frisch formatiert und dann die PCM-Datei darufgeschrieben. Die liegt damit unfragmentiert auf der Karte. Mit einem Hex-Editor lässt sich der erste Datenblock bestimmen und dann wird einfach sukzessive eine vorgegebene Anzahl Blöcke gelesen und als Audio ausgegeben.
Momentan fehlt noch die Reaktiv-Funktion (trivial, da Code im Prinzip vorhanden), PowerManagement für die Karte (sprich: abschalten wenn sie nicht benötigt wird), Audio-Verstärkung und -Filterung.