Date post: | 22-Mar-2016 |
Category: |
Documents |
Upload: | dominik-knoll |
View: | 238 times |
Download: | 3 times |
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