LED Tetris

13
LED Tetris - Dokumentation Kathrin Graf Dominik Knoll HTL-Braunau

description

Dokumentation

Transcript of LED Tetris

LED Tetris -Dokumentation

Kathrin GrafDominik Knoll

HTL-Braunau

InhaltsverzeichnisAllgemeines 2

Aufgabenstellung 2

Allg. Beschreibung 2

Technische Daten 2

Zeitplan 3

Technische Dokumentation 4

Vorwort 4

Projektplanung 5

Ansatz 5

Lösungsvorschlag 5

Realisierung 5

Projekt-Durchführung 6

Elektronik 6

Mechanisch 10

Informatik 10

Beiliegend: 12

Programm 12

Datenblätter 12

1 von 12

AllgemeinesAufgabenstellung

Allg. Beschreibung

Das Ziel des Werkstättenprojekts war es eine funktionsfähige LED-Matrix zu konstruieren, auf der man

Tetris spielen kann. Wobei eine Schaltung für die Eingabe der Steuerbefehle, eine für die Versorgung und

Verbindung der I/O Pins des Microkontroller und die andere zum Ausgeben auf der 8x16 LED-Matrix

gedacht ist.

Technische Daten

Es wurde ein PIC 18F4520 gewählt da dieser genug I/O Pins besitzt um allein schon 24 Pins für das

Ansteuern der LED-Matrix zu verwenden, und er dennoch genug Ressourcen hat um etwaige Eingänge

einzulesen. Außerdem wird der PIC mit 4x8MHz, also 36 MHz getaktet, was genug Zeit lässt mit einem

Interruptsystem, zusätzlich zum kontinuierlichen Multiplexen der LED-Matrix, auch noch die

Steuervorgänge und die dazugehörigen graphischen Änderungen zu berechnen.

Die LED-Matrix ist über 8 Spalten und 16 Reihen anzusteuern, wobei 24 Transistoren die Verbindung zum

PIC herstellen, um sicherzugehen, dass keine zu großen Ströme auf der Prozessorplatine fließen. Die 128

Hochleistungsleds besitzen eine gewaltige Leuchtkraft und können so mit mit sehr kleinen Strömen

(2mA-3mA) betrieben werden, sodass kein Transistor über 100mA schalten muss.

Als Versorgung dient ein Handynetzteil welches von 9V auf 5V heruntergeregelt wird. Dies hat den Vorteil,

dass eine störungsfreie und genaue 5V Versorgung garantiert wird, mit maximalen Abweichungen von

0,2V. Außerdem kann, wenn mehr als 5V Versorgung verwendet wird, eine Diode als Verpolungsschutz

verwendet werden.

Also Programmierumgebung dient MPlab von Microchip und so wird auch die Programmiersprache C

(ohne ++ Erweiterung) - da C++ Microkontroller leider nicht sehr gebräuchlich sind, verwendet. Dadurch

sind leider einige Programmteile umständlicher geworden.

Das Steuern des Spielgeschehens wird mittels 3 einfachen Taster gewährleistet die durch Pull-up

Widerstände 0V oder 5V auf den Eingang legen.

Als Gehäuse dient eine 2mm Alu-Grundplatte, auf dieser die einzelnen Platinen mittels Abstandhalter

festgemacht wurden, diese wurden durch Flachbandleitungen bzw. Drahtleitungen und

dementsprechenden Stecker verbunden. Auf die fertige Alu-Grundplatte wurden wiederum durch 30mm

Abstand eine durchsichtige Plexiglasscheibe festgemacht. Außerdem sind noch 5mm Füße an der

Unterseite befestigt.

2 von 12

Zeitplan

Nr Arbeit laut Zeitplan Tatsächliche Arbeit

1 Grundlegende organisatorische Fragen geklärt Organisation + Schaltplanentwurf

2 Erstellung des Zeitplanes + 3x3 Matrix Organisation + Schaltplanentwurf

3 5x5 LED Prototyps - grundsätzliches Tetris Löt- und Programmierübung 3x3

4 LED Übungen Löt- und Programmierübung 5x5

5 Checkpoint Hardware; 8x16 Platine fertig Schaltplanentwurf LED-Platine

6 Erweiterung und Vorbereitung auf 8x16 Matrix Schaltplanentwurf LED-Platine

7 Checkpoint Hardware; 8x16 Platine Fertig Löt- und Messungen

8 Programmieren Inbetriebnahme

9 Programmieren Programmierübungen

10 Semesterpräsenation Semesterpräsentation

11 Programmierung und Generalabnahme Verbesserung des alten Schaltplans

12 Ideenfindung für das Gehäuse Schaltpanentwurf der anderen 2 Platinen

13 Umbau auf 10x20 LED MATRIX Löten/ Programmieren

14 Programmierung/Gehäusebau Löten/ Programmieren

15 Programmierung/Gehäusebau Programmierung

16 Programmierung Gehäuse

17 Programmierung und Fehlersuche Doku

18 Periferie + Sonderarbeiten + 4*4 Matrix Spannungsstablisator

Elektronik Informatik Mechanik

6 %

25 %

69 %

3 von 12

Technische Dokumentation Vorwort

Beginn der 4. Klasse: Unentschlossenheit! Es wird Zeit sich ein Projekt zu überlegen. Das erste eigene! Voller

Motivation und Begeisterung wurde gestartet. Hauptsächlich versucht man noch in den ersten Wochen die einen

oder anderen irrwitzigen Ideen zu finden die man noch einbauen könnte. Ganz nach der Vorstellung - ich hab ja

noch gar kein Grafikdisplay und ein paar 7-Segment anzeigen würden auch nicht schaden.

Doch bald merkt man, das die ersten Überlegungen doch nicht ganz realisierbar sind; das doch etwas dabei ist,

schnell mal einen Sensor auszuwerten oder es wirklich knifflig sein kann, bis man das PICkit zum laufen bringt.

Wo man Zeit hätte einplanen sollen, und das wir für unser Gehäuse nur 45 Minuten und keine 3 Tage brauchen,

merkten wir erst später. Der Zeitplan wurde zu einem Desaster, den man schnell wieder vergessen konnte -

einerseits weil man ohne Erfahrung, in keinster Weise einschätzen kann wie lange das Schaltungsdesign dauert,

und auf der anderen Seite früher oder später doch die Freizeit dran glauben muss. Maximal für eine grobe

Orientierung kann er zu Rate gezogen werden

Für uns war es faszinierend wie tief man in die Materie eintaucht. Besonders die Momente in denen man plötzlich

Fehler findet, die einem die letzten 3 Tage den Verstand raubten, sind sehr toll. Wer soll sonst in der

Theorieausbildung lernen, dass Stiftleiste und IC nicht gleich Kontakt bedeutet; und auch mal ein Transistor ohne

Grund kaputt sein kann?

Unserer Meinung nach ist es viel wichtiger gelehrt zu bekommen wie ich ein Problem löse - sei es mit Internet,

Büchern oder einem normalen Messgeräts - als eine bestimmte Problemstellung auswendig zu lernen. Denn

ohne genaues Kochrezept vom Lehrer wird es nötig sich in die Schaltung hineinzudenken und einmal drauf los zu

arbeiten.

Besonders toll ist es am Ende zu merken, das sämtliche Entscheidung selbst, und nur mit kleinen Beratungshilfe

von Lehrpersonen, getroffen wurden, und es (dennoch) funktioniert. Außergewöhnlich ist es außerdem, das man

die Schaltung, die Programme und sämtliche anderen Teile des Projekts auswendig kann was im normalen

Unterricht nur selten der Fall ist.

Schon zu Beginn des Projektes war das Schüler-Lehrer-Verhältnis toll. Ich habe noch keine Situation erlebt wo

eine beliebige Lehrperson, egal ob man sie im Unterricht hat oder nicht, egal ob in der Pause, im Unterricht oder

in der Freizeit einem nicht mit Rat und Tat bei dem Projekt zur Seite stand und bei etwaigen Problemen auch

gerne Anregungen zum Lösen beisteuerte.

Werkstättenprojekt_2010/11 - eine interessante Zeit mit vielen Aha-Erlebnissen !

4 von 12

Projektplanung

Ansatz

Ziel ist es möglichst simpel einen Display, bestehend aus THT-LEDs, anzusteuern und durch gewisse

Taster das Verändern dieser zu ermöglichen.

Lösungsvorschlag

Das Display, bestehende aus 10x20 LEDs, wird über insgesamt 24 Transistoren geschalten. Einerseits

NPN andererseits PNP Transistoren stellen sicher das nicht zu viel Strom von einem I/O Pins des

uController gezogen wird.

Es werden 30 Pins für die Ausgabe des Felds und 4 Pins für die Steuerung des Spielgeschehens am

uController reserviert.

Um die Informationen zum aktuellen Spielstand anzuzeigen soll zusätzlich eine kleine 4x4 Led-Matrix

angesteuert werden um die folgenden Spielfigur anzuzeigen. Außerdem soll es einerseits eine 4-stellige

7-Segment-Reihe für eine Uhr und eine andere 7-Segment-Reihe für die aktuellen Punkte geben.

Bei zusätzlicher Zeit ist auch ein Soundmodul geplant was den typischen Tetrissound nachahmen sollte.

Realisierung

Nach einigen Überlegungen wurde das Projekt folgendermaßen realisiert: Auf einer 8x16 Matrix (da hierfür

genau 3 Ports benötigt werden) wird über 3 Taster (statt ursprünglich 4) über einen Pull-up Widerstand der

uController gesteuert.

Außerdem wird auf das Soundmodul und zusätzlichen Erweiterungen um Zeit zu sparen verzichtet.

Das Programm besteht aus 2 Teilen. Einerseits dem kontinuierlichen Multiplexen der Matrix andererseits

das Reagieren auf etwaige Tastereingaben.

Auch anstatt der ursprünglichen Idee das komplette Projekt auf einer Platine zu entwerfen wurde

verworfen und in kleinere Teilprojekte unterteilt, die besser getestet und bei Funktionstüchtigkeit

ausgewechselt werden können.

5 von 12

Projekt-Durchführung

Elektronik

Allgemein

Grundsätzlich ist die Basisversorgung aller Platinen +5V. Diese Versorgung wird mittels einzelnen

Kabeln und „con-wavgo“ Klemmen verbunden. Die Anschlussleistung des gesamten Projekts ist im

Durchschnitt 50mA x 5V = 2.5W. Die Taster sind durch Flachbandleitungen an PORTB <1 - 3>

angeschlossen und die LED-Matrix ist durch PORTA/C/D <1 - 8> verbunden.

Spannungs-Stabilisierung Modul

Da der Microkontroller sehr sensibel auf Spannungsveränderungen reagiert war noch ein Adapter

zwischen Netztstecker (ein 9V Handyladegerät) und dem PIC notwendig. Hierfür wurde ein

Fixspannungsregler vom Typ LM7805 verwendet. Er regelt bis zu 12V Gleichspannung auf 5V

Gleichspannung, mit einer Genauigkeit von +/-0,2V, herunter also für den PIC, der eine Betriebsspannung

von 3V-5,5V benötigt, genau passend. Um nicht zuviel Platz zu verbrauchen wird der LM7805 einfach in

einem schlankes Kunststoffgehäuse platziert.

Grundsätzlich wird jede, zwischen LSP1 und LSP2, angelegte Spannung, die vom Handynetzteil kommt

und in den vorgesehenen Spannungsgrenzen liegt, auf 5V geregelt. Außerdem hat die Eingangsseite

noch eine Diode die als Verpolungsschutz dient.

Tasterplatine

Die Tasterplatine ist sehr simpel aufgebaut und besteht

eigentlich nur aus 2 Klemmenreihen, jeweils 2- und 3-

polig. Die erste Klemmreihe ist für die Versorgung

zuständig, die andere führt das Potential über den

Widerstand heraus.

Ist S1 offen liegt der Pin über den Pull-down-Widerstand

R1 (10k) auf Masse -> der Microkontroller interpretiert ihn

als offen.

Beim drücken von S2 fallen an R1 annähernd 5V ab -

> der Microkontroller interpretiert den Taster als

geschlossen.

Anzumerken ist noch das die Taster unabhängig von

einander ausgewertet werden können.

6 von 12

Prozessorplatine

Die Prozessorplatine dient dazu die benötigten I/O Pins herauszuführen, die Spannungsversorgung des

PIC anzulegen und natürlich den PICkit Adapter zu implementieren. Dadurch kann der PIC, über USB, auf

den Pins <39/40> programmiert werden. Diese Pins können natürlich danach als Output Pins verwendet

werden. Außerdem wird der Pin <1> noch über einen Pull-up-Widerstand (10k) auf +5V gezogen. Das

PICkit wird mit GND +5V und Pin <1> verbunden.

Statt den ursprünglich geplanten Stiftleisten wurden Flachbandleitungen eingesetzt - da die Stecker

einfacher zu verbinden sind, eine bessere Verbindung garantieren und eleganter aussehen. Um dennoch

für 2 Leitungen eine gute Verbindung zu ermöglichen, statt eines 10-poligen Stecker wird nun eine „con-

wago“-Klemme verwendet.

Um auch etwaige Module einzubinden, die noch nicht geplant sind, werden an PORT B und E alle 8 Pins

herausgeführt und können somit, falls man sie benötigt, verwendet werden.

Wie alle Platinen wird diese mit 2 Schrauben und 3mm-Abstandhalter an der Alu-Platte angebracht.

7 von 12

Matrixplatine

Grundsätzlich kann nicht jede einzelne LED, zu einem bestimmten Zeitpunkt angesteuert werden -

trotzdem entsteht, mittels Multiplexing, die Illusion wie wenn jede LED einzeln angesteuert wird. (Siehe

Informatik/Multiplexing). Unten ist die vereinfachte Form einer einzelnen LED, sie besteht aus 2

Schaltstufen.

Der Emitter des oberen Transistors wird direkt und die Basis mittels

Pull-up auf Versorgung gelegt. Der pnp-Transistor schaltet durch den

Spannungsunterschied von Ube. Wenn der Microkontroller-Pin High ist

ist auch die Basis auf +5V. d.h kein Spannungsunterschied in Ube und

der Transistor sperrt. Ist der Output Pin auf Low, sprich 0V, wird die

Basis, über R2 auf Masse gelegt -> Spannungsunterschied -

Transistor schaltet durch und legt 5V an die LED an.

Der npn-Transistor funktioniert genau umgekehrt, wenn Ube größer ist

als 0,6V ist, schaltet er durch. R4 ist auch wichtig da ohne ihn keine

Strombegrenzung vorgenommen werden kann. Wenn der Pin auf Low

ist wird der Transistor in Sperrichtung betrieben. Bei High wird Masse

auf den Widerstand R3 gelegt

Der Vorwiderstand R3 begrenzt den Diodenstrom auf 3,8mA.

8 von 12

Nach ein paar Tests wurde ermittelt das, die für 20mA augelegten LEDs, am besten mit 3mA betrieben

werden - da ein BC557 16 LEDs ansteuert und er insgesamt nicht über 100mA schalten kann (100mA/16

= 6mA ). Darum wurde der Widerstand folgendermaßen errechnet:

( 5V - Ube1 - Ube2 - Udiode) / Idiode = 720R

(5- (0, + 0,6 + 1)) / 720R = Idiode

Idiode = 3,8mA

In dem oberen großen Schaltplan wurde aus Platzgründen nur die oberen 8x8 LEDs ausgedruckt,

dennoch sieht man hier den Sinn dieser Methode. Geht man davon aus das ein Microkontroller keine 128

Pins hat muss man die Spalten einzelnen durchschalten.

Nach jedem npn-Transistor folgen 16 LEDs die zusammen parallel mit dem Transistor auf Masse

geschalten sind. Schaltet der npn-Transistor durch liegt an allen LEDs 5V an - nun entscheidet der

pnp-Transistor ob auch der Vorwiderstand auf Masse gezogen wird, wenn ja fließt Strom, und die LED

leuchtet. So kann immer eine Spalte „aktiviert“ werden, sprich es ist möglich einzelne LEDs dieser Spalte

einzuschalten. Da sich die aktiven Spalten sehr schnell ändern ist ein blinken der LED nicht mehr

nachvollziehbar. Eine LED leuchtet maximal 0,125mS bis die zur nächsten Spalte weitergeschaltet wird.

Das Wichtigste ist immer, dass nur ein npn-Transistor eingeschaltet wird. Dadurch wird eine bestimmte

LED, wenn sie leuchten soll - jedoch nur 1/8 der Zeit wirklich leuchten. Aufgrund der Leuchtstärke und der

hohen Frequenz wird, dieses schnelle blinken aber als ein durchgehendes leuchten interpretiert.

Wie zuvor beschrieben werden die 8 Reihen und 16 Spalten mit Flachbandleitungen angesteuert, wobei

an den 10-poligen Leitungen immer nur 8 Signalleitungen anliegen. Versorgung und Masse werden wie

bei den anderen Schaltungen mittels Einzeldrahtleitungen und Klemmen verbunden.

9 von 12

Mechanisch

Wir haben einfach eine 24x18mm Platte aus Aluminium zugeschnitten – die 3 Platinen haben wir mit Hilfe von Abstandhaltern auf die Aluminiumplatte montiert. Alle 3 Platinen sind durch Flachbandleitungen bzw. Drahtleitungen und dementsprechenden Stecker verbunden worden.

Die fertige Aluminiumplatte und die 18x24mm Plexiglasplatte haben wir auch wiederum mit 30mm Abstandhalter verbunden.

An der Unterseite des fertigen Gehäuses wurden zusätzlich noch 5mm Abstandhalter, als Füße, montiert.

Informatik

Zusätzlich zu Elektronik ist die Informatik der größte Teil des Projekts. Es ist das erste Mal, dass wir ein

Programm solchen Umfanges geschrieben haben, wobei das Hauptproblem im Gegensatz zu PC-

Programmen, der PIC ist. Man muss zu jedem Zeitpunkt versuchen Speicher zu sparen, da nur ein winzig

kleiner Programm- und Datenspeicher zur Verfügung steht - und im Gegensatz zum Computer die

Taktfrequenz, von 36MHz, äußerst klein ist.

Trotzdem funktioniert das Programm in den meisten Situationen einwandfrei. Alles in allem ist es stabil und

Fehler sind im normalen Spielgeschehen nicht wahrzunehmen.

Näher eingehen möchte ich auf das Flussdiagramm, den Interruptabschnitt und die wichtigsten

Funktionen - wie die Spielzüge mit 2 Arrays berechnet werden.

Beiliegend sind Programmauschnitte ausgedrückt und werden erklärt.

10 von 12

Flussdiagramm

Grundsätzlich besteht das Programm aus 2 Teilen:

- die Auswertungen der Spielereingaben und das Reagieren des Programmes .

- die kontinuierliche Ausgabe des Spielfelds.

Beim Starten des Programmes wird die Variabel Init auf 0 gesetzt. Dies

bedeutet das kein Block initalisiert worden ist, daher ist kein Block (also

Spielfigur) im Spiel. Nur wenn dies der Fall ist, wird überprüft ob noch

Platz für einen weiteren Block, im oberen Spielfeld ist. Wenn nicht ist das

Spiel verloren. Da am Anfang jedoch das Feld noch leer ist wird ein

Block erzeugt und wir steigen in die nächste Schleife.

Je nach Schwierigkeit fallen die Spielfiguren unterschiedlich schnell. Dies

wird in dem Delay jedes Spielzuges gewartet. Zu dieser Zeit kann, falls

benötigt, ein externer Microkontroller mit Informationen, wie der

Punktzahl, versorgt werden.

Danach wird die aktuelle Taste ermittelt. Wobei dies nach Prioitäten

geschieht. Sind alle Tasten gedrückt wird dem Programm die Taste 3

zurückgegeben. Sind 1&2 gedrückt liest das Programm die Taste 2 aus.

Danach wird aus den Tasten der nächste Spielzug errechnet, wobei es

die Möglichkeiten des Drehens und des Links oder Rechts bewegen

gibt. Zusätzlich wird abgefragt ob, wenn dieser Zug ausgeführt wird, es

eine Berührung anderer, nicht mehr aktiver Spielfiguren, gibt. Wenn kein

hit erfolgt wird der Zug ausgeführt und es wird wieder auf eine

Tasteneingabe gewartet.

Würde beim Ausführen eine Berührung auftreten - wird dieser Zug

abgebrochen. Die aktive Spielfigur wird zu einer passiven, und wird als

normales Feld gewertet. Die Variabel Init wird auf false gesetzt, und ein

Algorithmus prüft ob ganze horizontale Reihen entstanden sind, löscht

diese bei Bedarf und berechnet den neuen Punktestand.

11 von 12

Beil iegend: Programm

Datenblätter

12 von 12