Sound Programmer

Seit einiger Zeit beschäftige ich mich mit einer möglichen Lösung zur Programmierung AVR Mikrocontroller mit Smartphones und Tablets. Dabei sind mir bisher zwei interessante Ideen im Netz aufgefallen. Die erste funktioniert leider nur auf Geräten mit einer USB-Host Schnittstelle. Die zweite benutzt die Audio-Schnittstelle zur Übertragung. Dabei befindet sich auf dem Controller ein Bootloader der das modulierte Signal demoduliert. Hier (auf hackaday) kann man sich einen Artikel dazu anschauen.
Von der zweiten Lösung bin ich sehr angetan, denn kaum ein Endgerät kommt ohne Audio-Schnittstelle daher. Selbst mein Kindle könnte damit umgehen. Die Lösung bringt allerdings ein Henne-Ei-Problem mit sich und ist für Neueinsteiger ein großer Nachteil. Ich muss den Bootloader auf den Controller bekommen. Vorher läuft nichts. Wie schon im Logbuch beschrieben suche ich jedoch nach einer einfachen und günstigen Lösung für den Einstieg. Es sollte doch irgendwie möglich sein eine Umsetzung von Sound auf SPI basteln zu können.
In das Thema einlesen
Nach ein paar intensiven Minuten mit dem Datenblatt zum ATtiny13a ist die Sache klar. Zum Programmieren brauchen wir nur ein Clock- und ein Datensignal sowie eine schaltbare Leitung für den Reset. Die einfachste Kommunikation mit dem Controller ist das Senden des "Programming Enable" Kommandos. Es besteht wie alle Programming Instuctions aus 4 Byte (0b10101100 0b01010011 0b00000000 0b00000000). Hat der Tiny diesen Befehl erhalten antwortet er mit einem 0x53 im 2. Byte der Rückmeldung. Für meinen ersten Test wird dieser Befehl mal in einem WaveFile codiert. Ob das Ganze funktioniert könnte man an einer LED erkennen die an der MOSI Leitung hängt.
Der Testaufbau
Für den Aufbau der kleinen Schaltung habe ich ein Steckbrett verwendet. Und so schaut das Ganze aus. Die Bauteile hat man eigentlich immer zur Hand. Nur für die Audiobuchse musste ein altes Motherboard geschlachtet werden.
Testaufbau SoundProgrammer
Der Testaufbau beinhaltet:
• AudioBuchse; linker Kanal mit 100nF an SCK (Clock); rechter Kanal mit 100nF an MOSI
• Resetschalter, mit dem die Resetleitung manuell nach Masse gezogen wird
• LED an MISO zeigt an ob die Datenübertragung funktioniert hat
• Tiny13a als Versuchskaninchen
• Spannungsversorgung mit max. 3V
Im folgenden Schaltpan ist das etwas besser zu erkennen.
Schaltplan SimpleSoundProgrammer
Für die Hardware wars das schon. Jetzt geht es an die Software.
Codierung in einem WaveFile
Wir bilden nun das SPI-Protokoll in einer Sounddatei ab. Ein Kanal übernimmt das Clocksignal, der andere die Daten. Und hier das Ergebnis für den Befehl Programming Enable.
52 49 46 46 78 2A 00 00 57 41 56 45 66 6D 74 20 12 00 00 00 01 00 
02 00 FF 00 00 00 FF 00 00 00 01 00 08 00 00 00 64 61 74 61 00 00 
00 82 00 FF FF FF 00 00 FF 00 00 FF FF FF 00 00 FF 00 00 FF FF FF 
00 FF FF FF 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 FF FF FF 00 00 
FF 00 00 FF FF FF 00 00 FF 00 00 00 FF 00 00 FF FF FF 00 FF FF FF 
00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 
FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 
00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00 00
Wer sich in das Thema Wav-Kodierung einarbeiten will findet hier (WAVE PCM soundfile format) in einem Artikel der Stanford University einen guten Einstieg. Auch ohne den genauen Aufbau der Riff Spezifikation zu kennen, sieht man im Hexdump wie die einzelnen Leitungen für Clock und Daten geschaltet werden.
Erste Messung und Erfahrungsbericht
Für den ersten Testlauf habe ich den MediaPlayer unter Windows verwendet. Mit anderen Playern hatte ich mit meiner selbst geschriebenen Datei noch keinen Erfolg. Beim ersten Abspielen der Datei lief nichts. Kein flackern der LED. :(
Mit dieser ersten Enttäuschung ging es dann ans Oszilloskop. Damit ich bei der Messung nicht ständig die Wiedergabe starten musste habe ich im Player die automatische Wiederholung aktiviert. Und siehe da, nach 4, 5 Durchläufen ... es geht! Tatsächlich antwortet die LED an der MISO Leitung mit einem schönen Flackern im Takt der Wiedergabe. Aber warum funktioniert das nicht beim ersten Mal. Ein Blick auf das Oszi zeigt das Problem. Die Signale sind nicht besonders sauber.
Erste Messung
Für den Versuch musste ich die Lautstärke am PC auf min. 90% einstellen. Also Vorsicht mit den eigenen Ohren und den HighEnd Lautsprechern. Die Zuverlässigkeit konnte ich steigern indem ich mit der Spannung noch weiter runtergegangen bin.
Ein zweiter Test mit dem Befehl zum Löschen des Speichers hat auch funktioniert. Es brauchte jedoch mehrere Anläufe für eine fehlerfreie Datei. Beim Erstellen mit dem Hex Editor verliert man schnell die Übersicht. Hier der Download zum selber ausprobieren.
Ein Hex2Wav Generator muss her
Die Erstellung der Wav-Dateien von Hand macht auf Dauer keinen Spaß. Deshalb habe ich mal angefangen das Ganze zu automatisieren. Mit den entstandenen Beispielen ist die Sache etwas aufregender denn man sieht etwas.
Beispiel 1 schaltet die MISO LED(PB1) ein.
Beispiel 2 schaltet die MISO LED(PB1) aus.
Beispiel 3 lässt die MISO LED(PB1) blinken.
Im nächsten Schritt gilt es den entstandenen Konverter mal fertig zu entwickeln und zugänglich zu machen. Bis dahin viel Spaß beim Nachbauen und Testen!
Update! (04.09.14) Hex2Wav Konverter ist online.
Links und Referenzen: