Projekt 26: LED-Würfel 2.0: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 64: | Zeile 64: | ||
Das Programm verwendet eine C++ identische Benutzeroberfläche, mit der man über 4 Ports an alle Bereiche des Microcontrollers Zugang hat. Um den Microcontroller programmieren zu können, benötigt man einen Flasher (zum Beispiel Atmel JTAGICE), den man sich, zum arbeiten in der Hochschule, ausleihen kann. | Das Programm verwendet eine C++ identische Benutzeroberfläche, mit der man über 4 Ports an alle Bereiche des Microcontrollers Zugang hat. Um den Microcontroller programmieren zu können, benötigt man einen Flasher (zum Beispiel Atmel JTAGICE), den man sich, zum arbeiten in der Hochschule, ausleihen kann. | ||
==Quellcode== | |||
#include <avr/io.h> //AVR-Studio Basis Biblothek | |||
#include <util/delay.h> //Biblothek mit der Funktion _delay_ms() | |||
int main (void) { | |||
DDRC = 0xFF; //PORT;A,C,D werden als Ausgänge aktiviert | |||
DDRA = 0xFF; | |||
DDRD = 0xFF; | |||
int8_t a,b,c,d; // Variablen werden gesetzt | |||
while(1) | |||
{ | |||
////////////////////////////////////// | |||
/////////////XY_Bewegung////////////// | |||
////////////////////////////////////// | |||
for(a=0;a<8;a++) //Schieberegister wird gefüllt | |||
{ | |||
PORTA = 0xFF; //Alle 8 Schieberegister werden gleichzeitig beschrieben | |||
PORTC = (1<<PC1); //PC1 Ausgang am PORTC, Takt für die Schiebregister | |||
PORTC = 0x00; //Bei jeder positiven Flanke wird der Eingang des Schieberegister in Speicher geschrieben und um ein Stelle verschoben | |||
} | |||
PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben | |||
PORTC = 0x00; //Alle Ausgänge PORTC werden auf 0 gesetzt | |||
for(a=0;a<3;a++) //Anzahl Wiederholungen der XY_Bewegung | |||
{ | |||
for(b=0;b<8;b++) //MOSFET/Ebene wird aufwärts geschaltet von | |||
{ //Ebene 1-8 | |||
PORTD = (1 << b) ; //Ebene wird eingeschaltet | |||
_delay_ms(40); //dauer wie lange eine Ebene an ist | |||
} | |||
for(b=7;b>-1;b--) //MOSFET/Ebene wird abwärts geschaltet von | |||
{ //Ebene 8-1 | |||
_delay_ms(40); //dauer wie lange eine Ebene an ist | |||
PORTD = (1<<b) ; //Ebene wird eingeschaltet | |||
} | |||
} | |||
PORTD = 0x00; // Alle Ausgänge PORTD/Ebenen werden auf 0 gesetzt | |||
////////////////////////////////////// | |||
//////Alle_LEDs_an + XY_Bewegung////// | |||
////////////////////////////////////// | |||
for(a=0;a<8;a++) //Alle XY_Ebenen werden schneller als 25 HZ nacheinander geschaltet dadurch entsteht ein Standbild | |||
{ | |||
PORTA = 0xff; | |||
PORTC = (1<<PC1); | |||
PORTC = 0x00; | |||
} | |||
PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben | |||
PORTC = 0x00; // Alle Ausgänge PORTC werden auf 0 gesetzt | |||
for(a=0;a<120;a++) | |||
{ | |||
for(b=0;b<8;b++) | |||
{ | |||
_delay_ms(1); //Verzögerung zwischen umschalten der Ebenen | |||
PORTD = (1<<b) ; | |||
} | |||
} | |||
PORTD = 0x00; | |||
} | |||
//die erste while-Schleife wird nie Verlassen deswegen beginnt das Programm dann immer wieder von Anfang | |||
return 0; //Wird benötigt um das Programm korrekt zu beenden auch wenn es bis hier wegen der while(1) nie ankommt | |||
} | |||
Zeile 70: | Zeile 136: | ||
An der 10-poligen Schnittstelle, für den Flasher, ist zwischen den Kontakten '2' (+5V) und '4' (GND) ein Kurzschluss vorhanden, sodass man sich die Versorgungsspannung direkt vom Netzteil abzweigen muss. Dies gilt nur für die Programmierung, da sich sonst keine Verbindung aufbauen lässt. | An der 10-poligen Schnittstelle, für den Flasher, ist zwischen den Kontakten '2' (+5V) und '4' (GND) ein Kurzschluss vorhanden, sodass man sich die Versorgungsspannung direkt vom Netzteil abzweigen muss. Dies gilt nur für die Programmierung, da sich sonst keine Verbindung aufbauen lässt. | ||
Außerdem weißt die 5te Ebene einen Wakelkontakt auf, welcher nur sporadisch auftritt. | Außerdem weißt die 5te Ebene einen Wakelkontakt auf, welcher nur sporadisch auftritt. | ||
Die Fehler wurden nicht behoben, da | |||
Die Fehler wurden nicht behoben, da der Würfel nicht neu aufgebaut wurde! | |||
Version vom 13. Februar 2014, 16:47 Uhr
Im Rahmen des Elektrotechnik Fachpraktikums, im 5 Fachsemester des Studiengangs Mechatronik, WS2013/2014, haben wir uns mit einem LED-Würfel beschäftigt.
Ein LED-Würfel kann als eine 3-Dimensionale LED Anzeige betrachtet werden, auf der verschiedene Symbole, Figuren oder auch Texte dragestellt werden können.
Aufbau des Würfels
Zu sehen ist ein gelöteter Würfel, der aus 8^3 grünen 3mm LED's besteht, was einer Anzahl von 512 LED's entspricht. Dieser Würfel ist auf einem Holzblock befestigt, indem sich die Schaltung befindet.
Die wichtigsten Bauteile in der Schaltung sind der Microcontroller (Atmega 32), 8 Schieberegister, 8 MOSFET's und diverse Widerstände. Die LED's sind in 8 Ebenen zusammengefasst. Jede Ebene enthält jeweils 8 LED's in der x-Achse und y-Achse.
Jede LED hat einen positiven (Anode) und negativen (Kathode) Anschlusspunkt. Die Kathoden formen die Ebenen (Bild 2:8 Kathodenebenen), dass heißt die Kathoden auf der jeweiligen Ebene sind miteinander verbunden. Die Anoden bilden 64 Reihen in der z-Achse (Bild 3:64 Anodenreihen), demzufolge besteht eine Reihe aus 8 LED's, welche auf den 8 verschiedenen Ebenen liegen. Dadurch ist ein geringerer Verdrahtungsaufwand nötig. Es werden lediglich 8 Drähte für die Ebenen und 64 Drähte für die Reihen gebraucht, was zusätzlich ermöglicht, mit weniger Ausgängen am Microcontroller zu Arbeiten.
Dieser Aufbau ermöglicht es, durch das Multiplexverfahren jede LED einzeln anzusteuern.
Multiplexverfahren
Eine einzelne LED lässt sich ansteuern, indem lediglich die Signale einer Reihe und einer Ebene eingeschaltet werden.
Will man LED's in verschiedenen Reihen bzw. Ebenen zur gleichen Zeit leuchten lassen, werden diese in einer Frequenz >25Hz nacheinander eingeschaltet. Durch dieses schnelle Ein- und Ausschalten, nimmt das menschliche Auge das Blinken als Leuchten wahr.
Möchte man mehr als 64 LED's gleichzeitig leuchten lassen, müssen diese mit einer Frequenz >25Hz blinken, da sonst die maximale Stomaufnahme von 1.3A des Würfels überschritten wird.
Siehe hierzu Multiplexverfahren
Schaltplan
Auf dem Schaltplan erkennt man links die 8 MOSFETs, welche zur Ansteuerung aller 8 Ebenen dienen. Mittig ist der Microcontroller mit einer 10-poligen Schnittstelle angeordnet, welche eine Verbindung mit dem Computer ermöglicht. Rechts danaben sind die 8 Schieberegister mit jeweils 8 LED's, welche 64 LED's pro Ebene darstellen.
Software
Zur Programmierung des Atmel-Mega32 (eingebauter Microcontroller) kann man das dazugehörige Programm Atmel Studio 6, welche als freeware downloadbar ist, benutzen.
Das Programm verwendet eine C++ identische Benutzeroberfläche, mit der man über 4 Ports an alle Bereiche des Microcontrollers Zugang hat. Um den Microcontroller programmieren zu können, benötigt man einen Flasher (zum Beispiel Atmel JTAGICE), den man sich, zum arbeiten in der Hochschule, ausleihen kann.
Quellcode
#include <avr/io.h> //AVR-Studio Basis Biblothek #include <util/delay.h> //Biblothek mit der Funktion _delay_ms() int main (void) { DDRC = 0xFF; //PORT;A,C,D werden als Ausgänge aktiviert DDRA = 0xFF; DDRD = 0xFF; int8_t a,b,c,d; // Variablen werden gesetzt while(1) { ////////////////////////////////////// /////////////XY_Bewegung////////////// ////////////////////////////////////// for(a=0;a<8;a++) //Schieberegister wird gefüllt { PORTA = 0xFF; //Alle 8 Schieberegister werden gleichzeitig beschrieben PORTC = (1<<PC1); //PC1 Ausgang am PORTC, Takt für die Schiebregister PORTC = 0x00; //Bei jeder positiven Flanke wird der Eingang des Schieberegister in Speicher geschrieben und um ein Stelle verschoben } PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben PORTC = 0x00; //Alle Ausgänge PORTC werden auf 0 gesetzt for(a=0;a<3;a++) //Anzahl Wiederholungen der XY_Bewegung { for(b=0;b<8;b++) //MOSFET/Ebene wird aufwärts geschaltet von { //Ebene 1-8 PORTD = (1 << b) ; //Ebene wird eingeschaltet _delay_ms(40); //dauer wie lange eine Ebene an ist } for(b=7;b>-1;b--) //MOSFET/Ebene wird abwärts geschaltet von { //Ebene 8-1 _delay_ms(40); //dauer wie lange eine Ebene an ist PORTD = (1<<b) ; //Ebene wird eingeschaltet } } PORTD = 0x00; // Alle Ausgänge PORTD/Ebenen werden auf 0 gesetzt ////////////////////////////////////// //////Alle_LEDs_an + XY_Bewegung////// ////////////////////////////////////// for(a=0;a<8;a++) //Alle XY_Ebenen werden schneller als 25 HZ nacheinander geschaltet dadurch entsteht ein Standbild { PORTA = 0xff; PORTC = (1<<PC1); PORTC = 0x00; } PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben PORTC = 0x00; // Alle Ausgänge PORTC werden auf 0 gesetzt for(a=0;a<120;a++) { for(b=0;b<8;b++) { _delay_ms(1); //Verzögerung zwischen umschalten der Ebenen PORTD = (1<<b) ; } } PORTD = 0x00; } //die erste while-Schleife wird nie Verlassen deswegen beginnt das Programm dann immer wieder von Anfang return 0; //Wird benötigt um das Programm korrekt zu beenden auch wenn es bis hier wegen der while(1) nie ankommt }
Problemstellung
An der 10-poligen Schnittstelle, für den Flasher, ist zwischen den Kontakten '2' (+5V) und '4' (GND) ein Kurzschluss vorhanden, sodass man sich die Versorgungsspannung direkt vom Netzteil abzweigen muss. Dies gilt nur für die Programmierung, da sich sonst keine Verbindung aufbauen lässt. Außerdem weißt die 5te Ebene einen Wakelkontakt auf, welcher nur sporadisch auftritt.
Die Fehler wurden nicht behoben, da der Würfel nicht neu aufgebaut wurde!
Projektweiterentwicklung
Zur Projektweiterentwicklung empfielt es sich die Schaltung neu aufzubauen, um die Fehler zu eleminieren. Zum Neuaufbau der Schaltung kann zum Beispiel eine Platine mit dem Fräsbohrplotter erstellt werden.
Verbesserungsvorschläge zum Artikel
Ulrich Schneider (Diskussion) 11:58, 25. Jan. 2014 (CET)
- Zusammenfassung und Lessons Learned fehlen.
- Zip-Datei und ein Großteil der geforderten Dokumente fehlen.
- BOM, Projektpläne, PAP fehlen.
Prof. Dr. Mirek Göbel am 31. Jan. 2014:
- Quellcode bitte als Extra Artikel anlegen (nicht als pdf!)
- Verweisen Sie auf die Vorarbeit Ihrer Vorgänger (alles bei Ihnen bis Software)
- Beschreiben Sie ausführlich die PRogrammierweise! Wie kann ich per Software gezielt LEDs schalten, wie Muster schalten?
- Es wird nicht klar, ob Sie die genannten Probleme behoben haben.
- insgesamt zu knappe Darstellung!