8x8-LED-Matrix
Aus BraLUG-Wiki
(→Motivation) |
ISCH (Diskussion | Beiträge) K (Wiederhergestellt zur letzten Änderung von Bergeruw) |
||
(19 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 5: | Zeile 5: | ||
=Motivation= | =Motivation= | ||
− | Vor einiger Zeit kaufte ich bei Pollin ein 8x8-LED-Modul als Muster für ein geplantes Projekt. Als ich mich dann entschieden hatte, dieses Projekt wirklich in Angriff zu nehmen, war ausgerechnet dieses LED-Modul ausverkauft. Um das Muster nicht sinnlos rumliegen zu lassen, habe ich es jetzt als Ausgangspunkt für ein paar Spielereien mit einem ATMega8 und einer 8x8-Anzeige genommen | + | Vor einiger Zeit kaufte ich bei Pollin ein 8x8-LED-Modul als Muster für ein geplantes Projekt. Als ich mich dann entschieden hatte, dieses Projekt wirklich in Angriff zu nehmen, war ausgerechnet dieses LED-Modul ausverkauft. Um das Muster nicht sinnlos rumliegen zu lassen, habe ich es jetzt als Ausgangspunkt für ein paar Spielereien mit einem ATMega8 und einer 8x8-Anzeige genommen, eine entsprechende Schaltung entworfen/aufgebaut sowie eine Art Applikationstemplate geschrieben... |
=Hardware= | =Hardware= | ||
[[Bild:led_8x8_schaltung.png|320px|Schaltplan]] | [[Bild:led_8x8_schaltung.png|320px|Schaltplan]] | ||
+ | Die Hardware besteht aus: | ||
+ | * einem [http://atmel.com/dyn/resources/prod_documents/doc2486.pdf ATMega8] in seiner einfachsten Grundschaltung | ||
+ | * drei Tastern | ||
+ | * und dem erwähnten 8x8-LED-Matrix-Modul (da ich kein Datenblatt hatte, musste ich die Anschlußbelegung selbst "durchklingeln"...) | ||
+ | |||
+ | Besonderheiten der Schaltung: | ||
+ | * Es wurden keine Treiber für die LEDs vorgesehen und davon ausgegangen, dass im Multiplexbetrieb die Ströme an den Ausgängen des ATMega8 nicht das Maximum überschreiten (siehe Datenblatt). Die verwendeten Vorwiderstände von 68 Ohm sind etwas sehr pessimistisch gewählt worden. Dieser Wert könnte noch etwas verringert werden, um die LEDs heller leuchten zu lassen. | ||
+ | * Der, für das Ein-/Ausschalten vorgesehene Taster muss mit einem der Controller-Pins für INT0 oder INT1 verbunden sein, um die Schaltung wieder aus dem Sleep-Zustand holen zu können. Deshalb gibt es keine "programmtechnisch günstige Verdrahtung", also alle 8 Spalten/Zeilen jeweils an einem Port. Dies ist bei der Programmierung der Firmware zu beachten, verkompliziert sie aber nicht wesendlich. | ||
=Software= | =Software= | ||
+ | ==Template== | ||
+ | |||
+ | Als Ausgangspunkt für eine Reihe von möglichen Programmen mit dieser Hardware, wurde erstmal ein [http://bralug.de/wiki-common/images/5/50/Led_8x8_template.tar.gz Applikations-Template] geschrieben. Folgende Dinge wurden hier bereits implementiert und können 1:1 in weitere Anwendungen übernommen werden: | ||
+ | * Hardwaredefinitionen (Definition der Ports/Pins usw. für die Taster und jede einzelne Steuerleitung der LED-Matrix) | ||
+ | * Multiplex-Ansteuerung der LED-Matrix im Timer0-Overflow-Interrupt des ATMega8. Es werden die Zeilen der Matrix einzeln durchgeschaltet und jeweils die entsprechenden Spalteninformationen ausgegeben. Die "Bildinformationen" befinden sich im globalen Feld <code>led[]</code>, welches nur noch mehr oder weniger sinnvoll gesetzt werden muss. | ||
+ | * Tasterabfrage mit Entprellung (Funktion <code>getkey()</code>), für jede betätigte Taste wird ein definierter Tastencode zurückgegeben. | ||
+ | * der Ein-/Ausschalter ist bereits im Template realisiert. Bei Betätigung dieses Tasters fährt der Controller in den Sleep-Modus mit der geringsten Stromaufnahme. Nach nochmaliger Betätigung des Tasters, startet der Controller wieder. | ||
+ | |||
+ | Desweiteren wurden 2 Farbmodi im Template realisiert, welches mit dem Define <code>TWO_BIT_DOTS</code> gesteuert werden kann und nach dem sich auch die Größe des Bildspeichers (Feld <code>led[]</code>) richtet: | ||
+ | * 2-Farb-Modus: <code>led[]</code> ist 8 Byte groß, jeweils ein Byte für eine Zeile, jedes Bit im jeweiligen Byte korrespondiert mit der entsprechenden Spalte in der Zeile. Bit=0 --> LED aus; Bit=1 --> LED an | ||
+ | * 4-Farb-Modus: es sind 4 Helligkeitsstufen pro LED definierbar. Dazu ist das Feld <code>led[]</code> 16 Byte lang, 2 Byte (ein word) für eine Zeile, jeweils 2 Bit für eine Spalte. Damit sind 4 Zustände pro LED möglich: 00=LED aus... 11=LED ganz hell. Softwaretechnisch wurde dieser Modus über Austastlücken während des Multiplexbetriebes realisiert. D.h, die 2-Bit-Zahl für die entsprechende LED gibt an, wieviel mal die LED in 4 aufeinander folgenden Zyklen angeschaltet wird. Theoretisch ist es auch möglich, noch mehr Helligkeitsabstufungen zu realisieren. Dazu müsste aber die Multiplex-Frequenz weiter erhöht werden, damit die LEDs mit geringer Helligkeit nicht anfangen (sichtbar) zu flackern. Die Erhöhung der Frequenz würde aber auch eine geringere Gesamthelligkeit ergeben... | ||
+ | |||
+ | ==Game of life== | ||
+ | |||
+ | In dieser [http://bralug.de/wiki-common/images/8/8e/Led_8x8_game_of_life.tar.gz Firmware] wurde das [http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens Game of Life] implementiert. Dabei wurden Conways originale Spielregeln umgesetzt. Es existieren zwei Spielmodi: | ||
+ | * einige bekannte Anfangspopulationen, welche mehr oder weniger interessante Effekte erzeugen; der Quelltext kann leicht durch weitere Bilder erweitert werden | ||
+ | * Zufallsmodus, bei dem die Anfangspopulationen mittels eines Zufallsgenerator erzeugt werden | ||
+ | |||
+ | |||
+ | ==Laufschrift== | ||
+ | |||
+ | Bei einer der letzten längeren Zugfahrten habe ich mich mit dieser [http://bralug.de/wiki-common/images/0/05/Led_8x8_laufschrift.tar.gz Firmware] vergnügt. Sie stellt eine Laufschrift auf der 8x8-LED-Matrix dar, was zwar bei der Matrix-Dimension reichlich sinnlos ist, weil nur recht wenig Zeichen gleichzeitig sichtbar sind, aber es war eine gute Programmierübung, die ein wenig Zeit vertrieben hat. | ||
+ | |||
+ | |||
+ | =="Dinge-von-oben-runterfallen-und-auffangen"-Spiel== | ||
+ | Neulich ist mir eins dieser elektronischen Billigspiele in die Hände gefallen, bei denen irgendetwas von oben nach unten fällt, was man dann mit einem Korb, Balken o.ä., welchen man mit 2 Tasten hin und her bewegen kann, auffangen muss. In dieser [http://bralug.de/wiki-common/images/0/02/Led_8x8_bomb.tar.gz Firmware] für das oben beschriebenes 8x8-LED-Matrix-Modul wurde mal ähnliches umgesetzt. Die Bedienung ist recht einfach, halt Balken mit den beiden unteren Tasten (rechts/links) hin und her bewegen, um möglichst viele Punkte aufzusammeln. Mit der Taste oben links kann der aktuelle Spielstand (kurz drücken) angezeigt. Hält man diese Taste etwas länger gedrückt, geht das Modul in den Schlafmodus.... | ||
+ | |||
+ | |||
+ | ==Die andere Uhr== | ||
+ | "[[Die andere Uhr]]" ist ja ideal für eine 8x8-LED-Matrix geschaffen. Zwar ist die vorgestellte Hardware nur einfarbig, aber trotzdem hier der [http://bralug.de/wiki-common/images/f/fe/Led_8x8_die_andere_uhr.tar.gz Quelltext der entsprechenden Firmware]. | ||
+ | |||
+ | Die beiden unteren Tasten können zum Einstellen der Uhrzeit verwendet werden, mit der Taste rechts oben kann die Zeit im Klartext als Laufschrift ausgegeben werden. Da in oben vorgestellter Hardware kein Quarz vorgesehen ist, darf man keine Wunder in Sachen Ganggenauigkeit erwarten. Theoretisch könnte man aber auch eine Uhrenquarz (z.B. wie in der [[Berliner Uhr]]) einbauen. Dazu müsste man zwei der drei Tasten auf Ports des ISP legen. | ||
+ | |||
− | + | ==Weitere Ideen== | |
+ | Mögliche Applikationen, die man mit dieser Hardware realisieren könnte: | ||
+ | * [http://de.wikipedia.org/wiki/Pong einfaches Pong-Spiel] | ||
+ | * ...? | ||
=Kontakt= | =Kontakt= | ||
[[Benutzer:bergeruw|Uwe]] | [[Benutzer:bergeruw|Uwe]] |
Aktuelle Version vom 9. Dezember 2010, 14:58 Uhr
Inhaltsverzeichnis |
[Bearbeiten] Motivation
Vor einiger Zeit kaufte ich bei Pollin ein 8x8-LED-Modul als Muster für ein geplantes Projekt. Als ich mich dann entschieden hatte, dieses Projekt wirklich in Angriff zu nehmen, war ausgerechnet dieses LED-Modul ausverkauft. Um das Muster nicht sinnlos rumliegen zu lassen, habe ich es jetzt als Ausgangspunkt für ein paar Spielereien mit einem ATMega8 und einer 8x8-Anzeige genommen, eine entsprechende Schaltung entworfen/aufgebaut sowie eine Art Applikationstemplate geschrieben...
[Bearbeiten] Hardware
Die Hardware besteht aus:
- einem ATMega8 in seiner einfachsten Grundschaltung
- drei Tastern
- und dem erwähnten 8x8-LED-Matrix-Modul (da ich kein Datenblatt hatte, musste ich die Anschlußbelegung selbst "durchklingeln"...)
Besonderheiten der Schaltung:
- Es wurden keine Treiber für die LEDs vorgesehen und davon ausgegangen, dass im Multiplexbetrieb die Ströme an den Ausgängen des ATMega8 nicht das Maximum überschreiten (siehe Datenblatt). Die verwendeten Vorwiderstände von 68 Ohm sind etwas sehr pessimistisch gewählt worden. Dieser Wert könnte noch etwas verringert werden, um die LEDs heller leuchten zu lassen.
- Der, für das Ein-/Ausschalten vorgesehene Taster muss mit einem der Controller-Pins für INT0 oder INT1 verbunden sein, um die Schaltung wieder aus dem Sleep-Zustand holen zu können. Deshalb gibt es keine "programmtechnisch günstige Verdrahtung", also alle 8 Spalten/Zeilen jeweils an einem Port. Dies ist bei der Programmierung der Firmware zu beachten, verkompliziert sie aber nicht wesendlich.
[Bearbeiten] Software
[Bearbeiten] Template
Als Ausgangspunkt für eine Reihe von möglichen Programmen mit dieser Hardware, wurde erstmal ein Applikations-Template geschrieben. Folgende Dinge wurden hier bereits implementiert und können 1:1 in weitere Anwendungen übernommen werden:
- Hardwaredefinitionen (Definition der Ports/Pins usw. für die Taster und jede einzelne Steuerleitung der LED-Matrix)
- Multiplex-Ansteuerung der LED-Matrix im Timer0-Overflow-Interrupt des ATMega8. Es werden die Zeilen der Matrix einzeln durchgeschaltet und jeweils die entsprechenden Spalteninformationen ausgegeben. Die "Bildinformationen" befinden sich im globalen Feld
led[]
, welches nur noch mehr oder weniger sinnvoll gesetzt werden muss. - Tasterabfrage mit Entprellung (Funktion
getkey()
), für jede betätigte Taste wird ein definierter Tastencode zurückgegeben. - der Ein-/Ausschalter ist bereits im Template realisiert. Bei Betätigung dieses Tasters fährt der Controller in den Sleep-Modus mit der geringsten Stromaufnahme. Nach nochmaliger Betätigung des Tasters, startet der Controller wieder.
Desweiteren wurden 2 Farbmodi im Template realisiert, welches mit dem Define TWO_BIT_DOTS
gesteuert werden kann und nach dem sich auch die Größe des Bildspeichers (Feld led[]
) richtet:
- 2-Farb-Modus:
led[]
ist 8 Byte groß, jeweils ein Byte für eine Zeile, jedes Bit im jeweiligen Byte korrespondiert mit der entsprechenden Spalte in der Zeile. Bit=0 --> LED aus; Bit=1 --> LED an - 4-Farb-Modus: es sind 4 Helligkeitsstufen pro LED definierbar. Dazu ist das Feld
led[]
16 Byte lang, 2 Byte (ein word) für eine Zeile, jeweils 2 Bit für eine Spalte. Damit sind 4 Zustände pro LED möglich: 00=LED aus... 11=LED ganz hell. Softwaretechnisch wurde dieser Modus über Austastlücken während des Multiplexbetriebes realisiert. D.h, die 2-Bit-Zahl für die entsprechende LED gibt an, wieviel mal die LED in 4 aufeinander folgenden Zyklen angeschaltet wird. Theoretisch ist es auch möglich, noch mehr Helligkeitsabstufungen zu realisieren. Dazu müsste aber die Multiplex-Frequenz weiter erhöht werden, damit die LEDs mit geringer Helligkeit nicht anfangen (sichtbar) zu flackern. Die Erhöhung der Frequenz würde aber auch eine geringere Gesamthelligkeit ergeben...
[Bearbeiten] Game of life
In dieser Firmware wurde das Game of Life implementiert. Dabei wurden Conways originale Spielregeln umgesetzt. Es existieren zwei Spielmodi:
- einige bekannte Anfangspopulationen, welche mehr oder weniger interessante Effekte erzeugen; der Quelltext kann leicht durch weitere Bilder erweitert werden
- Zufallsmodus, bei dem die Anfangspopulationen mittels eines Zufallsgenerator erzeugt werden
[Bearbeiten] Laufschrift
Bei einer der letzten längeren Zugfahrten habe ich mich mit dieser Firmware vergnügt. Sie stellt eine Laufschrift auf der 8x8-LED-Matrix dar, was zwar bei der Matrix-Dimension reichlich sinnlos ist, weil nur recht wenig Zeichen gleichzeitig sichtbar sind, aber es war eine gute Programmierübung, die ein wenig Zeit vertrieben hat.
[Bearbeiten] "Dinge-von-oben-runterfallen-und-auffangen"-Spiel
Neulich ist mir eins dieser elektronischen Billigspiele in die Hände gefallen, bei denen irgendetwas von oben nach unten fällt, was man dann mit einem Korb, Balken o.ä., welchen man mit 2 Tasten hin und her bewegen kann, auffangen muss. In dieser Firmware für das oben beschriebenes 8x8-LED-Matrix-Modul wurde mal ähnliches umgesetzt. Die Bedienung ist recht einfach, halt Balken mit den beiden unteren Tasten (rechts/links) hin und her bewegen, um möglichst viele Punkte aufzusammeln. Mit der Taste oben links kann der aktuelle Spielstand (kurz drücken) angezeigt. Hält man diese Taste etwas länger gedrückt, geht das Modul in den Schlafmodus....
[Bearbeiten] Die andere Uhr
"Die andere Uhr" ist ja ideal für eine 8x8-LED-Matrix geschaffen. Zwar ist die vorgestellte Hardware nur einfarbig, aber trotzdem hier der Quelltext der entsprechenden Firmware.
Die beiden unteren Tasten können zum Einstellen der Uhrzeit verwendet werden, mit der Taste rechts oben kann die Zeit im Klartext als Laufschrift ausgegeben werden. Da in oben vorgestellter Hardware kein Quarz vorgesehen ist, darf man keine Wunder in Sachen Ganggenauigkeit erwarten. Theoretisch könnte man aber auch eine Uhrenquarz (z.B. wie in der Berliner Uhr) einbauen. Dazu müsste man zwei der drei Tasten auf Ports des ISP legen.
[Bearbeiten] Weitere Ideen
Mögliche Applikationen, die man mit dieser Hardware realisieren könnte:
- einfaches Pong-Spiel
- ...?