-------------------------------------------------------------------------------- 'mocolock' Rotor-Display (c) 2009 www.hellmars.de INHALT Projekt Aufbau uP-Programme Grafikumwandlung Grfikformat Pläne -------------------------------------------------------------------------------- Projekt ======= Die Geschichte des vorliegenden Objektes (foto 1) geht auf ein Cafe in meinem Heimatort Heilbronn zurück. In jenem hing über der Bar eine wesentlich aus dem Namenszug bestehende Leuchte, ich war der Meinung, da gehörte etwas "besondere- res" hin. Eine Leuchte, welche das Logo - einen Kolibri - aufgreift und damit spielt. Gesagt, getan ... entstanden ist eineinhalb Jahre später ein technisch anspuchs- volles Unikat, welches ziemlich genau die gestellten Forderungen erfüllt... und einige mehr ... leider aber nicht mehr so richtig in den, in der Zwischenzeit völlig umgestalteten Raum, paßt. Zugegebenermaßen, zumindest eine Umgestaltung mit gutem Geschmack! Daher oder gerade deswegen findet sie sich an einem wie für sie geschaffenen und exponierten Platz wieder - im Schaufenster neben dem Eingang! Aufbau ====== Bei der vorliegenden "Leuchte" handelt es sich um ein sog. Rotor-Display oder lt. youtube auch um eine Propeller-Clock (foto 3). Es besteht hauptsaechlich aus einer auf einem Wechselstrommotor montierten Pla- tine mit 32 LED's, mittels welcher bei drehendem Motor und positionsgenauer An- steuerung stehende Bilder erzeugt werden können (foto 2), bei Verwendung von 5 mm LED's ergibt sich ein max. Darstellungsbereich von rund 360 mm Durchmesser. Die Ansteuerung erfolgt im vorliegenden Fall in 1 Grad-Schritten ueber einen AT mega32 unter Verwendung serieller 8-Bit-Schiebe-Register, 4 Stück an der Zahl (foto 5). Die Position des Rotors wird bei jeder Umdrehung über einen Hall-Sen- sor (rechts im foto 6) und einen starr montierten Permanentmagneten (foto 8) initialisiert - somit erhält man die 0-Grad-Position und die Zeit für eine Um- drehung. Zur Berechnung der 1°-Grad-Schritte wird ein Timer verwendet. Die Achse der inneren LED liegt auf der Motorachse und bildet somit den Mittel- punkt des darstellbaren Bereiches. Fest verbunden mit der Rotorplatine ist eine Schleifring-Platine mit 3 Ringen (foto 7), ueber welche die Spannung uebertragen wird und die serielle Kommunikation zum Rotor erfolgt. Das Gegenstück zu den Schleifringen bilden federnd gelagerte Schleifkontakte aus dem Modellbau (foto 9). Diese werden von einer, ueber einen ATmega8 gesteuerten, Spannungsversorgungs-Platine (foto 10) versorgt. Ueber diese Platine wird außer- dem der Motor gesteuert, eine RC5-fähige Fernbedienung und ein DCF77-Baustein, sowie ein Schalter ausgewertet (foto 11). Damit der Rotor im Betrieb keine Unwucht erzeugt und somit unrund laeuft, muss dieser mittels Zusatzgewicht im Drehpunkt 'ausgewuchtet' bzw. ausbalanciert wer- den, im vorliegenden Fall tut's ein Stück Abfall-Platine (auf welcher im Übrigen der Hall-Sensor montiert ist). Fuer die Umrechnung und Darstellung der Zeichen und Grafiken ist eine Definition bzgl. Start-Position und Drehrichtung nötig. Hier entspricht diese aus der Wahl des Motors und der Plazierung des Magneten der positiven x-Achse eines Koordina- tenkreuzes und einer Drehung im Uhrzeigersinn. Die bereitgestellten Grafikdaten sind unter diesen Prämissen erstellt worden. Das Display in der vorliegenden Form ist mit dem verwendeten ATmega32 auf eine Darstellung von ca. 10 Grafiken und 20 Texten begrenzt. Die Begrenzung resultiert hauptsaechlich aus der Speichergroesse einer Grafik, welche bei einer Auflösung von 1 °, 1440 Bytes betraegt: => 360 Rotorpositionen * 32 LED's = 360 * 4 Bytes = 1440 Bytes. Zur Erzeugung eines "stehenden" Bildes ist eine Aufloesung in 1°-Schritten aus- reichend und eine Drehgeschwindigkeit von mehr als 1500 U/min noetig. Dieses re- sultiert aus der Annahme ein stehendes Bild zu erzeugen, das 24mal pro sec wie- derholt werden muss. Mit hoeheren Drehgeschwindigkeiten wird die Qualitaet ent- sprechend besser. (Der hier verwendete Motor läßt sich in drei Geschwindigkeits- Stufen betreiben, welche über Jumper auf der Platine gewählt werden können). In der gefilmten Version dreht der Motor mit ca. 2000 U/min. Die obere Grenze der Drehgeschwindigkeit ist "begrenzt" offen und bestimmt sich aus der verwendeten Taktfrequenz des uP und der Programmiergeschicklichkeit ;-) Bei 1500 U/min, einer Aufloesung von 1° und einer Taktfrequenz von 16 MHz gilt: => 1500 U/min = 25 U/s ---> 40 ms/Umdrehung => 40 ms / 360 = 111 us ---> Zeit zwischen zwei Rotorpositionen => 16 MHz = 0,0625 us ---> 111 us / 0,0625 us = 1776 Maschinenzyklen D.h. bei Verwendung von nur 1-zyklischen Befehlen kann man zwischen zwei Ansteu- erungen 1776 Befehle abarbeiten, was ausreichend genug sein dürfte! Noch eine Anmerkung zum Aufbau. Für die Spannungs- und Signalübertragung habe ich mich aus Erinnerung an schöne Kindertage bewußt für die etwas lautere mechanische Lösung mit den Schleifringen á la Carerra entschieden. Es erfordert ein bischen Geschick, um das Geräusch zu minimieren. Kommen wir zur Programmierung. uP-Programme ============ Die gesamte Steuerung des Rotor-Displays erfolgt ueber zwei uP, einem Mega8 auf der Spannungsversorgungs-Platine und einem Mega32 auf der Rotorplatine. Die zuge- hoerigen Programm-Dateien finden sich unter C:\MOCOLOCK\PROGRAMM. ** mocolock supply.bas ** Steuerung der Relais, Auswertung des FB- und DCF-Sig- nals und serielle Datenuebertragung zum Rotor ** mocolock rotor.bas ** Steuerung und Anzeige von Grafiken und Text im Display, Auswertung von seriellen Daten In den Rotor-Programmcode werden folgende Dateien per INCLUDE geladen ** Intro.Bas ** Datentabellen Intro-Grafiken ** Grafiken.Bas ** Datentabellen User-Grafiken ** Texte.Bas ** User-Texte ** Zeichensatz.Bas ** Zeichen-Datentabelle Somit koennen Grafiken und Texte relative einfach hinzugefuegt und veraendert werden. Die Beschreibung hierzu findet sich in den beiden Dateien. Nach einer Veraenderung oder Erweiterung der Datensaetze fuer Text oder Grafiken muss der Rotor-Programmcode neu compiliert und in den uP uebertragen werden! Noch was wichtiges zur Programmierung. Die Programme wurden in Bascom geschrieben, entsprechend sind sie! Wer sie "besser" machen möchte, fühle sich frei. Was die Kommentierung des Programmcodes angeht, mal ist sie besser mal schlechter ... heißt es ist nicht jede Zeile kommentiert!!!! Grafikumwadlung =============== Zur Umwandlung von Grafiken in Rotor-Daten (entspr. der Definition pos. x-Achse im Uhrzeigersinn drehend!), steht ein in Turbo-Pascal geschriebenes Hilfsprogramm zur Verfuegung. Aufgrund der sehr einfachen Programmierung ist folgende Verzeichnisstruk- tur zwingend einzuhalten. C:\MOCOLOCK\PROGRAMM GRAFIKEN.BAS (Datendatei für Bascom-Include) C:\MOCOLOCK\CONVERT MOCOLOCK.EXE (Pascal Umwandlungsprogramm) C:\MOCOLOCK\IMAGES BMP-DATEIEN (Grafiken zur Umwandlung) C:\MOCOLOCK\CONVERT\BGI GRAFIKTREIBER (fuer Turbo-Pascal Darstellung) Die Grafik-Daten-Datei ** Grafiken.bas ** wird bei jeder erfolgreichen Umwandlung einer Grafik um einen Datensatz ergaenzt. Jeder Datensatz besteht aus den 360 Daten- zeilen zu je 4 Byte, gefolgt von zwei Leerzeilen und einer auskommentierten Zeile mit der fortlaufenden Nr. des Datensatzes und dem Namen der Grafik. Grafikformat ============ Ueber das Hilfsprogramm koennen nur Grafiken im Bitmapformat mit folgenden Eigen- schaften in Rotor-Daten umgewandelt werden. * Bitmapdateien mit Endung *.bmp * Farbtiefe 1 oder 8 bit * Bildgroesse max. 480 x 480 pixel * Dateiname max. 8 zeichen (z.B. testdat1.bmp) * Kontrast in schwarz und weiss Vorgehensweise zur Umwandlung eines beliebigen Bildes in das beschriebene Format: * In einem Grafikprogramm (Photoshop, Corel Paint, ...) ein neues Bild anlegen am Besten in der Größe 35,4 x 35,4 cm (= Rotordurchmesser) * Wenn möglich eine runde Maske mit D = 35,4 cm erzeugen und darueber legen ... dieses erleichtert das Ausrichten der Grafik im darstellbaren Bereich ... siehe hierzu das Beispiel ** grafik_vorlage.jpg ** im Verzeichnis \Images * gewünschte Grafik importieren oder in das leere Bild kopieren * Grafik im Bild bzw. in der Maske ausrichten ... wenn keine runde Maske erzeugt wurde, bitte bedenken dass mit dem Rotor-Display ein Kreis dargestellt wird * Grafik schwarz fuellen, der Hintergrund sollte weiss sein, ansonsten fuellen * Grafik in 1 oder 8 Bit umwandeln * Grafik in 480 x 480 pixel verkleinern und als Bitmap speichern * Name max. 8 zeichen lang z.B. ** colibri1.bmp ** Plaene ====== Im Verzeichnis \Plaene sind die kompletten Schaltplaene und Layouts enthalten. Wegen Verwendung der begrenzten Eagle-Version konnten jeweils nur Teil-Pläne ge- rootet werden und mußten daher mit imaginären Steckverbindern versehen werden. Als Bitmap exportiert wurden diese Teil-Pläne dann mittels der Steckverbinder in einem Grafikprogramm zusammengefuegt.