Ich sah mir im Internet einige Seiten über LED-Würfel an und interessierte mich für diese und die dahinter liegende Ansteuerung, das Multiplexen. Ich wollte aber nicht einfach einen nachbauen und entschied mich nach kurzem Überlegen, ein Vier-Gewinnt-Spiel auf Basis einer LED-Matrix zu bauen. Es ist ein überschaubares Projekt, bei dem ich auch gut meine Kinder mitbauen lassen kann, die auch begeistert mitlöten und basteln.
Das fertige Phier-Gewinnt-Spiel |
Im Zentrum steht eine (7×6)-Matrix aus 42 Duo-LEDs. Technisch gesehen, sind es zwei parallele Matrizen (7×6×2). Dabei sind die Anoden in Spalten und die Kathoden in Reihen verbunden und werden mit einem ATmega32 gemultiplext.
Jeder Spieler hat eine Reihe mit sieben farbigen Tastern vor sich, die jeweils einer Spalte zugeordnet sind und das Einwerfen eines Spielsteins simulieren. Eine weitere Duo-LED zeigt an, welcher Spieler am Zug ist.
Ansonsten gibt es einen Hauptschalter am Batteriefach, einen Reset- und einen Starttaster, einen sechspoligen ISP-Stecker und die Grundbeschaltung des μCs.
Der Schaltplan setzt sich aus den drei folgenden Komponenten zusammen:
Die Grundbeschaltung des ATmega32 |
Der ATmega32 wird über vier Mignonzellen in Reihe mit 5V versorgt. Der gesamte Aufbau ist gegenüber kleinen Spannungsungenauigkeiten unempfindlich und auch vom ADC werden keine absoluten Werte benötigt. Deshalb habe ich auf eine Spannungsregelung verzichtet. Lediglich der Abblockkondensator C0 mit 100nF zwischen VCC und GND ist Pflicht. Des weiteren ist die ISP-Schnittstelle über eine 6-poligen Stiftleiste zugänglich. Ein RESET-Taster und ein einzelner Taster an PinA7 ist ebenfalls verbaut, R0 ist dabei der externe PullUp-Widerstand des RESET-Pins. Der ADC verwendet eine interne Referenzspannung in Höhe von VCC, deshalb ist AREF über einen Kondensator mit GND verbunden. Atmel empfiehlt in seinem Datenblatt die Verbindung von AVCC mit einer Spule, hier L1, nach VCC und einem Kondensator, hier C1, nach GND um Störungen abzufangen und zu minimieren. Eine Duo-LED mit den Vorwiderständen R1 und R2 an PinC6 bzw. PinC7 zeigt an, welcher Spieler gerade am Zug ist.
Das Tastenfeld des Spiels |
Das Tastenfeld besteht aus einer Widerstandskette mit sieben 1kΩ-Widerständen (R3 bis R8 und R10) in Reihe. Zwischen ihnen sind Taster mit den ADC-Eingängen ADC0 und ADC1 verbunden. Somit bildet jede Taste für sich mit den Widerständen Spannungsteiler, deren Werte am ADC eindeutig zugeordnet werden können. R9 und R11 sind PullUp-Widerstände, die die ADC-Eingänge auf VCC ziehen.
Die Duo-LED-Matrix |
Die Transistoren Tx_GND sind mit PinC0 bis PinC6 verbunden und schalten die Zeilen der Matrix. Sie benötigen je einen Basiswiderstand Rx_GND. Die Spalten der roten Seite wird durch die Transistoren Tx_RT an PinD0 bis PinD6 geschaltet, die Spalten der grünen Seite mit Tx_GN an PinB0 bis PinB6. Hier sind keine Basiswiderstände nötig, allerdings müssen die Spaltenströme mittels den Widerständen Rx_RT und Rx_GN begrenzt werden.
Schaltpläne zum herunterladen:
phier-gewinnt-1.0.sch | E.A.G.L.E.-Schaltplan gesamt | 28.10.12 | 509,1 kByte |
phier-gewinnt-1.0.png | Schaltplan gesamt, Größe: 2566 x 1456 | 28.10.12 | 62,5 kByte |
grundbeschaltung-1.0.png | Nur Grundschaltung, Größe: 1008 x 797 | 28.10.12 | 21,7 kByte |
tastenfeld-1.0.png | Nur Tastenfeld, Größe: 880 x 337 | 28.10.12 | 5,8 kByte |
led-matrix-1.0.png | Nur LED-Matrix, Größe: 1446 x 1337 | 28.10.12 | 33,2 kByte |
Die LEDs
Die Duo-LEDs sind von Kingbright, Herstellerbezeichung: L-59EGW und werden bei Reichelt als LED 5 RG-3 geführt.
Auszug aus dem Datenblatt:
Farbe | Nennstrom | Maximaler Pulsstrom | Flussspannung |
INenn | IMax | UF | |
high effiency red | 30 mA | 150 mA | 2,5 V |
green | 25 mA | 150 mA | 2,5 V |
Berechnung der wichtigen Werte der Matrizen
Der Spaltenstrom IS teilt sich auf maximal 6 LEDs auf, ist also für ROT 6 × INenn = 180 mA und GRÜN = 150 mA. Da der maximale Pulsstrom einer LED 150 mA nicht überschreiten darf, gilt für ROT ebenfalls ein Maximum von 150 mA, für die Fälle, wo nur eine LED pro Spalte leuchtet.
Für die Berechnung des Vorwiderstands einer Spalte RS werden einige Werte der Transistoren benötigt. In dem Datenblatt des NPN-Transistors BC368 steht u.A. USat = 0,5 V und UBE = 1V, sowie hFE = 60.
Der Widerstand berechnet sich dann mit
RS = (VCC - USat - UBE - UF) / IMax = 6,67 Ω
Die Verlustleistung PS der Widerstände muss auch betrachtet werden und wird berechnet mit
PS = I2S × RS = 150 mW
Die Transistoren Tx_RT und Tx_GN arbeiten in Kollektorschaltung und benötigen deshalb keine Basiswiderstände, die Transistoren Tx_GND arbeiten in Emitterschaltung. Um die Ausgänge des μCs zu schützen, werden hier Basiswiderstände RB benötigt. Zuerst wird jedoch der maximale Zeilenstrom IZ und dann der Basisstrom IB berechnet:
IZ = INenn × 7 × 6 = 900 mA
IB = IZ / hFE = 15 mA
Jetzt kann RB wie folgt bestimmt werden:
RB = (VCC - UBE) / IB = 266,67 Ω
Ich habe Widerstände mit 240 Ω verbaut, weil die hier herumliegen und gut genug passen.
Natürlich muss die Verlustleistung PB am Basiswiderstand auch betrachtet werden:
PB = IB2 × RB = 60 mW
Da ist noch genug Luft nach oben.
Der Vorwiderstand einer Duo-LED
Die Vorwiderstände der einzelnen Duo-LED zur Anzeige des Spielzugs müssen auch berechnet werden. Dabei haben beide Farben unterschiedliche Vorwiderstände. Für die grüne Seite gilt
R1 = (VCC - UF) / INenn = 83,33 ≈ 82 Ω
und für rot dann äquivalent
R2 = 100 Ω
Widerstände im Tastefeld
Im Spiel wird immer der ADC-Eingang ausgelesen, der zu der Tasterreihe des ziehenden Spielers gehört. Somit gibt es eine eindeutige Zuordnung des ADC-Wertes mit der entsprechenden Taste. Lediglich das betätigen mehrerer Taster gleichzeitig führt zu unklaren Eingaben. Im Originalspiel versucht man allerdings auch nicht, mehrere Steine gleichzeitig einzuwerfen.
Mit einem kleinen Hilfsprogramm habe ich mir den ADC-Wert bei jeder Taste auf der Matrix ausgeben lassen und folgende Werte erhalten:
Taste | binäre Ausgabe | dezimaler Wert | Schwellwert |
keine | 11111111 | 255 | |
239 | |||
6 | 11011111 | 223 | |
209 | |||
5 | 11000010 | 194 | |
180 | |||
4 | 10100110 | 166 | |
151 | |||
3 | 10001000 | 136 | |
119 | |||
2 | 01100110 | 102 | |
71 | |||
1 | 00111100 | 60 | |
32 | |||
0 | 00000011 | 3 |
Die Schwellwerte liegen mittig zwischen den Messwerten und anhand dieser ordnet der μC den Wert den entsprechenden Tasten zu. Im Programm wird der ADC im Free Running Mode betrieben und Entprellung und Tastenzuordnung erfolgen in der ISR.
Als erstes muss ich sagen, ich habe den Aufwand etwas unterschätzt. Aus dem geplanten Sommerprojekt ist über ein Jahr Entwicklungszeit geworden. Gut, es gab auch diverse Wochen, in denen das Teil einfach in der Ecke lag, sei es mangels Zeit oder aus Frust, weil irgendwo der Fehlerteufel im Detail saß. Jetzt ist es aber soweit fortgeschritten, daß man Spielen kann und nur noch an der Software Änderungen vorgenommen werden.
Das offene gehäuselose Design gefällt mir gut, die Lochrasterplatine mit dem "geordneten Chaos" wirkt prototypenhaft. Alle Elemente sind gut zu erreichen und der Aufbau ist stabil genug. Die anfängliche Sorge, die LEDs könnten bei Tageslicht zu dunkel sein, hat sich nicht bestätigt. Zwar sieht man einen Unterschied in der Helligkeit, wenn in einer Reihe eine oder alle LEDs leuchten, insgesamt ist der jedoch nicht groß. Die Helligkeit reicht zwar auch bei Tageslicht, für die pralle Mittagssonne sind die LEDs aber zu dunkel.
Nachdem ich versucht habe, die Viererkette bei einem Gewinn blinkend hervorzuheben, musste ich feststellen, daß die Helligkeitsschwankungen dann stark auffallen. Somit muss ich leider auf diese Art von Markierung verzichten und eine Alternative finden.
Bei einem zweiten Aufbau würde ich dennoch ein paar Änderungen vornehmen. Die LED-Matrix würde noch zentraler im Lochraster angeordnet werden. Die SpielerLED, die anzeigt, wer am Zug ist, würde einen größeren Abstand zum Spielfeld bekommen. Der ISP-Anschluss könnte unter der Platine liegen, da er oben dann kein Platz wegnehmen würde. Neben diesen unwichtigeren Designkorrekturen gäbe es aber zwei Punkte, die überarbeitet werden sollten. Zum einen biegt sich die Platine bei Tastendrücken im Zentrum leicht durch. Für zwei weitere Verschraubungen ist im Nachhinein kein Platz mehr. Zum anderen ist die Wahl der Taster etwas ungünstig gewesen. Die Tasterköpfe kippen bei schrägem Druck schnell und verkannten dann manchmal. Auch wird nicht jeder Tastendruck erkannt, weswegen in seltenen Fällen ein zweites mal gedrückt werden muss. Ich kann nur empfehlen, bei einem ähnlichen Projekt andere Taster zu verwenden.
Alles in Allem war das Projekt sehr lehrreich, sowohl der Hardwareaufbau, als auch die Programmierung. Auch meine Kinder hatten Spaß beim Löten und erfreuen sich nun an einem elektronischen Spiel, an dem sie mitgebaut haben.
Der Quellcode
Version 1.0 ist fertig. Ich habe in den letzten zwei Tagen noch ein paar kleinere Fehler in der Gewinnerkennung gefunden und ein paar Kleinigkeiten optimiert. Nun sind alle geplanten Funktionen implementiert.
Nach dem Einschalten kann mit dem schwarzen Taster ausgewählt werden, wer anfängt. Die SpielerLED zeigt an, wer am Zug ist. Anschließend setzen die Spieler im Wechsel bis entweder alle Spielzüge gespielt wurden oder bis eine Viererkette erreicht ist. Im Falle eines Gewinns wird die Gewinnkette gelb hervorgehoben, die SpielerLED zeigt die Farbe des Gewinners. Tritt ein Unentschieden ein, zeigt das natürlich das volle Spielfeld, die SpielerLED leuchtet dann aber zusätzlich gelb. Ist ein Spiel beendet, wird das Spielfeld noch so lange angezeigt, bis ein Druck auf den schwarzen Taster ein neues Spiel startet. Es beginnt dann automatisch der Verlierer, oder bei Unentschieden, der Spieler, der in der letzten Runde nicht anfing.
Version 1.0 | Finale Version | viergewinnt_1.0.c | 07.11.2012 | 3,5 kByte |
funktionen.c | 07.11.2012 | 7,9 kByte | ||
funktionen.h | 07.11.2012 | 712 Byte | ||
init.c | 07.11.2012 | 2,4 kByte | ||
init.h | 07.11.2012 | 582 Byte | ||
interrupt.c | 07.11.2012 | 3,1 kByte | ||
interrupt.h | 07.11.2012 | 785 Byte | ||
viergewinnt_1.0.hex | 07.11.2012 | 5,8 kByte |
Liste der verwendeten Bauteile
Bauteil | Name | Anzahl | Wert | |
ATmega32 (+ Sockel) | IC1 | 1 | Datenblatt | |
Kondensatoren | C0, C1, C2 | 3 | 100 nF | |
Spule | L1 | 1 | 10 μH | |
Widerstände | R0, R9, R11 | 3 | 10 kΩ | |
Widerstände | R3 - R8, R10 | 7 | 1 kΩ | |
Widerstand | R1 | 1 | 100 Ω | |
Widerstand | R2 | 1 | 82 Ω | |
Widerstände | Rx_RT, Rx_GN | 14 | 6,8 Ω | |
Widerstände | Rx_GND | 6 | 240 Ω | |
Transistoren BC368 | Tx_GND, Tx_RT, Tx_GN | 20 | Datenblatt | |
Taster rot | Sx_RT, Sx_RESET | 8 | ||
Taster grün | Sx_GN | 7 | ||
Taster schwarz | S_START | 1 | ||
Duo-LEDs Kingbright L-59EGW | LED_xy, LED_SPIELER | 43 | Datenblatt | |
Stiftreihe, zweireihig | ISP | 6-polig |