Phi - Ein Roboter als Haustier und Gartenbewohner
http://parinor.pureplayaz.de/

OBEN RUNTER Zusammenfassung


OBEN RUNTER HOCH Idee

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.

PHIER-GEWINNT.ISOANSICHT
Das fertige Phier-Gewinnt-Spiel

OBEN RUNTER HOCH Technischer Überblick

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.


OBEN RUNTER HOCH Der Schaltplan

Der Schaltplan setzt sich aus den drei folgenden Komponenten zusammen:

PHIER-GEWINNT.GRUNDBESCHALTUNG
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.

PHIER-GEWINNT.TASTENFELD
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.

PHIER-GEWINNT.MATRIX
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

OBEN RUNTER HOCH Berechnungen zur Beschaltung der Bauteile

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

Der maximale Pulsstrom wird mit 1/10 DutyCycle und 0,1 ms Pulsweite angegeben. Bei 2 × 6 Reihen werden diese mit 1/12 gemultiplext. Um eine LED mit 100 Hz anzusteuern, was einer Pulsweite von 0,1 ms entspricht, muss die ISR mit 1,2 kHz aufgerufen werden. Dies erledigt der T/C2.

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.


OBEN RUNTER HOCH Fazit

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.


OBEN HOCH Anhang

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
OBEN Letzte Änderung: 21. Januar 2013 - © Per Petersen