Projekt :: LED-Uhr
1. Einleitung
Zuletzt aktualisiert: 04.06.2015
Gerade ein kleines Update zum Room-Controller gemacht, möchte ich nun auch ein weiteres Projekt ankündigen: Eine LED-Dezimaluhr.
Düsseldorf, der 02.06.2012. Es ist wieder JapanTag und ich durfte das Event wieder einmal nicht verpassen ! Nachdem ich im Jahre 2011 ganz alleine im Oktober dort war und es gerade abends doch recht kühl wurde, hatte ich diesmal wieder Begleitung von meiner Freundin Steffi. 22:40: Feuerwerk ! Natürlich haben wir uns vorher schon Plätze auf der Wiese an der Rheinuferpromenade gesichert und hatten einen guten Blick auf den Rheinturm.
Und da wurde mir zum ersten Mal bewusst, dass das Lichtspiel an dem Turm nicht nur hübsch aussieht, sondern sogar einen Zweck erfüllt: Es ist eine Uhr ! Sie zählt im Unärsystem Einer-Sekunden, Zehner-Sekunden, Einer-Minuten, Zehner-Minuten, Einer-Stunden und Zehner-Stunden an.
Ich war darüber sehr fasziniert und inspiriert, dass ich entschied, sofort mit der Planung einer eigenen LED-Uhr beginnen.
Nach den DMX-RGB-Lampen sollte dies nun also mein zweites LED-Projekt werden. Und ich habe festgestellt, dass mir die Arbeit mit LEDs viel spaß macht. Das heißt, es werden in Zukunft sicherlich noch viel mehr LED-Projekte auf meiner Seite zu sehen sein !
Die "sofortige" Planung zog sich allerdings bis in den November heraus, weil ich wegen Klausurphasen und einem Industriepraktikum kaum Freizeit hatte und das Geld war auch sehr knapp.
Aber nach meinem Geburtstag begann endlich die lang erwartete Projektphase und es ist derzeit (02.12.2012) schon gut fortgeschritten.
Zuletzt aktualisiert: 04.06.2015
Gerade ein kleines Update zum Room-Controller gemacht, möchte ich nun auch ein weiteres Projekt ankündigen: Eine LED-Dezimaluhr.
Düsseldorf, der 02.06.2012. Es ist wieder JapanTag und ich durfte das Event wieder einmal nicht verpassen ! Nachdem ich im Jahre 2011 ganz alleine im Oktober dort war und es gerade abends doch recht kühl wurde, hatte ich diesmal wieder Begleitung von meiner Freundin Steffi. 22:40: Feuerwerk ! Natürlich haben wir uns vorher schon Plätze auf der Wiese an der Rheinuferpromenade gesichert und hatten einen guten Blick auf den Rheinturm.
Und da wurde mir zum ersten Mal bewusst, dass das Lichtspiel an dem Turm nicht nur hübsch aussieht, sondern sogar einen Zweck erfüllt: Es ist eine Uhr ! Sie zählt im Unärsystem Einer-Sekunden, Zehner-Sekunden, Einer-Minuten, Zehner-Minuten, Einer-Stunden und Zehner-Stunden an.
Ich war darüber sehr fasziniert und inspiriert, dass ich entschied, sofort mit der Planung einer eigenen LED-Uhr beginnen.
Nach den DMX-RGB-Lampen sollte dies nun also mein zweites LED-Projekt werden. Und ich habe festgestellt, dass mir die Arbeit mit LEDs viel spaß macht. Das heißt, es werden in Zukunft sicherlich noch viel mehr LED-Projekte auf meiner Seite zu sehen sein !
Die "sofortige" Planung zog sich allerdings bis in den November heraus, weil ich wegen Klausurphasen und einem Industriepraktikum kaum Freizeit hatte und das Geld war auch sehr knapp.
Aber nach meinem Geburtstag begann endlich die lang erwartete Projektphase und es ist derzeit (02.12.2012) schon gut fortgeschritten.
2. Q & A
Zuletzt aktualisiert: 04.06.2015
Allererste Ãœberlegungen:
- 1. Welche Features soll die Uhr haben ?
- 2. RGB-LEDs oder einfarbige ?
- 3. Welchen Mikrocontroller verwenden ?
- 4. Funkuhr ?
- 5. Weckfunktion ?
- 6. Wie das Multiplexing realisieren ?
- 7. Schieberegister ?
Die Antworten darauf ließen nicht lange auf sich warten:
1) Features:
Naja, natürlich soll sie möglichst genau gehen, damit sie nicht nur als Dekoobjekt an der Wand hängt, sondern auch einen nützlichen Zweck hat. Dazu wollte ich eine RTC (Real Time Clock) nutzen. Da ich mich damit zum Zeitpunkt der Überlegungen noch garnicht auskannte, war das gleichzeitig eine neue Herausforderung, der ich mich gerne stellen wollte. Außerdem wollte ich, dass wie bei der Uhr vom Rheinturm vor z.B. jeder viertel- oder jeder vollen Stunde eine kleine Animation abgespielt wird. Lauflicht oder so. Dann möchte ich, dass die Uhr sich ab einer bestimmten Uhrzeit ein- und ausschaltet, weil so blinkende LEDs ja z.B. beim Schlafen eher störend sind. Sie soll auf Knopfdruck auch das aktuelle Datum unär anzeigen (Tag und Monat reicht ja ansich schon).
2) Farbe:
Beim Stöbern auf diversen Internetseiten und natürlich ebay habe ich mich schnell für die RGB-Variante entschieden. Ich habe 100 RGB-LEDs für 25€ mit Widerständen ergattert. Das ist natürlich mit einem erheblichen Mehraufwand verbunden, sollte sich aber am Ende definitiv lohnen ;)
3) Controller:
Ich habe vom Praktikum bei Lenord&Bauer einige STM32-Mikrocontroller bekommen (wie die Controller von Texas Instruments 23-Bit Controller mit ARM Cortex-M3 Kern). Da ich dafür aber kein Entwicklungsboard besitze, dachte ich mir, dass ich zuerst mit den guten alten AVRs arbeite. Dafür habe ich einmal das Pollin-Board mit ATMega16 und den alten DMX-Controller mit ATMega64. Das sollte für die Testphase erstmal reichen.
4) Funkuhr:
Kurz: Ja! Klingt ein wenig wie eierlegende Wollmilchsau, aber die Gründe sind eigentlich klar: zum einen möchte ich gerne wissen, wie das DCF77-Protokoll genau funktioniert und zum anderen kann ich das Modul später immernoch umfunktionieren und mit dem Room-Controller verbinden, sodass ich die genaue Funkzeit für andere Hardwarelösungen nutzen kann.
5) Weckfunktion:
Wäre auf jeden Fall eine coole Idee. Die Uhr schaltet sich zu einer bestimmten Weckzeit ein und spielt ein sehr auffälliges Licht-Pattern ab. Hin und wieder wird dann auch die Zeit angezeigt. Aber das schiebe ich mal auf später auf.
6) Multiplexing:
Ich habe mir auf Youtube einige Tutorials zum Multiplexing von LEDs angeschaut. Sinn dabei ist es, möglichst wenig Pins vom Controller zu verbrauchen, um viele LEDs einzeln ansteuern zu können. Der Trick dabei ist eine intelligente Verschaltung durch mehrere Transistoren und z.B. Schieberegister und ein sehr schnelles abwechselndes Leuchten verschiedener LEDs, um den Eindruck zu erwecken, es würden mehrere LEDs gleichzeitig leuchten (ähnlich wie die Funktionsweise von PWM).
7) Schieberegister:
Schieberegister sind nützliche ICs. Sie erweitern die verfügbaren Pins eines Mikrocontrollers um 8 weitere Pins. Man kann sie quasi als Seriell-Parallel-Wandler betrachten. Es werden also in einer bestimmten Taktrate Bits (also Einsen und Nullen) in das Register "geschoben" und mit einem Impuls gleichzeitig an den 8 Pins ausgegeben. Das geht natürlich auch in die andere Richtung, dafür sind aber andere ICs nötig.
Man kann das Multiplexing der LEDs auch ganz ohne Schieberegister realisieren, allerdings ist dazu eine wesentlich kompliziertere Verdrahtung und Programmierung nötig. Und das wollte ich für dieses Projekt eher vermeiden.
Zuletzt aktualisiert: 04.06.2015
Allererste Ãœberlegungen:
- 1. Welche Features soll die Uhr haben ?
- 2. RGB-LEDs oder einfarbige ?
- 3. Welchen Mikrocontroller verwenden ?
- 4. Funkuhr ?
- 5. Weckfunktion ?
- 6. Wie das Multiplexing realisieren ?
- 7. Schieberegister ?
Die Antworten darauf ließen nicht lange auf sich warten:
1) Features:
Naja, natürlich soll sie möglichst genau gehen, damit sie nicht nur als Dekoobjekt an der Wand hängt, sondern auch einen nützlichen Zweck hat. Dazu wollte ich eine RTC (Real Time Clock) nutzen. Da ich mich damit zum Zeitpunkt der Überlegungen noch garnicht auskannte, war das gleichzeitig eine neue Herausforderung, der ich mich gerne stellen wollte. Außerdem wollte ich, dass wie bei der Uhr vom Rheinturm vor z.B. jeder viertel- oder jeder vollen Stunde eine kleine Animation abgespielt wird. Lauflicht oder so. Dann möchte ich, dass die Uhr sich ab einer bestimmten Uhrzeit ein- und ausschaltet, weil so blinkende LEDs ja z.B. beim Schlafen eher störend sind. Sie soll auf Knopfdruck auch das aktuelle Datum unär anzeigen (Tag und Monat reicht ja ansich schon).
2) Farbe:
Beim Stöbern auf diversen Internetseiten und natürlich ebay habe ich mich schnell für die RGB-Variante entschieden. Ich habe 100 RGB-LEDs für 25€ mit Widerständen ergattert. Das ist natürlich mit einem erheblichen Mehraufwand verbunden, sollte sich aber am Ende definitiv lohnen ;)
3) Controller:
Ich habe vom Praktikum bei Lenord&Bauer einige STM32-Mikrocontroller bekommen (wie die Controller von Texas Instruments 23-Bit Controller mit ARM Cortex-M3 Kern). Da ich dafür aber kein Entwicklungsboard besitze, dachte ich mir, dass ich zuerst mit den guten alten AVRs arbeite. Dafür habe ich einmal das Pollin-Board mit ATMega16 und den alten DMX-Controller mit ATMega64. Das sollte für die Testphase erstmal reichen.
4) Funkuhr:
Kurz: Ja! Klingt ein wenig wie eierlegende Wollmilchsau, aber die Gründe sind eigentlich klar: zum einen möchte ich gerne wissen, wie das DCF77-Protokoll genau funktioniert und zum anderen kann ich das Modul später immernoch umfunktionieren und mit dem Room-Controller verbinden, sodass ich die genaue Funkzeit für andere Hardwarelösungen nutzen kann.
5) Weckfunktion:
Wäre auf jeden Fall eine coole Idee. Die Uhr schaltet sich zu einer bestimmten Weckzeit ein und spielt ein sehr auffälliges Licht-Pattern ab. Hin und wieder wird dann auch die Zeit angezeigt. Aber das schiebe ich mal auf später auf.
6) Multiplexing:
Ich habe mir auf Youtube einige Tutorials zum Multiplexing von LEDs angeschaut. Sinn dabei ist es, möglichst wenig Pins vom Controller zu verbrauchen, um viele LEDs einzeln ansteuern zu können. Der Trick dabei ist eine intelligente Verschaltung durch mehrere Transistoren und z.B. Schieberegister und ein sehr schnelles abwechselndes Leuchten verschiedener LEDs, um den Eindruck zu erwecken, es würden mehrere LEDs gleichzeitig leuchten (ähnlich wie die Funktionsweise von PWM).
7) Schieberegister:
Schieberegister sind nützliche ICs. Sie erweitern die verfügbaren Pins eines Mikrocontrollers um 8 weitere Pins. Man kann sie quasi als Seriell-Parallel-Wandler betrachten. Es werden also in einer bestimmten Taktrate Bits (also Einsen und Nullen) in das Register "geschoben" und mit einem Impuls gleichzeitig an den 8 Pins ausgegeben. Das geht natürlich auch in die andere Richtung, dafür sind aber andere ICs nötig.
Man kann das Multiplexing der LEDs auch ganz ohne Schieberegister realisieren, allerdings ist dazu eine wesentlich kompliziertere Verdrahtung und Programmierung nötig. Und das wollte ich für dieses Projekt eher vermeiden.
3. Schieberegister
Zuletzt aktualisiert: 04.06.2015
Nachdem meine erste Bestellung ankam, hatte ich schon alles, um erste Versuche mit den LEDs durchzuführen. An erster Stelle waren natürlich die eben genannten Schieberegister.
Die Funktionsweise ist ansich simpel: 8 LEDs an die 8 Pins vom Schieberegister (QA bis QG), SER, SCK, RCK und SCLR (Reset) an den Controller und ein bisschen Programmieren.
War anfangs doch garnicht mal so leicht. So habe ich es erst mit Software-SPI versucht. Also einfach die SER-Leitung auf High und SCK abwechselnd auf High und Low. Nach 8 Durchläufen noch RCK einen kurzen Impuls gegeben, schon haben die LEDs geleuchtet.
Nach einiger Zeit habe ich es sogar hinbekommen, dass sie alle in verschiedenen Farben leuchten (durch besagtes impulsartiges Wechseln der LEDs). So weit so gut.
Deutlich schwieriger wurde es, als ich versuchte, zwei Schieberegister hintereinander zu schalten. Dazu habe ich den Code umgeschrieben, sodass die seriellen Daten direkt mit dem Hardware-SPI versendet werden. Das funktionierte bei einem Register auch sehr gut. Bei zweien läuft das momentan so ab, dass an beiden Registern dieselben Daten ankommen.
Zuletzt aktualisiert: 04.06.2015
Nachdem meine erste Bestellung ankam, hatte ich schon alles, um erste Versuche mit den LEDs durchzuführen. An erster Stelle waren natürlich die eben genannten Schieberegister.
Die Funktionsweise ist ansich simpel: 8 LEDs an die 8 Pins vom Schieberegister (QA bis QG), SER, SCK, RCK und SCLR (Reset) an den Controller und ein bisschen Programmieren.
War anfangs doch garnicht mal so leicht. So habe ich es erst mit Software-SPI versucht. Also einfach die SER-Leitung auf High und SCK abwechselnd auf High und Low. Nach 8 Durchläufen noch RCK einen kurzen Impuls gegeben, schon haben die LEDs geleuchtet.
Nach einiger Zeit habe ich es sogar hinbekommen, dass sie alle in verschiedenen Farben leuchten (durch besagtes impulsartiges Wechseln der LEDs). So weit so gut.
Deutlich schwieriger wurde es, als ich versuchte, zwei Schieberegister hintereinander zu schalten. Dazu habe ich den Code umgeschrieben, sodass die seriellen Daten direkt mit dem Hardware-SPI versendet werden. Das funktionierte bei einem Register auch sehr gut. Bei zweien läuft das momentan so ab, dass an beiden Registern dieselben Daten ankommen.
4. RTC
Zuletzt aktualisiert: 04.06.2015
Parallel zu den Experimenten mit den Schieberegistern habe ich auch ein RTC-IC (Real Time Clock) mit I²C-Ansteuerung besorgt. Auf dem Breadboard habe ich dann ein bisschen Platz für die Grundschaltung reserviert: IC, Batterie, Uhrenquarz.
Mit I²C (bzw. TWI - Two Wire Interface beim AVR) habe ich noch garnicht gearbeitet. Das Protokoll ist auch um einiges komplizierter als SPI. Da TWI eben nur zwei Leitungen hat, Clock- und Datenleitung, müssen einige Schritte mehr getan werden. Erst muss ein Chip mit einer festen Adresse und der Device-ID angesprochen werden. Dann muss noch entschieden werden, ob der Master (hier: der Controller) vom Slave (RTC) lesen, oder etwas auf ihn schreiben will.
Dann kommt die Registeradresse. Beim RTC sind die ersten 7 Register die Zeit-Register: Sekunde, Minute, Stunde, Wochentag, Tag, Monat, Jahr. Diese Informationen können dann nacheinander aus der RTC geholt oder in sie geschrieben werden.
Mit etwas Hilfe aus dem weiten Internet habe ich dann eine kleine TWI-Routine für den RTC-Chip gefunden und es erfolgreich geschafft, die Uhrzeit aus der RTC zu lesen und per USB-UART-Wandler (auf dem DMX-Board ja vorhanden ;) ) auf der PC-Konsole auszugeben.
Zuletzt aktualisiert: 04.06.2015
Parallel zu den Experimenten mit den Schieberegistern habe ich auch ein RTC-IC (Real Time Clock) mit I²C-Ansteuerung besorgt. Auf dem Breadboard habe ich dann ein bisschen Platz für die Grundschaltung reserviert: IC, Batterie, Uhrenquarz.
Mit I²C (bzw. TWI - Two Wire Interface beim AVR) habe ich noch garnicht gearbeitet. Das Protokoll ist auch um einiges komplizierter als SPI. Da TWI eben nur zwei Leitungen hat, Clock- und Datenleitung, müssen einige Schritte mehr getan werden. Erst muss ein Chip mit einer festen Adresse und der Device-ID angesprochen werden. Dann muss noch entschieden werden, ob der Master (hier: der Controller) vom Slave (RTC) lesen, oder etwas auf ihn schreiben will.
Dann kommt die Registeradresse. Beim RTC sind die ersten 7 Register die Zeit-Register: Sekunde, Minute, Stunde, Wochentag, Tag, Monat, Jahr. Diese Informationen können dann nacheinander aus der RTC geholt oder in sie geschrieben werden.
Mit etwas Hilfe aus dem weiten Internet habe ich dann eine kleine TWI-Routine für den RTC-Chip gefunden und es erfolgreich geschafft, die Uhrzeit aus der RTC zu lesen und per USB-UART-Wandler (auf dem DMX-Board ja vorhanden ;) ) auf der PC-Konsole auszugeben.
5. LED-Platine
Zuletzt aktualisiert: 04.06.2015
Ich habe schon einen ersten Prototypen für die Einzel-Sekunden (0 bis 9) gefertigt. Dazu die Hälfte einer Euro-Lochkartenplatine genommen und die LEDs samt Transistoren und Schieberegister drauf gelötet. Damit konnte ich dann das "Daisy-Chaining" mehrerer Schieberegister austesten.
Platine zuschneiden und Punkte markieren, wo die LEDs hin sollen:
LEDs einfügen:
Transistoren einfügen:
10k-Widerstände für Basis (Strombegrenzung) einfügen:
RGB-Anoden der LEDs zusammenschließen:
Schieberegister einfügen:
Transistoren zur RGB-Ansteuerung und 14-Pol Wannenstecker einfügen; Platine fertig.
Funktionstest: Läuft !
Zuletzt aktualisiert: 04.06.2015
Ich habe schon einen ersten Prototypen für die Einzel-Sekunden (0 bis 9) gefertigt. Dazu die Hälfte einer Euro-Lochkartenplatine genommen und die LEDs samt Transistoren und Schieberegister drauf gelötet. Damit konnte ich dann das "Daisy-Chaining" mehrerer Schieberegister austesten.
Platine zuschneiden und Punkte markieren, wo die LEDs hin sollen:
LEDs einfügen:
Transistoren einfügen:
10k-Widerstände für Basis (Strombegrenzung) einfügen:
RGB-Anoden der LEDs zusammenschließen:
Schieberegister einfügen:
Transistoren zur RGB-Ansteuerung und 14-Pol Wannenstecker einfügen; Platine fertig.
Funktionstest: Läuft !
6. LED-Module
Zuletzt aktualisiert: 12.07.2015
Alle LED-Module sind nun fertig. Es sind insgesamt 3x Einer mit je 9 LEDs, 2x Zehner mit je 5 LEDs und 1x Zehner mit 2 LEDs (für die Stunden).
Alle sind in Reihe über eine 14-adrige Leitung verbunden. Die Leitung enthält je 3x +5V und GND, Rot, Grün, Blau, Daten, Clock, Latch, Reset und zwischen Zehner und Einer immer eine Leitung für die 9. LED (weil jedes Schieberegister ja nur 8 Ausgänge hat).
Zuletzt aktualisiert: 12.07.2015
Alle LED-Module sind nun fertig. Es sind insgesamt 3x Einer mit je 9 LEDs, 2x Zehner mit je 5 LEDs und 1x Zehner mit 2 LEDs (für die Stunden).
Alle sind in Reihe über eine 14-adrige Leitung verbunden. Die Leitung enthält je 3x +5V und GND, Rot, Grün, Blau, Daten, Clock, Latch, Reset und zwischen Zehner und Einer immer eine Leitung für die 9. LED (weil jedes Schieberegister ja nur 8 Ausgänge hat).
7. Der Controller
Zuletzt aktualisiert: 12.07.2015
Nach ausführlichen Tests der Firmware mit dem Breadboard habe ich eine neue Controller-Platine für die Unäruhr designed und geätzt (Video dazu im Bereich "PCB von A bis Z")
Die Platine ist einseitig, da fast nur Print-Elemente und ein paar SMD Widerstände und Kondensatoren benutzt wurden. Den Schaltplan und das Boardlayout könnt ihr hier herunterladen.
Zuletzt aktualisiert: 12.07.2015
Nach ausführlichen Tests der Firmware mit dem Breadboard habe ich eine neue Controller-Platine für die Unäruhr designed und geätzt (Video dazu im Bereich "PCB von A bis Z")
Die Platine ist einseitig, da fast nur Print-Elemente und ein paar SMD Widerstände und Kondensatoren benutzt wurden. Den Schaltplan und das Boardlayout könnt ihr hier herunterladen.