INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
3x3x3 LED Cube
09.01.2014, 15:45
Beitrag #1
3x3x3 LED Cube
Hallo Leute,

ich bin neu hier im Forum und habe mir gedacht ich trage auch gleich mal etwas dazu bei Wink . Es geht hier um einen 3x3x3 LED Cube den ich nach diesem Schema aufgebaut habe.

3x3x3 & 4x4x4 led cube schematic help

Ich möchte hier weniger auf die Hardware eingehen, da diese überall beschrieben wird und nicht so schwer zu verstehen ist. Was mir meist gefehlt hat, ist ein (in meinen Augen) verständlicher und auf deutsch dokumentierter Quelltext, der auch nicht hunderte von Zeilen lang ist.

Daher habe ich mal hin gesetzt und einen Quelltext dafür geschrieben. Hoffentlich hilft er vielen Leuten weiter bei dem Verstehen solcher Projekte.

So nun der Quelltext Rolleyes

Code:
//Dieses Programm animiert einen 3x3x3 Würfel mit der Verwendung des Interrupts Timer02.
//Der Timer02 wird in diesem Beispiel mit 980Hz eingestellt.
//Jedes mal wenn der Interrupt ausgelöst, wird ein Layer eingeschaltet und der Inhalt von den Array (LayerXX) auf den aktiven LED-Layer übertragen.
//Wenn Layer03 beschrieben worden ist, wird wieder von vorne begonnen.
//Also wird immer ein Layer an geschaltet und die anderen aus. Durch das schnelle rotieren der Layer (980Hz/3 Layer) sieht es so aus als hat man
//ein stehendes Bild. Somit kann man sich in ruhe um die Animation im Hauptprogramm kümmern und muss sich nicht mehr um das Timing der Hardware kümmern ;-).

//In dem Hauptprogramm werden einfach die Animationsarraydaten (9x3 Bit (ist ein Würfelbild)) in den Array der einzelnen Layer geschrieben und eine bestimmte
//Zeit gewartet, dann wird das nächste Würfelbild geladen ....


int Layercounter = 1;
int animation_counter = 0;

boolean Layer01 [] = {1,1,1,                   //
                      1,0,1,                   //Speicher für Layer01
                      1,1,1};                  //

boolean Layer02 [] = {0,0,0,                   //
                      0,1,0,                   //Speicher für Layer02
                      0,0,0};                  //

boolean Layer03 [] = {0,0,0,                   //
                      0,0,0,                   //Speicher für Layer03
                      0,0,0};                  //


boolean animation_start [] ={
                        1,1,1,1,1,1,1,1,1,     //01  Layer01
                        1,1,1,1,1,1,1,1,1,     //02  Layer02
                        1,1,1,1,1,1,1,1,1,     //03  Layer03
                        1,1,1,1,1,1,0,0,0,     //04  Layer01
                        1,1,1,1,1,1,0,0,0,     //05  Layer02
                        1,1,1,1,1,1,0,0,0,     //06  ...
                        1,1,1,0,0,0,0,0,0,     //07  ...
                        1,1,1,0,0,0,0,0,0,     //08  ...
                        1,1,1,0,0,0,0,0,0,     //09
                        0,1,1,0,0,0,0,0,0,     //10
                        0,1,1,0,0,0,0,0,0,     //11
                        0,1,1,0,0,0,0,0,0,     //12
                        0,0,1,0,0,0,0,0,0,     //13
                        0,0,1,0,0,0,0,0,0,     //14  ...
                        0,0,1,0,0,0,0,0,0};    //15  Layer3

boolean animation1 [] ={0,0,1,0,0,0,0,0,0,     //01  Layer01
                        0,0,1,0,0,0,0,0,0,     //02  Layer02
                        0,0,1,0,0,0,0,0,0,     //03  Layer03
                        0,0,0,0,0,1,0,0,0,     //04  Layer01
                        0,0,0,0,0,1,0,0,0,     //05  Layer02
                        0,0,0,0,0,1,0,0,0,     //06  Layer03
                        0,0,0,0,0,0,0,0,1,     //07  Layer01
                        0,0,0,0,0,0,0,0,1,     //08  ...
                        0,0,0,0,0,0,0,0,1,     //09  ...
                        0,0,0,0,0,0,0,1,0,     //10  ...
                        0,0,0,0,0,0,0,1,0,     //11
                        0,0,0,0,0,0,0,1,0,     //12
                        0,0,0,0,0,0,1,0,0,     //13
                        0,0,0,0,0,0,1,0,0,     //14
                        0,0,0,0,0,0,1,0,0,     //15
                        0,0,0,1,0,0,0,0,0,     //16
                        0,0,0,1,0,0,0,0,0,     //17
                        0,0,0,1,0,0,0,0,0,     //18
                        1,0,0,0,0,0,0,0,0,     //19
                        1,0,0,0,0,0,0,0,0,     //20
                        1,0,0,0,0,0,0,0,0,     //21
                        0,1,0,0,0,0,0,0,0,     //22
                        0,1,0,0,0,0,0,0,0,     //23  ...
                        0,1,0,0,0,0,0,0,0};    //24  Layer03

boolean animation_blending_1_2 [] ={
                        0,0,1,0,0,0,0,0,0,     //01
                        0,0,1,0,0,0,0,0,0,     //02
                        0,0,1,0,0,0,0,0,0,     //03
                        0,0,1,0,0,0,0,0,0,     //04
                        0,0,1,0,0,0,0,0,0,     //05
                        0,0,0,0,0,0,0,0,0,     //06
                        0,0,1,0,0,0,0,0,0,     //07
                        0,0,0,0,0,0,0,0,0,     //08
                        0,0,0,0,0,0,0,0,0,     //09
                        0,1,1,0,0,0,0,0,0,     //10
                        0,0,0,0,0,0,0,0,0,     //11
                        0,0,0,0,0,0,0,0,0,     //12
                        1,1,1,0,0,0,0,0,0,     //13
                        0,0,0,0,0,0,0,0,0,     //14
                        0,0,0,0,0,0,0,0,0};    //15

boolean animation2 [] ={1,1,1,0,0,0,0,0,0,     //01
                        0,0,0,0,0,0,0,0,0,     //02
                        0,0,0,0,0,0,0,0,0,     //03
                        0,0,0,1,1,1,0,0,0,     //04
                        0,0,0,0,0,0,0,0,0,     //05
                        0,0,0,0,0,0,0,0,0,     //06
                        0,0,0,0,0,0,1,1,1,     //07
                        0,0,0,0,0,0,0,0,0,     //08
                        0,0,0,0,0,0,0,0,0,     //09
                        0,0,0,0,0,0,0,0,0,     //10
                        0,0,0,0,0,0,1,1,1,     //11
                        0,0,0,0,0,0,0,0,0,     //12
                        0,0,0,0,0,0,0,0,0,     //13
                        0,0,0,0,0,0,0,0,0,     //14
                        0,0,0,0,0,0,1,1,1,     //15
                        0,0,0,0,0,0,0,0,0,     //16
                        0,0,0,0,0,0,0,0,0,     //17
                        0,0,0,1,1,1,0,0,0,     //18
                        0,0,0,0,0,0,0,0,0,     //19
                        0,0,0,0,0,0,0,0,0,     //20
                        1,1,1,0,0,0,0,0,0,     //21
                        0,0,0,0,0,0,0,0,0,     //22
                        1,1,1,0,0,0,0,0,0,     //23
                        0,0,0,0,0,0,0,0,0};    //24

boolean animation_blending_2_3 [] ={
                        1,1,1,0,0,0,0,0,0,     //01
                        0,0,0,0,0,0,0,0,0,     //02
                        0,0,0,0,0,0,0,0,0,     //03
                        0,1,1,0,1,0,0,0,0,     //04
                        0,0,0,0,0,0,0,0,0,     //05
                        0,0,0,0,0,0,0,0,0,     //06
                        0,0,1,0,1,0,1,0,0,     //07
                        0,0,1,0,1,0,0,0,0,     //08
                        0,0,0,0,0,0,0,0,0,     //09
                        0,0,1,0,1,0,1,0,0,     //10
                        0,0,1,0,1,0,1,0,0,     //11
                        0,0,1,0,1,0,0,0,0,     //12
                        0,0,1,0,1,0,1,0,0,     //13
                        0,0,1,0,1,0,1,0,0,     //14
                        0,0,1,0,1,0,1,0,0};    //15

boolean animation3 [] ={0,0,1,0,1,0,1,0,0,     //01
                        0,0,1,0,1,0,1,0,0,     //02
                        0,0,1,0,1,0,1,0,0,     //03
                        0,0,0,1,1,1,0,0,0,     //04
                        0,0,0,1,1,1,0,0,0,     //05
                        0,0,0,1,1,1,0,0,0,     //06
                        1,0,0,0,1,0,0,0,1,     //07
                        1,0,0,0,1,0,0,0,1,     //08
                        1,0,0,0,1,0,0,0,1,     //09
                        0,1,0,0,1,0,0,1,0,     //10
                        0,1,0,0,1,0,0,1,0,     //11
                        0,1,0,0,1,0,0,1,0};    //12

boolean animation_blending_3_4 [] ={
                        0,0,1,0,1,0,1,0,0,     //01
                        0,0,1,0,1,0,1,0,0,     //02
                        0,0,1,0,1,0,1,0,0,     //03
                        0,0,1,0,1,0,1,0,0,     //04
                        0,0,1,0,1,0,1,0,0,     //05
                        0,0,0,0,0,0,0,0,0,     //06
                        0,0,1,0,1,0,1,0,0,     //07
                        0,0,0,0,0,0,0,0,0,     //08
                        0,0,0,0,0,0,0,0,0,     //09
                        0,1,1,0,1,0,0,0,0,     //10
                        0,0,0,0,0,0,0,0,0,     //11
                        0,0,0,0,0,0,0,0,0,     //12
                        1,1,1,0,0,0,0,0,0,     //13
                        0,0,0,0,0,0,0,0,0,     //14
                        0,0,0,0,0,0,0,0,0};    //15

boolean animation4 [] ={1,1,1,0,0,0,0,0,0,     //01
                        0,0,0,1,1,1,0,0,0,     //02
                        0,0,0,0,0,0,1,1,1,     //03
                        0,0,0,1,1,1,0,0,0,     //04
                        0,0,0,1,1,1,0,0,0,     //05
                        0,0,0,1,1,1,0,0,0,     //06
                        0,0,0,0,0,0,1,1,1,     //07
                        0,0,0,1,1,1,0,0,0,     //08
                        1,1,1,0,0,0,0,0,0,     //09
                        0,0,0,0,0,0,0,0,0,     //10
                        1,1,1,1,1,1,1,1,1,     //11
                        0,0,0,0,0,0,0,0,0};    //12

boolean animation_blending_4_5 [] ={
                        1,1,1,0,0,0,0,0,0,     //01
                        0,0,0,1,1,1,0,0,0,     //02
                        0,0,0,0,0,0,1,1,1,     //03
                        1,1,0,0,0,0,0,0,0,     //04
                        0,0,0,1,1,0,0,0,0,     //05
                        0,0,0,0,0,0,1,1,0,     //06
                        1,0,0,0,0,0,0,0,0,     //07
                        0,0,0,1,0,0,0,0,0,     //08
                        0,0,0,0,0,0,1,0,0,     //09
                        1,0,0,0,0,0,0,0,0,     //10
                        0,0,0,1,0,0,0,0,0,     //11
                        0,0,0,0,0,0,0,0,0,     //12
                        1,0,0,0,0,0,0,0,0,     //13
                        0,0,0,0,0,0,0,0,0,     //14
                        0,0,0,0,0,0,0,0,0};    //15

boolean animation5 [] ={1,0,0,0,0,0,0,0,0,     //01
                        0,0,0,0,0,0,0,0,0,     //02
                        0,0,0,0,0,0,0,0,0,     //03
                        1,1,0,1,0,0,0,0,0,     //04
                        1,0,0,0,0,0,0,0,0,     //05
                        0,0,0,0,0,0,0,0,0,     //06
                        1,1,1,1,1,0,1,0,0,     //07
                        1,1,0,1,0,0,0,0,0,     //08
                        1,0,0,0,0,0,0,0,0,     //09
                        0,1,1,1,1,1,1,1,0,     //10
                        1,1,1,1,1,0,1,0,0,     //11
                        1,1,0,1,0,0,0,0,0,     //12
                        0,0,1,0,1,1,1,1,1,     //13
                        0,1,1,1,1,1,1,1,0,     //14
                        1,1,1,1,1,0,1,0,0,     //15
                        0,0,0,0,0,1,0,1,1,     //16
                        0,0,1,0,1,1,1,1,1,     //17
                        0,1,1,1,1,1,1,1,0,     //18
                        0,0,0,0,0,0,0,0,1,     //19
                        0,0,0,0,0,1,0,1,1,     //20
                        0,0,1,0,1,1,1,1,1,     //21
                        0,0,0,0,0,0,0,0,0,     //22
                        0,0,0,0,0,0,0,0,1,     //23
                        0,0,0,0,0,1,0,1,1,     //24
                        0,0,0,0,0,0,0,0,0,     //25
                        0,0,0,0,0,0,0,0,0,     //26
                        0,0,0,0,0,0,0,0,1,     //27
                        0,0,0,0,0,0,0,0,0,     //28
                        0,0,0,0,0,0,0,0,0,     //29
                        0,0,0,0,0,0,0,0,0};    //30

boolean animation_end [] ={
                        0,0,0,0,0,0,0,0,0,     //01
                        0,0,0,0,1,0,0,0,0,     //02
                        0,0,0,0,0,0,0,0,0,     //03
                        0,0,0,0,0,0,0,0,0,     //04
                        0,0,0,1,1,1,0,0,0,     //05
                        0,0,0,0,0,0,0,0,0,     //06
                        0,0,0,0,0,0,0,0,0,     //07
                        1,1,1,1,1,1,1,1,1,     //08
                        0,0,0,0,0,0,0,0,0,     //09
                        1,1,1,1,1,1,1,1,1,     //10
                        1,1,1,1,1,1,1,1,1,     //11
                        1,1,1,1,1,1,1,1,1};    //12

void setup(){

  for (int Pin = 1; Pin < 14; Pin++)  {        //
    pinMode(Pin, OUTPUT);                      //setze pins als outputs    
  }                                            //
  pinMode(A0, OUTPUT);                         //
  pinMode(A1, OUTPUT);                         //
  pinMode(A2, OUTPUT);                         //

cli();                                         //stop interrupts
                                               //setze timer2 interrupt auf 980Hz
  TCCR2A = 0;                                  //setze vollständig TCCR2A register auf 0
  TCCR2B = 0;                                  //das gleiche für TCCR2B
  TCNT2  = 0;                                  //initialisiere Zählerwert auf 0
  OCR2A = 255;                                 // = (16*10^6) / (980*64) - 1 (muss kleiner als 256 sein)
  TCCR2A |= (1 << WGM01);                      // CTC mode anschalten
  TCCR2B |= (1 << CS22);                       // Setze CS22 bits für den 64 prescaler  
  TIMSK2 |= (1 << OCIE2A);                     // aktiviere timer vergleichs interrupt
sei();                                         //erlaube wieder interrupts

}                                              //Ende setup

ISR(TIMER2_COMPA_vect){                        
  switch (Layercounter){
    
    case 1:                                    //Wenn Layercounter = 1
      digitalWrite(A2,LOW);                    //Layer 3 aus
      digitalWrite(A1,LOW);                    //Layer 2 aus
      digitalWrite(A0,HIGH);                   //Layer 1 an
      for (int Pin = 1; Pin < 10; Pin++)  {    //
        digitalWrite(Pin+1, Layer01[Pin-1]);   //Schreibt die Neun bit vom Array "Layer01" zu dem LED-Layer01  
      }                                        //
      Layercounter=2;                          //Setze LayerCounter auf Zwei
      break;                                   //verlasse den Switch

    case 2:                                    //Wenn Layercounter = 2
      digitalWrite(A0,LOW);                    //Layer 1 aus
      digitalWrite(A2,LOW);                    //Layer 3 aus
      digitalWrite(A1,HIGH);                   //Layer 2 an
      for (int Pin = 1; Pin < 10; Pin++)  {    //
        digitalWrite(Pin+1, Layer02[Pin-1]);   //Schreibt die Neun bit vom Array "Layer02" zu dem LED-Layer02  
      }                                        //
      Layercounter=3;                          //Setze LayerCounter auf Drei
      break;                                   //verlasse den Switch

    case 3:                                    //Wenn Layercounter = 3
      digitalWrite(A0,LOW);                    //Layer 1 aus
      digitalWrite(A1,LOW);                    //Layer 2 aus
      digitalWrite(A2,HIGH);                   //Layer 3 an
      for (int Pin = 1; Pin < 10; Pin++)  {    //
        digitalWrite(Pin+1, Layer03[Pin-1]);   //Schreibt die Neun bit vom Array "Layer03" zu dem LED-Layer03
      }                                        //
      Layercounter=1;                          //Setze LayerCounter auf Eins
      break;                                   //verlasse den Switch

    default:                                   //
      break;                                   //verlasse den Switch
  }
}

//
//Die "animation" Funktion übernimmt die Animation.
//Man muss die Animationsquelle angeben, die Wiederholungen, die Animationslänge und die Pausen zwischen den Animationsschritten.
//Die Animatioslänge errechnet sich aus "Arraylänge/Anzahl der LEDs in einem Layer (9)/Anzahl der Layer (3)"
//Die animatiospause wird in Millisekunden angegeben.
//

void animation (boolean animation_buffer[], int loops, int animation_lenght, int animation_delay) {

  for (int Loop02 = 0; Loop02 < loops; Loop02++)  {
  animation_counter = 0;
    for (int Loop01 = 0; Loop01 < animation_lenght; Loop01++)  {
      for (int Pin = 0; Pin < 9; Pin++)  {
        Layer01[Pin] = animation_buffer[animation_counter] ;
        animation_counter++;    
      }
      for (int Pin = 0; Pin < 9; Pin++)  {
        Layer02[Pin] = animation_buffer[animation_counter] ;
        animation_counter++;    
      }
      for (int Pin = 0; Pin < 9; Pin++)  {
        Layer03[Pin] = animation_buffer[animation_counter] ;
        animation_counter++;    
      }
      delay (animation_delay);
    }
  }
}

void loop(){
  animation (animation_start,1,5,200);
  animation (animation1,2,8,100);
  animation (animation_blending_1_2,1,5,200);
  animation (animation2,2,8,100);
  animation (animation_blending_2_3,1,5,200);
  animation (animation3,4,4,100);
  animation (animation_blending_3_4,1,5,200);
  animation (animation4,4,4,100);
  animation (animation_blending_4_5,1,5,200);
  animation (animation5,2,10,100);
  animation (animation_end,1,4,200);
}

Bis denne Lup




Wenn jemand noch Verbesserungen hat Blush immer her damit Wink .
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2014, 18:59
Beitrag #2
RE: 3x3x3 LED Cube
Klingt echt interesant Baue auch selbt ganz gerne Cubes.
Mein Aktuelles Projekt ist einer mit einer RGB LED, 4 Lasern, Nebel und 26 Grünen LED´s
Kannst dir ja hier mal ansehen wo ich stehe: http://micro-dev.de/showthread.php?tid=13

Nun aber zu meiner Eigentliche frage, hast du mal einen mit Shiftregistern gebaut? mich würde vorallem die verkabelung interesieren

Wer rechtschreibfehler findet darf sie behalten Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2014, 10:57
Beitrag #3
RE: 3x3x3 LED Cube
Hi tesacrep,

nein leider habe ich noch nichts mit Schieberegistern aufgebaut. Da ich aber noch den 8x8x8 LED Cube aufbauen möchte, werde ich wohl nicht um sie herum kommen Big Grin Wink . Leider muss ich noch warten Blush bis die LEDs aus China da sind. Das kann noch bis Februar dauern Dodgy . Wenn ich damit dann anfange werde ich das hier auch gerne dokumentieren (wenn es gewünscht ist) Wink .

Bis denne Lup
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2014, 11:25
Beitrag #4
RE: 3x3x3 LED Cube
Klar Interesse besteht auf jeden Fall. 8x8 will ich auf jeden Fall auch noch bauen. Shiftregister sind ne super Sache, wirst dann aber mindestens 64 brauchen, Plus noch eins für die negativen.

Mfg, tesacrep

Wer rechtschreibfehler findet darf sie behalten Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2014, 14:05
Beitrag #5
RE: 3x3x3 LED Cube
Hallo,

wollte mir das einmal auf deiner Seite ansehen... aber um da Bilder ansehen zu können muss ich mich registrieren... ?!

Zitat:Ich will ein eigenes Forum aufbauen weil ich in der Vergangeheit von Foren immer nur entäuscht wurde und mich als Nutzer nie ernstgenommen wurde, und hoffe dies besser machen zu können. Ich will auch nicht das man sich für das ansehen von Bildern regestrieren muss denn das finde ich nervig...
...

Wissen ist das einzige Gut das sich vermehrt, wenn man es teilt...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2014, 17:52 (Dieser Beitrag wurde zuletzt bearbeitet: 10.01.2014 18:03 von tesacrep.)
Beitrag #6
RE: 3x3x3 LED Cube
Komisch, hatte eigentlich eingestellt das das nicht sein soll, werde dies natürlich sofort beheben.
Sonst hat alles andere geklappt? Kannst du die youtube-videos sehen?

EDIT: So habe das gerade behoben und getestet. Danke nochmal für den hinweis.

Wer rechtschreibfehler findet darf sie behalten Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2016, 19:25
Beitrag #7
RE: 3x3x3 LED Cube
Greife das Thema nochmals auf
Hab heute meine erste ledcube gelötet
Interessant wäre das natürlich mit einem atmega 328 auf dem Brett
Nur weiss ich nicht so recht wie ich das mit der Stromversorgung machen soll?
Any ideas? Someone?


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2016, 20:20 (Dieser Beitrag wurde zuletzt bearbeitet: 12.11.2016 20:23 von ardu_arne.)
Beitrag #8
RE: 3x3x3 LED Cube
(12.11.2016 19:25)mittlig1977 schrieb:  Greife das Thema nochmals auf
Hab heute meine erste ledcube gelötet
Interessant wäre das natürlich mit einem atmega 328 auf dem Brett
Nur weiss ich nicht so recht wie ich das mit der Stromversorgung machen soll?
Any ideas? Someone?

Ich würde dafür ein passendes 5V Netzteil nehmen.
3x3x3 = 27 LEDs x 20mA = 540mA
Dazu noch 200mA für den Arduino ergibt 740mA.
Ein 1A Netzteil mit 5V reicht also aus.

Mehr kann man mit den gegebenen Angaben nicht rechnen.
Und die 20mA pro LED sind auch nur ein Ergebnis aus einem Blick in die trübe Glaskugel.
Und mit großer Wahrscheinlichkeit ist diese Rechnung falsch weil der atmega 328 keine 27 Ausgänge hat.

Gruß
Arne
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste