PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED-Cube 3x3x3



Inferno Camper
13.08.2011, 18:59
Hallo,

als Lernprojekt würde ich gerne einen 3x3x3-LED-Cube mit dem RN-Control aufbauen. Ein LED würde ich an PORTA anschließen, davon gibt es ja beim RN-Control 12. Zu steuern wären 27 LEDs. Was ist hier die übliche Vorgehensweise der Steuerung? Ich möchte natürlich jedes LED per Programm einzeln ansteuern können.

Vielen Dank

Besserwessi
13.08.2011, 19:27
Die Hardware sollte damit relativ einfach sein: 9 Ausgänge mit Widerstand, besser auf 2 Ports verteilen, also nicht 8 mal an Port A, sondern besser zu 4 +5 auf 2 Ports verteilen. Dazu dann 3 Ausgänge mit Treiber (z.B. BC338-16 oder ULN2003).

Die Steuerung der LEDs sollte im Timer Interrupt laufen, wohl mit Software PWM mit vielleicht 8 Bit Auflösung, ggf. auch weniger, wenn die Zeit knapp wird. Die LEDs bekommen so je einen passend langen Puls und danach wird auf die nächste Ebene gewechselt. Für die LEDs gibt es dann ein Array mit 27 Einträgen für die Helligkeit der LEDs.

Inferno Camper
14.08.2011, 10:31
Verzeih mir, aber mit deiner vermutlich klugen Antwort kann ich als naiver Anfänger nichts anfangen.


Die Hardware sollte damit relativ einfach sein: 9 Ausgänge mit Widerstand, besser auf 2 Ports verteilen, also nicht 8 mal an Port A, sondern besser zu 4 +5 auf 2 Ports verteilen. Dazu dann 3 Ausgänge mit Treiber (z.B. BC338-16 oder ULN2003).

Hey hey... Okay, mit Treiber meinst du anscheinend Transistoren.
Warum neun Ausgänge? Das wäre dann eine Ebene. Und was heißt "dazu 3 Ausgänge"? Wie "dazu"? Wie wird das deines Erachtens verschaltet? :)



Die Steuerung der LEDs sollte im Timer Interrupt laufen, wohl mit Software PWM mit vielleicht 8 Bit Auflösung, ggf. auch weniger, wenn die Zeit knapp wird. Die LEDs bekommen so je einen passend langen Puls und danach wird auf die nächste Ebene gewechselt. Für die LEDs gibt es dann ein Array mit 27 Einträgen für die Helligkeit der LEDs.

Warum brauche ich einen Timer und die LEDs einen passenden Puls? Und wann und warum wird dann in die nächste Ebene gewechselt?
Ich habe mir das um ehrlich zu sein sehr viel naiver vorgestellt: ich hätte rundherum im Würfel einen Draht gespannt, an dem die Kathoden der LEDs schon angelötet werden. Nun muss schlicht an die Anode jeder LED eine Steuerleitung. Soll die LED leuchten, kommt da halt Saft drauf. Damit wäre das Problem doch schon abgefrühstückt, problematisch ist jetzt nur noch die Anzahl der Steuerleitungen (27), weil ich die nicht anschleßen kann und weil ein Steuer-Bus aus 27 Leitungen vielleicht auch nicht so Klasse aussieht. Daher die Frage, wie man das minimieren kann.

Sorry für die vielleicht doofen Fragen ;)
Danke

Besserwessi
14.08.2011, 11:07
Beim LED Cube nutzt man in der Regel eine Matrixansteuerung: Die LEDs einer Ebene werden mit den Kathoden zusammenschaltet und kommen damit an einen Treiber oder Transistor. Die Treiber sind nötig, denn hier geht der Strom von bis zu 9 LEDs gleichzeitig durch (bis knapp 200 mA in diesen Beispiel).

Die LEDs werden zwischen den Ebenen an den Anoden verbunden - hier je 3 zusammen, aus jeder Ebene eine. Von den 9 LED Gruppen geht es dann mit einem Vorwiderstand zu µC Ausgängen. Bei nur 3 Ebenen sollten die Ausgänge des µC noch kräftig genug sein. Ein Vorteil der Matixschaltung ist das man auch weniger Leitungen braucht und die dann im LED Cube nicht so stören. Für den 3x3x3 Cube braucht man nur 9+3 = 12 Leitungen statt sonst 27 + GND.
Die LED leuchten damit nicht alle gleichzeitig, sondern immer nur eine Ebene zur Zeit. Für eine kurze Zeit von vielleicht 5 ms leuchten dann die LEDs einer Ebene, und danach wird auch die nächste Ebene gewechselt. Eine geringer Helligkeit bekommt man wenn der Puls für die LED kürzer ist. Für den Anfang reicht es aber wenn die LEDs nur an/aus gehen. Eine Variable Helligkeit ist dann der nächste Schritt.

PicNick
14.08.2011, 11:08
Was Besserwessi stillschweigend vorausgesetzt hat, war, dass du die 27 LEDs per "multiplexing" steuern wirst.
d.h 3x3 = 9 LEDs per ebene und davon 3
man aktiviert Ebene 1 und dreht die LEDs dieser Ebene nach bedarf auf.
dann Ebene 2 und Ebene 3

Das Ganze flott und zyklisch

Torrentula
14.08.2011, 15:39
Mal ein Schaltplan wie das aussieht, wenn man denn multiplexing verwenden will: http://www.ledstyles.de/index.php?page=Attachment&attachmentID=5162&h=14fd27d042c0853320f7f045e11838b113fe8373

Der Code kann so aussehen:


#include <stdlib.h>
#include <avr/io.h>
// #include "def.h"
// #include "muster.txt"

unsigned char muster[4][6]= // muster[Bildnummer][Bildmuster]
{
{
0b01000000, 0b00000000, // Bild 1
0b00100000, 0b00000000,
0b00010001, 0b11111111
},

{
0b01000000, 0b00000000, // Bild 2
0b00100001, 0b11111111,
0b00010000, 0b00000000
},

{
0b01000001, 0b11111111, // Bild 3
0b00100000, 0b00000000,
0b00010000, 0b00000000
},

//...

{
0b01000000, 0b00000000, // Bild 10
0b00100000, 0b01010100,
0b00010000, 0b00000000
}
};

int main(void)
{
int bildnr;
int ebene;
int dauer_bild;
int dauer_ebene;

//Pins bzw. Ports als Ausgänge konfigurieren
DDRB = 0xFF; // 0b11111111 --> Alle Pins an Port B als Ausgänge
DDRD = 0b01110001; // 0b01110001 --> Benutzte Pins an Port D als Ausgänge

while(1)
{
for ( bildnr = 0; bildnr < 4; bildnr++ )
{
for ( dauer_bild = 0; dauer_bild < 10000; dauer_bild++ ) // geschätzt
{
for (ebene = 0; ebene < 3; ebene++)
{
for(dauer_ebene = 0; dauer_ebene < 50; dauer_ebene++) // geschätzt
{
PORTD = muster[bildnr][ebene*2]; // Ebene und LED Säule 1 ausgeben
PORTB = muster[bildnr][ebene*2+1]; // LEDs Säule 2 bis 9 ausgeben
}
PORTD=0; // Ebene und LEDs aus
PORTB=0;
}
}
}
}
return 0;
}


Diesen Code hat radbruch geschrieben. Den Code gibts bei Bedarf auch noch in BASCOM Basic einfach nochmal fragen.

Für das RN-Control müssen nur die Pindefinitionen angepasst werden.

MfG

Torrentula