LED Cube Hat ein Fehler im Program

Guten Tag liebe Gemeinde.

Ich komme zur zeit nicht mehr weiter, finde den Fehler nicht in diesem Sketch.

Mein Problem ist folgendes:
Wenn ich die mitlere ebene ansteuern möchte, leuchtet die Untere und die Obere ebene.
Wenn ich nur die Obere ansteuen möchte, leutet die Obere und die Mittlere.
Wenn ich die Untere Ebene ansteuern möchte, leuchtet die Untere und die Mittlere.

Ich habe diesen Sketch mir aus dem internet geladen…
nun komme ich leder nicht mehr weiter

Ich wäre dankbar wenn ihr mir weiter Helfen könntet.
Gruß McCON

//http://blog.makezine.com/archive/2007/09/make_a_pocket_led_cube_we.html

Custom animation programmed by Mark Boszko, http://stationinthemetro.com
*/

#include <avr/pgmspace.h>        // allows use of PROGMEM to store patterns in flash

#define CUBESIZE 3
#define PLANESIZE CUBESIZE*CUBESIZE
#define PLANETIME 3333          // time each plane is displayed in us -> 100 Hz refresh
#define TIMECONST 150          // multiplies DisplayTime to get ms - why not =100?

// LED Pattern Table in PROGMEM - last column is display time in 100ms units
// TODO this could be a lot more compact but not with binary pattern representation

prog_uchar PROGMEM PatternTable[] = {

  // blink on and off
    B111, B111, B111, B111, B111, B111, B111, B111, B111, 5,
    B000, B000, B000, B000, B000, B000, B000, B000, B000, 1,
    B111, B111, B111, B111, B111, B111, B111, B111, B111, 5,
    B000, B000, B000, B000, B000, B000, B000, B000, B000, 1,
    B111, B111, B111, B111, B111, B111, B111, B111, B111, 5,
    B000, B000, B000, B000, B000, B000, B000, B000, B000, 1,
    
 
    B000, B100, B000, B000, B010, B000, B000, B001, B000, 10,
    B000, B000, B000, B000, B010, B000, B000, B000, B000, 10,
    

  // this is a dummy element for end of table (duration=0)
    B000, B000, B000, B000, B000, B000, B000, B000, B000, 0  
};

/*
** Defining pins in array makes it easier to rearrange how cube is wired
** Adjust numbers here until LEDs flash in order - L to R, T to B
** Note that analog inputs 0-5 are also digital outputs 14-19!
** Pin DigitalOut0 (serial RX) and AnalogIn5 are left open for future apps
*/

//int LEDPin[] = {16, 3, 1, 15, 4, 6, 14, 5, 7};
int LEDPin[] = {5, 6, 7, 8, 9, 10, 11, 12, 13};

//int PlanePin[] = {19, 18, 17};
int PlanePin[] = {2, 3, 4};

// initialization
void setup()
{
  int pin;      // loop counter
  // set up LED pins as output (active HIGH)
  for (pin=0; pin<PLANESIZE; pin++) {
    pinMode( LEDPin[pin], OUTPUT );
  }
  // set up plane pins as outputs (active LOW) 
  for (pin=0; pin<CUBESIZE; pin++) {
    pinMode( PlanePin[pin], OUTPUT );
  }
}

// display pattern in table until DisplayTime is zero (then repeat)
void loop()
{
  // declare variables
  byte PatternBuf[ PLANESIZE ];      // saves current pattern from PatternTable
  int PatternIdx;
  byte DisplayTime;        // time*100ms to display pattern
  unsigned long EndTime;
  int plane;      // loop counter for cube refresh
  int patbufidx;   // indexes which byte from pattern buffer
  int ledrow;    // counts LEDs in refresh loop
  int ledcol;    // counts LEDs in refresh loop
  int ledpin;    // counts LEDs in refresh loop

  // Initialize PatternIdx to beginning of pattern table
  PatternIdx = 0;
  // loop over entries in pattern table - while DisplayTime>0
  do {
    // read pattern from PROGMEM and save in array
    memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANESIZE );
    PatternIdx += PLANESIZE;
    // read DisplayTime from PROGMEM and increment index
    DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ );    
    // compute EndTime from current time (ms) and DisplayTime
    EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;

    // loop while DisplayTime>0 and current time < EndTime
    while ( millis() < EndTime ) {
      patbufidx = 0;    // reset index counter to beginning of buffer
      // loop over planes
      for (plane=0; plane<CUBESIZE; plane++) {
        // turn previous plane off
        if (plane==0) {
          digitalWrite( PlanePin[CUBESIZE-1], HIGH );
        } else {
          digitalWrite( PlanePin[plane-1], HIGH );
        }

        // load current plane pattern data into ports
        ledpin = 0;
        for (ledrow=0; ledrow<CUBESIZE; ledrow++) {
          for (ledcol=0; ledcol<CUBESIZE; ledcol++) {
            digitalWrite( LEDPin[ledpin++], PatternBuf[patbufidx] & (1 << ledcol) );
          }
          patbufidx++;
        } 

        // turn current plane on
        digitalWrite( PlanePin[plane], LOW );
        // delay PLANETIME us
        delayMicroseconds( PLANETIME );
      }    // for plane
    }    // while <EndTime
  } while (DisplayTime > 0);        // read patterns until time=0 which signals end
}

Keiner eine Idee? :roll_eyes:

Liege ich mit der Vermutung richtig das es etwas mit dem: "PlanePin" zu tun hat? Dadurch werden ja die NPN Transistoren geschaltet.

Gruß Flo

Ohne Schaltplan ist es schwierig Dir zu helfen. Wie hast Du die LEDs angeschlossen? Grüße Uwe

Die NPN Transistoren sind an pin 2 für die untere Ebene, pin 3 für die mittlere Ebene, pin 4 für die obere Ebene angeschlossen.
Die hinteren Drei LEDs sind mit rotem Kabel versehen, sie gehen an Pin 5,6,7.
Die mittleren Drei LEDs sind mit weißen Kabeln Angeschlossen, gehen an 8,9,10.
Die vorderen Drei LEDs sind mit dem gelbem Kabeln Angeschlossen, sie gehen an 11,12,13.

Bilde ich mir das ein oder fehlen da die Basiswiderstände an den Transistoren?

Die hatte ich tatsächlich vergessen. Ist mir aber noch Rechtzeitig aufgefallen, alledings nach dem ich die Platine gebrochen hab.

Sind jetzt an den pins angebracht. Dürfte doch nichts aus machen oder?

Mein Problem ist folgendes: Wenn ich die mitlere ebene ansteuern möchte, leuchtet die Untere und die Obere ebene. Wenn ich nur die Obere ansteuen möchte, leutet die Obere und die Mittlere. Wenn ich die Untere Ebene ansteuern möchte, leuchtet die Untere und die Mittlere.

2 Fehler würden die Symptome erklähren: * LEDs Verkehrt gepolt * Pins untere und obere Ebene vertauscht. Grüße Uwe

Ich hatte nochmal alles umgestellt und bin mir ziemlich sicher das ich beim löten auf die Polung geachtet habe.

Hatte mal die untere mit der oberen Ebene getaucht. Anschließend ist anstatt die obere Ebene und der mittleren Ebene.

Die untere Ebene und die mittlere Ebene angegangen. Darauf brennt dann die obere eben und die untere.

Und danach läuft es in der oberen Ebene und in der mittleren.

Sollte ja einzeln laufen, erst die oberen, dann die mittleren und zu guter Letzt die unteren... Aber das macht er irgendwie nicht...

verzweifel noch...

Also habe noch nach einen anderen Sketch gesucht. Bei ihm laufen die Lampen der reihe nach von oben nach unten. Aber wieso tun sie es nicht in dem anderem Sketch?

Werde mich aber nochmal die tage ran setzten und alles von Hand betreiben. Hättet ihr noch irgendwelche Tips für mich?

Hab mich eben mal mit einem externem Netzteil an den Würfel gemacht und ihn über Kabel angesteuert.

Da hatte es an Pins der Transistoren geklappt das jede Ebene einzeln angesteuert wird. Erst die obere Ebene, alle LEDs durchgegangen... alles geklappt wie erwünscht. Mittlere Ebene, alle LEDs durchgegangen... ,,, Untere ebene, alle LEDs durchgegangen... auch alles wunderbar.

Gruß Flo.