Mittwoch, 17. Februar 2010

Erste Firmware für die LEDMatrix

Die Arbeiten an der Steuerplatine für Mike's LEDMatrix sind, wie ich in meinem letzten Post zu diesem Projekt bereits berichtet hatte, abgeschlossen und so musste die Firmware des LEDCube in den letzten Tagen daran glauben. Das Ziel war die Kommunikation mit dem Mikrocontroller per USB, zum Übertragen einzelner Frames, Ansteuern von Animationen/internen Funktionen und gemeinsames Dimmen aller LED's. Zudem sollte beim Start Mikes Start-Animation mit seinem Logo angezeigt werden.

Soweit fertig ist aus dieser Liste alles bis auf das Dimmen der LED's. Dazu müsste jedoch noch das eine oder andere geändert werden, was aber erstmal noch Zeit hat bis die LED's fertig verlötet sind.

Die erste alpha Version gibt es hier. Im Moment ist das ganze allerdings noch etwas experimentell und muss noch ausgiebig getestet werden.
Enthalten ist in dem Archiv die angepasste Firmware, der USBClient zum Testen der Verbindung, Mike's QT Oberfläche shinyLED zum klicken von Animationen. Weiterhin noch die Sourcen des USBaspLoader welcher später als Bootloader eingesetzt werden soll und noch ein paar Scripte und Tools zum konvertieren und übertragen von Animationen.

Das Bild oben zeigt übrigens die Matrix in Aktion. Das ganze ist allerdings direkt an ein Netzteil angeschlossen.

Mittwoch, 10. Februar 2010

USBaspLoader und der GCC-AVR (4.3.3) in Verbindung mit Ubuntu 9.10 (amd64)

Habe ich mich doch vor ein paar Monaten dazu entschlossen mein altes 8.10 Ubuntu (32Bit) durch die neue Ubuntu 9.10 (64 Bit) zu ersetzen. Bisher war ich auch weitgehend überzeugt von der Performance und der Verfügbarkeit der Softwarepakete. Sicher gibt es das eine oder andere Problem, wie zum Beispiel das kein Flash Plugin für den Firefox richtig läuft [solved] oder das manche Programme die libSDL verwenden sich nur mit kill -9 beenden lassen...

Alles in allem aber zu verkraften, Programme die nicht funktionieren werden ggf. aus den Sourcen kompiliert und das Problem ist erledigt.

Aber an manchen Stellen gibt es dann das eine oder andere Tool das einen Stunden seines Lebens kostet. So zum Beispiel der GCC (4.3.3) Compiler aus dem gcc-avr Paket.
Dieser beinhaltet laut diversen einschlägigen Foren eine bessere Optimierung des erzeugten Binary Codes. Optimiert wurde also auch die Option, welche beim übersetzen einer Firmware für Microkontroller normalerweise immer verwendet wird. Die Option -Os. Diese wird an den gcc übergeben um die "kleinstmögliche" Firmware zu generieren. Leider geht der löbliche Optimierungswahn der GCC Entwickler hier ganz klar am Ziel vorbei. Der optimierte Binary-Code ist wesentlich größer als der von älteren gcc-Versionen - tolle Sache...

Mein ATMega168 für den HackStick besitzt 16KB Flash Speicher wovon 2KB für einen Bootloader reserviert werden können. In meinem Fall soll im Bootloader die Firmware des USBaspLoader-Projektes laufen um den HackStick direkt per USB flashen zu können.
Da ist es nicht gerade förderlich, dass der gcc nicht dazu überredet werden kann den, in diesem Fall um 140 Byte(!!!) größeren Binary Code auf die ursprüngliche Größe von 2002 Byte zu verkleinern.

Die Firmware des Bootloaders ist durch das Überschreiten der 2048 verfügbaren Bytes natürlich nicht übertragbar. Zum Glück besitzt man ja nicht nur einen Rechner und so konnte ich die Firmware auf einem anderen kompilieren und übertragen, ohne mir einen älteren GCC installieren zu müssen. Über kurz oder lang kommt man aber bei Ubuntu 9.10 (amd64) nicht drum herum.

Schlussendlich ergab sich aus all dem ein Patch gegen die mittlerweile doch in die Tage gekommenen Version der Firmware des USBaspLoader vom 20.3.2009. Zum einen beinhaltet dieser Patch nun den neuesten Release von V-USB und kleinere Änderungen um den USBaspLoader auf einem ATMega168 lauffähig zu bekommen.

Dienstag, 9. Februar 2010

Mike's LED Matrix - 1000'de Lötstellen später...

Das Projekt schreitet voran und nach einer mehr als 13 stündigen Löt-Session sind nun zumindest die Masseleitungen der LED's (Mikes Aufgabe) und die Steuerplatine (meine Aufgabe) fertig. Rechts ein Bild der unverbundenen LED's.
Besonders aufgefallen ist bei den LED's, dass wohl nur 2 Stück von den 441 (500 wurden bestellt) defekt waren oder eher defekt gemacht wurden... ;)

Sobald die Steuerplatine und die LED Matrix in ein paar Tagen verheiratet wurden, werden wir ein Video drehen das die ersten Animationen und Bilder der ersten Tests zeigt. Die originale Firmware des LED Cube's ist ohne Anpassungen auf unserer Platine bereits am laufen und muss nur noch auf unsere Anforderungen (USB Datenübertragung und Regelung der Leuchtintensität der LED's) angepasst werden.

Hier im Voraus ein Bild der fertigen Steuerplatine.


  • links oben der Spannungsregler mit Power-LED, an dem ein 9V Block angeschlossen ist
  • links der AVR-Mikrokontroller (ATMega32)
  • links unten der USB-Anschluss
  • rechts vom Microkontroller sind die 8 N-MOSFET's zu sehen
  • die 8 IC's (D-type Latches) steuern die LED's und sind mit den Steckverbindern verbunden
Der 9V Block wird nur zum Testen der Schaltung verwendet. Später wird das Netzteil des Rechners, der die Daten per USB an den Microkontroller übergibt, diese Aufgabe übernehmen.

Dieser Marathon wird Mike und mir sicher ewig ins Gehirn gebrannt bleiben und die Anzahl der zu verarbeitenden Bauteile wird sich in Zukunft auch sicher in kleineren Dimensionen bewegen.

Mehr dazu in Kürze hier...

Donnerstag, 4. Februar 2010

Mike's LED Matrix

Seit längerem haben Mike und ich das vorhaben, in die Frontblende dieses MP3-Player's eine LED Matrix ein zu bauen. Diese Matrix soll dann per Microkontroller gesteuert werden, der wiederum seine anzuzeigenden Daten per USB von dem ThinClient aus dem MP3-Player erhält. Es geht bei diesem Projekt übrigens um 441 blaue, ultrahelle 3mm LED's die mit 441 Halterungen in die 5mm Löcher der Blende befestigt werden .

Als Referenzprojekt verwenden wir die LED-Cube und den Borg3d Würfel.

Da die Liste der Bauteile aber bei beiden Projekten teils unvollständig oder nicht zufriedenstellend war gibt es unsere Liste hier online bei Reichelt. Die LED's und die Halterungen wurden jeweils bei 2 anderen Shops online bestellt.

Jetzt könnte man sich fragen wieso man als Referenz eine 3D Anordnung für eine 2D Matrix verwendet. Ganz einfach, bei einem 8x8x8 Würfel gibt es 512 LED's zum ansteuern. Unsere Matrix besitzt nur 21 x 21 = 441 LED's, was übrigens an der Optik in der Frontblende liegt. Es fällt also eine gesamte 8x8 Ebene aus der Würfeldarstellung weg. Zudem wird die 7te Ebene nicht vollständig ausgenutzt, was aber keinen Nachteil ergibt. Die überschüssige 8te Ebene wird dann vor der Inbetriebnahme aus der Software entsprechend heraus gepatcht. Die Ebenen werden einfach Schachbrett-Artig nebeneinander angeordnet. Bei dem rechten und unteren Rand muss jedoch ein wenig getrickst werden.

Als Firmware wird die des LED-Cube's verwendet, da diese gut strukturiert ist, und vor allem einfacher zu verstehen war da der Code extrem kurz, gut dokumentiert und anpassungsfähig ist.

Nun zum ansteuern der Matrix. Sie wird per Multiplexing angesteuert, wie das ganze funktioniert ist sehr gut auf diesen beiden Videos dargestellt. [#1] [#2]
Kurz: Damit wird ermöglicht jede einzelne LED auch einzeln leuchten zu lassen.

Mike arbeitet bereits an einer auf QT basierenden Software mit der man die einzelnen Frames für die Matrix "klicken" kann.
Jetzt fehlt nur noch die Hardware. Bestellt ist alles, aber noch nicht ausgeliefert...

Sobald das Projekt komplett aufgebaut und die Software fertig ist gibt es hier dazu mehr.