Posts mit dem Label XMega-Board werden angezeigt. Alle Posts anzeigen
Posts mit dem Label XMega-Board werden angezeigt. Alle Posts anzeigen

Freitag, 4. April 2014

Autonomous Light Controller - Hardware Synthese


Und dann war da noch die Sache mit dem FPGA. Bevor ich mit diesem Projekt angefangen habe wusste ich nichts darüber, außer das die Dinger schnell sein müssen. Schneller als ein CPLD zumindest, damit hatte ich schon einmal Kontakt als es darum ging Linux mittels einem PassMe auf einem Nintendo DS booten zu können. Das gute beim ersten Kontakt mit dieser Art Baustein war, dass man es mit JTAG ansprechen konnte. Und wenn man in ein Entwicklungs-Board wie das DE0-Nano investiert sogar komfortabel per USB damit arbeiten kann. Allerdings ist so ein FPGA (wiedererwarten) alles andere als ein besserer Mikrocontroller- so meine erste Annahme. Ein FPGA ist für mein Empfinden mittlerweile eine Spielwiese der nur die eigene Rechenkapazität im Gehirn eine Grenze setzt (ja ich weiß sehr hochgestochen).
Die erste Sache die man sich als Software-Entwickler aus dem Kopf schlagen muss, wenn man mit einem FPGA arbeiten möchte, ist das man da ein Programm für schreibt das darauf läuft. Zumindest wenn man VHDL (Very High Speed Integrated Circuit Hardware Description Language) sieht das dann sogar noch wie ein Programm aus. Es verhält sich aber in sehr vielen Punkten einfach so wie man es erwartet. Das fängt an bei parallelen Prozessen, dass Variablen einen bösen Beigeschmack haben können und endet bei der Synchronisierung von Signalen in verschiedenen Clock-Domains. Beißt man sich jedoch durch das Thema durch hat man jedoch ein wirklich sehr komfortables und mächtiges Werkzeug in der Hand um verschiedenste Probleme lösen zu können.
Wie ich bereits in einem früheren Post geschrieben habe, verwende ich für den analogen Teil einen DSP, der in der Lage ist analoge Videosignale in ITU-R BT.656 kodierte Daten zu transformieren. Diese Daten werden in meinem Fall mit 27MHz bitparallel aus dem DSP mit einer Farbtiefe von 10Bit heraus getaktet.
Für den von mir verwendeten XMega deutlich zu schnell wenn man bedenkt das dieser mit 32MHz läuft und ca. 1-2 Takte benötigt um einen einzelnen Pin auszulesen.

Mit der richtigen Hardware-Synthese im richtigen FPGA sind diese Laufzeiten jedoch kein Problem. Was also muss die Hardware-Synthese tun damit das Ergebnis für Ausgabe auf LED-Streifen als Hintergrundbeleuchtung für einen Bildschirm verwendet werden kann. Es ist recht simpel. Der FPGA muss die Pixeldaten taktgesteuert annehmen, puffern, herunter skalieren (von beispielsweise einer PAL-Auflösung) auf eine vom XMega verarbeitbare Pixel-Größe, und ausgeben des Ergebnisses an den XMega. Und all das so, dass mindestens 25 Bilder pro Sekunde verarbeitet werden können um unschönes Geflacker zu vermeiden.

Meine Logik auf dem FPGA realisiert genau das. Zur Laufzeit werden alle Pixeldaten (eines Halbbildes) eingelesen und in einen kleinen OnChip-RAM gepuffert. Gleichzeitig wird über einen Hardware-Algorithmus die Auflösung des Eingangs-Bildes auf 20x20 Pixel skaliert. Warum nur ein Halbbild verwendet wird liegt daran, dass es unnötig ist die volle Auflösung beim Eingangs-Bild zu verwenden wenn man es Bild danach auf ein gerade noch verwendbares Minimum zu skalieren.

Die Übertragung zum Mikrocontroller erfolgt darauf hin direkt aus dem OnChip-RAM heraus. Der Mikrocontroller lädt die Pixel einzeln und komponentenweise, mittels einer Taktleitung und bitparallel über einen 12Bit-Bus aus dem FPGA. Wurden alle Daten übertragen beginnt dieser damit aus den Pixeldaten die Farben für die LEDs heraus zu rechnen. Parallel dazu verarbeitet der FPGA das nächste Halbbild. Der beschriebene Ablauf verarbeitet damit alle 25 empfangenen Halbbilder des Eingangssignals. Die Ausgabe der LED-Farben erfolgt ebenfalls mit 25 "Bildern" pro Sekunde.

Aufgrund der Performance des Gesamtsystems war es sogar notwendig einen Puffer in die Software einzufügen, damit die ausgegebenen Farben mit dem angezeigten Bild synchronisiert werden kann. Der AmbiController ist deutlich schneller in der Bildverarbeitung als mein TV-Gerät.

Sonntag, 8. September 2013

Autonomous Light Controller - Dizzying Signal Processing

Wie ich in meinem letzten Post geschrieben habe gibt es neben dem Mikrocontroller noch einen weiteren Prozessor, es handelt sich dabei um einen TVP5146M2, von Texas Instruments. Dieser ist ein Videoprozessor, der in der Lage ist analoge Videosignale zu digialisieren und über eine bitparallele Schnittstelle (10- oder 20Bit breit) taktsynchron weiterzuleiten. Er unterstützt alle gängigen analogen Videosignale, wie beispielsweise alle PAL- und NTSC-Varianten. Als Übertragungsmedium wird CVBS, Component RGB und Component YPbPr unterstützt. VGA oder ähnliches nicht.

Die von diesem Prozessor ausgegebenen Videodaten werden nach dem Videostandard ITU-R BT.656 kodiert. Hierbei werden volle Bilder in Halbbildern nacheinander übertragen. Dabei wird - eine im DSP einzustellende - Unterabtastung verwendet. Bei der Übertragung wird durch die Unterabtastung deutlich an Bandbreite eingespart, ohne das es zu erheblichen Qualitätseinbußen kommt.

Der Takt zur Datenübertragung beträgt bei PAL/NTSC, einem 10Bit breiten Datenbus (entspricht 10Bit Farbtiefe) 27MHz, was einem Datenstrom von 27MBit/s ergibt. Leider ist der ATXMega hierbei schon komplett überfordert, da die Datenworte, am Bu,s nur ca. 18,5ns (Nanosekunden) anliegen, und dies drastisch kürzer ist als der Mikrocontroller (selbst bei Übertaktung auf 54MHz, 32MHz ist die empfohlene Obergrenze) erkennen kann.

Die Idee das System mit einem AVR XMega und diesem DSP aufzubauen scheiterte also recht früh in der Entwicklung, da auch der DSP nicht weiter um konfiguriert werden kann um die Übertragungsgeschwindigkeit bzw. die Bildauflösung zu reduzieren.

Jetzt könnte man sagen, dass man einfach einen anderen Mikrocontroller verwendet oder einen anderen DSP. Aber nein - das wäre zu einfach.

Der Flaschenhals bei dem Thema ist der Mikrocontroller. Setzt man nun einen deutlich schnelleren ein, mit dem die ITU-R BT.656-Signale nun verarbeitet werden können, steht man kurz darauf vor dem nächsten Problem sobald man moderne (digitale und hochauflösende) Videosignale verarbeiten möchte. Bei der Bildübertragung eines FULL-HD-Signales mit knapp 1280x1080 Pixeln, selbst mit 10Bit Farbtiefe sind deutlich höhere Taktraten als 27MHz notwendig um die Bilddaten in akzeptabler Zeit zwischen den Prozessoren zu übertragen. Ein Datenblatt eines anderen Signalprozessors (auf den ich in einem Späteren Post eingehen werde) gibt hier Taktraten von etwa 250MHz an. Es wird schnell klar, dass ein bezahlbarer Mikrocontroller hierbei einfach nicht hinterher kommt, so einfach die Lösung auch sein mag. Daher hab ich mich dazu entschieden einen anderen Ansatz zu verfolgen und den einfachen Weg zu verlassen.

Allerdings ist dieser Ansatz bei weitem komplexer und aufwendiger als einfach mehr Rechenleistung zu kaufen. Es geht dabei darum eigene eigene Hardware zu entwerfen, welche die vom DSP übertragenen Daten in Realtime empfangen kann, in der Lage ist diese zeitnah zu verarbeiten, und dem Mikrocontroller vor verarbeitet und in kleinen Portionen zur Verfügung zu stellen. Dazu gibt es aber mehr in einem der nächsten Posts...

Wie jedes mal habe ich in das Git-Repository die dazugehörigen Schaltpäne übertragen.

Freitag, 26. Juli 2013

Autonomous Light Controller - The FPGA Ambilight clone?

Wie angekündigt möchte ich hier nach und nach mehr Details über mein Projekt verraten. Dem aufmerksamen Leser ist sicher bereits schon aufgefallen, dass die Verlinkungen (Tags) zu den Posts in Kategorien fallen, in denen sich bereits kleine andere Projekte befinden.
Beispielsweise verwende ich als Mikrocontroller-Basis mein XMega-Evaluation-Board.
Genauer gesagt wurde dieses genau für diesen Zweck erstellt...

Letztendlich handelt es sich um eine Grundschaltung für den XMega und diversen Schnittstellen um das Board mit der anderen Peripherie anzubinden. Der Schaltplan ist im Bild rechts zu sehen. Ein Layout gibt es hierfür nicht, da das ganze auf Lochraster aufgebaut ist (Bilder unten).

Den Schaltplan (Eagle) zu dem Board ist auf GitHub Verfügbar...

Die Aufgaben dieses Boards sind die folgenden:

  1. Steuerung aller weiteren Komponenten wie dem FPGA-Board und dem Signalprozessor.
  2. Kommunikation und Steuerung der Beleuchtungsanlage (Fnordlichter oder LED-Stripes).
  3. Kommunikation per USB/Bluetooth mit externen Komponenten oder dem Anwender (TTY)
  4. Power- und Videosignal-Management.
  5. Empfang und Aufbereitung der bereits durch den FPGA vorbereiteten Bilddaten.
  6. Übertragung der vom FPGA empfangenen Bilddaten per USB oder Bluetooth.
Die Software auf dem Chip besteht aus einer in C geschriebenen Firmware welche alle Aufgaben aus der Liste oben. Der größte Teil der Implementierung entspricht einer TTY-Emulation für die Interaktion mit dem System.
Per TTY können verschiedene Konfigurationseinstellungen vorgenommen und Systemtests durchgeführt werden.

Das folgende Video zeigt den Zugriff auf das System bzw. auf verschiedene Register des Signalprozessors per I²C. Das Terminal enthält eine ausführliche Online-Hilfe und erlaubt, neben dem vollem Systemzugriff, zudem die Steuerung der Beleuchtung. Der Controller kann damit auch anderweitig verwendet werden.
Eine wesentlich maschinenlesbare Variante der Kommunikation ist in Arbeit.
Das Video soll schlicht demonstrieren, dass so eine Schnittstelle existiert und verwendet werden kann. Als einfacher Anwender kommt man damit nicht in Berührung. Damit wäre die Usability sonst komplett unmöglich...


Wie in der Auflistung oben bereits erwähnt (Punkt 6) ist das System zudem in der Lage die Bild-Rohdaten, welche vom FPGA erzeugt werden, per USB oder Bluetooth auszugeben. Hierzu ist das Tool "FrameView" entstanden. FrameView verwendet unter anderem SDL, ist plattformunabhängig und als Linux-Binary gerade mal 14kb groß.
Das folgende Video zeigt die Applikation in Aktion. Das Bild des Desktops wird dabei per VGA->CVBS-Adapter in den AmbiController geleitet, automatisch ausgewertet, und das Ergebnis per USB an die FrameView-Anwendung weitergeleitet, welche das aktuell ermittelte Bild in dem kleinen Fenster links darfstellt. Das Größere Fenster ist Video mit einem ein einfachen Farbtest. Das Ganze stammt aus den Anfängen der Entwicklung. Daher ist das Ergebnis noch sehr sehr pixelig.
Das Protokoll an dieser Stelle ist recht proprietär und nur zu Debug-Zwecken gedacht, da diese Ausgabe zudem die Framerate drückt. Um Bandbreite bei der Datenübertragung zu sparen werden hier immer nur Änderungen übertragen. 


Damit erstmal genug für heute und viel Spaß beim Video schauen...

Mittwoch, 17. Juli 2013

Erstes Update - Autonomous Light Controller

In den letzten Wochen habe ich einige Emails bekommen, darunter Spam, einige mit sehr verdächtiger und dubioser Formulierung und andere wirklich sehr nette. Das Projekt scheint also, ich mir auch steigenden die Besucherzahlen auf diesem Blog ansehe und Eure Suchbegriffe bei dem großen Suchmaschinenanbieter ansehe, ein gewisses Interesse geweckt zu haben. Das freut mich natürlich!

Leider muss ich alle Interessenten enttäuschen, da dieses Gerät momentan nur als Prototyp vorhanden ist. Von einer Verbreitung ist zudem abzusehen. Daher habe ich mich dazu entschlossen in der kommenden Zeit die Schaltpläne, Software, Hardware-Synthese etc. als OpenSource/-Hardware zu veröffentlichen. Und wenn die Zeit dafür gekommen und mir verfügbar ist, eine kurze Dokumentation dazu schreiben wie das System arbeitet und aufgebaut ist.

Das Bild oben zeigt den aktuellen Prototyp. Ein weiterer Prototyp, welcher nicht mehr aus 7 (in Worten sieben) vernetzten Lochrasterplatinen und mehreren hundert Metern Kupferlackdraht besteht, ist in Arbeit. Dieser wird nur noch aus einer kleinen 4-Layer Platine, mit an die 180 "0403" SMD-Bauteilen (als Hinweis an diejenigen die nun auf einen Bausatz oder ähnliches hoffen), bestehen.

Sobald der neue Prototyp (Bild vom unvollständigen Layout links) bestellt, geliefert und aufgebaut wurde, fängt die eigentliche Arbeit mit diesem erst wirklich an. Die Firmware muss angepasst werden, neue Hardwarekomponenten in Betrieb genommen, Messungen durchgeführt müssen werden, (hoffentlich
keine) Korrekturen vorgenommen werden und sehr viel Zeit damit verbracht werden, das neue System (mindestens) auf den Stand.

Es ist viel zutun!

 

Hier noch ein paar Fragen und Antworten aus den Emails:
  • Verkaufen Sie das Gerät/Bausätze/etc.? NEIN 
  • Wird das Gerät auch HDMI und HDCP verarbeiten können? Über einen HDMI zu Composite-Wandler und einem zusätzlichen HDMI-Splitter (wird beides beispielsweise von der Firma Ligawo angeboten) ist es möglich auch digitale Medien mit dem Gerät zu verarbeiten. Da es jedoch am Markt HDMI-Chips gibt wäre dies im neuen Prototyp theoretisch möglich, HDCP steht auf einem anderen Blatt.
  • Funktioniert das Gerät auch mit anderen TV-Größen als 32 Zoll? Ja das ist definitiv möglich und bereits vorbereitet.
  • Wie steht es mit der Benutzerfreundlichkeit? Das System wird mit dem Video-Signal und mit einer Stromquelle verbunden. FERTIG. Es schaltet sich selbstständig ein und aus, und kann per Bluetooth oder USB bzw. mittels einer Android-App konfiguriert werden (wenn überhaupt nötig).
  • Wieso sind die Ecken auf dem Video schlechter ausgeleuchtet und wird das noch verbessert? Das liegt zum einen an der Art wie die LED-Streifen angebracht wurden. Und zum anderen reichen diese in meinem Fall nicht bis in die Ecken. Verwendet man entsprechend längere Streifen kann die Beleuchtung lückenlos aufgebaut werden.
  • In einem der letzten Videos scheint die Beleuchtung nicht synchron zu dem dargestellten Bild zu sein, wird das noch behoben? Richtig, die Beleuchtung ist nicht synchron. Meine Hardware berechnet die anzuzeigenden Farben schneller und zeigt diese auch früher an als der TV das dazugehörige Bild darstellt. Daher kann die Verarbeitungsgeschwindigkeit, Software-seitig und zur Laufzeit vom Anwender, individuell angepasst werden.
  • Wie schnell ist das System denn wirklich? Es verarbeitet alle empfangenen Bilder des Eingangssignals zur Laufzeit, ohne Verluste.
  • Wieso werden die Farben in den vorherigen Videos falsch dargestellt? Da ich all meine finanziellen Mittel in das Projekt stecke, besitze ich leider ausreichend gute Videokamera und verwende mein Smartphone für die Aufnahmen. Daher ist die Qualität auch dementsprechend "hochwertig".
  • Kann ich dann mein HDMI-Kabel durch das Gerät durchschleifen? Nein, siehe oben.
  • Was kostet das System? Die Materialkosten belaufen sich (inklusive aller Prototypen) auf einen gerade noch 3-stelligen Betrag. Die Arbeitszeit innerhalb der fast 3 Jahre die ich an dem System arbeite nicht mitgerechnet. 
  • Wieso mache ich mir den Aufwand und kaufe mir nicht einfach ein Gerät das das schon kann? Weil ich es kann, Spaß daran habe die Probleme zu lösen, meine Hardware ist besser, in dieser Form hat das noch keiner geschafft (verschiedene haben es versucht)... es gibt viele Gründe, aber warum hat man ein Hobby?

Montag, 25. Juli 2011

XMega evaluation board

Ich beschäftige mich nun schon seit mehr als einem Jahr mit der XMega-Reihe von Atmel. Das Verwenden eines XMegas hat in vielen Bereichen deutliche Vorteile gegenüber eines kelineren Bruders aus der Mega-Reihe. Darunter fallen die höhere (maximale) Taktfrequenz von bis zu 32MHz, der Mehrkanal DMA-Controller, AES- und DES-Kryptografie per Hardware, höhere Kapazitäten für Flash/EEPROM/SRAM, höhere Auflösungen bei den ADC, digital zu analog Konverter (DAC) sind hinzugekommen und ein recht flexibles Event-System. Das einzige Manko ist, dass der Möglichkeit zur Programmierung per ISP-Schnittstelle weg gefallen ist. Es muss hier die neu hinzu gekommene PDI-Schnittstelle oder einfach JTAG Abhilfe schaffen.

Da mir die Möglichkeit fehlt die Chips per PDI zu flashen, erledige ich dies mit einem AVR Dragon per JTAG und AVRDUDE, was keinerlei Probleme macht. Das einzige Problem, dass ich persönlich mit den XMegas habe ist die Bauform. Ein TQFP-Gehäuse ist nicht einfach nur mal so auf eine Lochrasterplatine aufgesteckt und kurzerhand verlötet. Glücklicherweise gibt es bei eBay jedoch Adapterplatinen für ein paar wenige Euro, die nur mit Stiftleisten versehen werden müssen und dann wie üblich weiterverwendet werden können. Das Bild oben zeigt so eine Adapterplatine, mit einem aufgelöteten ATXMega192A3.

Und da in meinem Fall die grundlegende Schaltung meistens identisch ist, habe ich diese einmalig in Eagle erstellt und darauf nun komplett auf einem 60x60mm großen Stück Lochrasterplatine aufgebaut. Das zweite Bild zeigt das ganze dann als fertig aufgebaut. Verfügbar sind die folgenden Schnittstellen an mehreren Steckerleisten, sowie zwei Status-LED und einen Reset-Taster.

  • JTAG (oben links)
  • 1x I²C/TWI (oben rechts)
  • 1x I²C/TWI mit weiteren IO-Leitungen (rechts mitte)
  • 2x 20Pin IO-Steckerleiste (links unten, oben mitte)
  • 2x UART (links mitte)
  • 1x 14Pin Spannungsversorgung (unten rechts)


Die Spannungsversorgung habe ich hier bewusst extern belassen, so dass beide Platinen einfach ausgetauscht werden können (siehe rechtes Bild). Die Maximale Eingangsspannung liegt hier bei 25V und an den Ausgängen liegen die Eingangsspannung und die Spannungen 5V, 3,3V und 1,8V an. Der Maximalstrom liegt bei jedem der Regler bei ca. 1A. Eine LED zeigt an, das dass System in Betrieb ist.


Als nächstes habe ich angedacht noch eine weitere Platine zu erstellen, welche die beiden ausgeführten UART-Schnittstellen, des Evaluation-Boards, zu USB und RS232 konvertieren. Die Einzelteile liegen schon bereit...


PowerMgr: Mein selbst gebautes Energie- und Smart-Home-System

PowerMgr: Mein selbst gebautes Energie- und Smart-Home-System PowerMgr ist mein eigenes Home-Energy-Management-System. Es verbindet Photov...