Projekt 26: LED-Würfel 2.0: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
(11 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Projekte]] | |||
[[Datei:würfel.jpg|200px|thumb|right|Bild 1: LED-Würfel.]] | |||
Im Rahmen des Elektrotechnik Fachpraktikums, im 5 Fachsemester des Studiengangs Mechatronik, WS2013/2014, haben wir uns mit einem LED-Würfel beschäftigt. | Im Rahmen des Elektrotechnik Fachpraktikums, im 5 Fachsemester des Studiengangs Mechatronik, WS2013/2014, haben wir uns mit einem LED-Würfel beschäftigt. | ||
Zeile 24: | Zeile 26: | ||
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. | 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. | Dieser Aufbau ermöglicht es, durch das Multiplexverfahren jede LED einzeln anzusteuern. | ||
Der Würfel wurde von einer anderen Gruppe zusammengebaut und in Betrieb genommen. | |||
Weitere Information zum Aufbau des Würfels befinden sich in [[Datei:LED-CUBE_Dokumentation.pdf]], welches die Dokumentation der Gruppe ist, die den Würfel zusammengebaut hat. | |||
Zeile 49: | Zeile 47: | ||
Siehe hierzu [http://de.wikipedia.org/wiki/Multiplexverfahren Multiplexverfahren] | Siehe hierzu [http://de.wikipedia.org/wiki/Multiplexverfahren Multiplexverfahren] | ||
Zeile 55: | Zeile 54: | ||
[[Datei:würfel_schaltplan.png|100px|thumb|right|Bild 4: Schaltbild]] | [[Datei:würfel_schaltplan.png|100px|thumb|right|Bild 4: Schaltbild]] | ||
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. | 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 entspricht, darstellen. | ||
Zeile 63: | Zeile 65: | ||
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== | ==Quellcode== | ||
#include <avr/io.h> //AVR-Studio Basis Biblothek | #include <avr/io.h> //AVR-Studio Basis Biblothek | ||
#include <util/delay.h> //Biblothek mit der Funktion _delay_ms() | #include <util/delay.h> //Biblothek mit der Funktion _delay_ms() | ||
int main (void) { | int main (void) { | ||
DDRC = 0xFF; //PORT;A,C,D werden als Ausgänge aktiviert | DDRC = 0xFF; //PORT;A,C,D werden als Ausgänge aktiviert | ||
DDRA = 0xFF; | DDRA = 0xFF; | ||
DDRD = 0xFF; | DDRD = 0xFF; | ||
int8_t a,b,c,d; // Variablen werden gesetzt | int8_t a,b,c,d; // Variablen werden gesetzt | ||
while(1) | while(1) | ||
{ | { | ||
////////////////////////////////////// | |||
///// | ////////////////////////////////////// | ||
////////////////////////////////////// | /////////////XY_Bewegung////////////// | ||
for(a=0;a<8;a++) //Schieberegister wird gefüllt | ////////////////////////////////////// | ||
{ | |||
PORTA = 0xFF; //Alle 8 Schieberegister werden gleichzeitig beschrieben | for(a=0;a<8;a++) //Schieberegister wird gefüllt | ||
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 | PORTA = 0xFF; //Alle 8 Schieberegister werden gleichzeitig beschrieben | ||
} | PORTC = (1<<PC1); //PC1 Ausgang am PORTC, Takt für die Schiebregister | ||
PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben | PORTC = 0x00; //Bei jeder positiven Flanke wird der Eingang des Schieberegister in Speicher geschrieben und um ein Stelle verschoben | ||
PORTC = 0x00; //Alle Ausgänge PORTC werden auf 0 gesetzt | } | ||
for(a=0;a<3;a++) //Anzahl Wiederholungen der XY_Bewegung | PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben | ||
{ | PORTC = 0x00; //Alle Ausgänge PORTC werden auf 0 gesetzt | ||
for(b=0;b<8;b++) //MOSFET/Ebene wird aufwärts geschaltet von | for(a=0;a<3;a++) //Anzahl Wiederholungen der XY_Bewegung | ||
{ //Ebene 1-8 | { | ||
PORTD = (1<<b) ; //Ebene wird eingeschaltet | for(b=0;b<8;b++) //MOSFET/Ebene wird aufwärts geschaltet von | ||
_delay_ms(40); //dauer wie lange eine Ebene an ist | { //Ebene 1-8 | ||
} | PORTD = (1 << b) ; //Ebene wird eingeschaltet | ||
for(b=7;b>-1;b--) //MOSFET/Ebene wird abwärts geschaltet von | _delay_ms(40); //dauer wie lange eine Ebene an ist | ||
{ //Ebene 8-1 | } | ||
_delay_ms(40); //dauer wie lange eine Ebene an ist | for(b=7;b>-1;b--) //MOSFET/Ebene wird abwärts geschaltet von | ||
PORTD = (1<<b) ; //Ebene wird eingeschaltet | { //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 /// | PORTD = 0x00; // Alle Ausgänge PORTD/Ebenen werden auf 0 gesetzt | ||
////////////////////////////////////// | |||
for(a=0;a<8;a++) //Alle XY_Ebenen werden schneller als 25 HZ | ////////////////////////////////////// | ||
//////Alle_LEDs_an + XY_Bewegung////// | |||
PORTA = 0xff; | ////////////////////////////////////// | ||
PORTC = (1<<PC1); | |||
PORTC = 0x00; | for(a=0;a<8;a++) //Alle XY_Ebenen werden schneller als 25 HZ nacheinander geschaltet dadurch entsteht ein Standbild | ||
} | { | ||
PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben | PORTA = 0xff; | ||
PORTC = 0x00; // Alle Ausgänge PORTC werden auf 0 gesetzt | PORTC = (1<<PC1); | ||
for(a=0;a<120;a++) | PORTC = 0x00; | ||
{ | } | ||
for(b=0;b<8;b++) | PORTC = (1<<PC2); //Speicher Schieberegister wird ins Ausgangsregister geschrieben | ||
{ | PORTC = 0x00; // Alle Ausgänge PORTC werden auf 0 gesetzt | ||
_delay_ms(1); //Verzögerung zwischen umschalten der Ebenen | for(a=0;a<120;a++) | ||
PORTD = (1<<b) ; | { | ||
} | for(b=0;b<8;b++) | ||
} | { | ||
PORTD = 0x00; | _delay_ms(1); //Verzögerung zwischen umschalten der Ebenen | ||
PORTD = (1<<b) ; | |||
} | |||
} | |||
return 0; //Wird benötigt um das Programm korrekt zu beenden auch wenn | 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 132: | Zeile 139: | ||
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! | |||
Zeile 138: | Zeile 147: | ||
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. | 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. | ||
Aktuelle Version vom 8. Oktober 2014, 09:19 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.
Der Würfel wurde von einer anderen Gruppe zusammengebaut und in Betrieb genommen.
Weitere Information zum Aufbau des Würfels befinden sich in Datei:LED-CUBE Dokumentation.pdf, welches die Dokumentation der Gruppe ist, die den Würfel zusammengebaut hat.
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 entspricht, 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!