Moin in die Runde,
Ich bin gerade mit meinem "kleinen" Cube dran und stoße beim Multiplexen auf ein Problem.
Ich steuer immer nur einen Layer (Kathoden) Gleichzeitig an und lege auf die Anoden der LEDs zuvor das komplette Muster für den Layer (Schieberegister), erst dann Steuer ich den FET für den Layer an.
Beispiel:
Ich steuer den untersten Layer nur komplett rot an, der zweite Layer soll komplett aus sein (genullt), aber trotzdem leuchten alle LEDs noch leicht auf.
Aber nur für einen Bruchteil einer Sekunde.
In dem Beispielcode, den ich hier hochgeladen habe, sieht man, dass die on/off time jeweils 3Sekunden beträgt. Der Layer der leuchten soll, leuchtet auch in voller Länge, wie er soll.
Nur der nächste Layer (der darüber) leuchtet auch noch ganz kurz.
Nach Messungen konnte ich feststellen, dass der Ausgang vom Schieberegister noch auf 5V steht, obwohl dieser schon auf 0 sein sollte.
Dann dachte ich mir, das vielleicht irgendwelche Kapazitäten innerhalb des SR entstehen und sich mit dem nächsten Layer entladen... Habe direkt an Ausgänge mal Testweise einen 1k Widerstand gegen GND geschaltet..
Gleiches Problem..
Habt ihr eine Idee wo das problem liegen könnte?
PS: Die Leiterplatten habe ich vor über 3 Jahren erstellt, daher war mir etwas wie z.B. eine Emitterschaltung nicht bekannt.
Die Transistoren sollen einfache Treiber sein, da der 595 nicht viel Strom verkraftet.
Die zwei Treiberstufen habe ich genutzt, damit der Ausgangspegel des SR auch gleich mit dem an der Anode ist.
Bilder von Layer 1 und 2. (Layer 2 wird auch nochmal schnell durchgeschoben, als würden die Schiftregister erst dann Nullen reinschieben. Videos kann ich hier nicht hochladen, daher Bilder.
Schaltpläne:
#include <digitalWriteFast.h>
//Arduino Pins
const byte allePins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
const int data3 = 6;
const int data2 = 5;
const int data1 = 4;
const int clockPin = 3;
const int latchPin = 2;
const byte alleLayers[] = {7, 8, 9, 10, 11, 12, 13, 14};
const int layer1 = 7;
const int layer2 = 8;
const int layer3 = 9;
const int layer4 = 10;
const int layer5 = 11;
const int layer6 = 12;
const int layer7 = 13;
const int layer8 = 14;
//Struct für die Muster
typedef struct {
const char rot;
const char gruen;
const char blau;
} cube;
/*
const cube Beispiel[8][8] = {
//------Layer1----------------Layer2----------------Layer3----------------Layer4----------------Layer5----------------Layer6----------------Layer7----------------Layer8--------
//---R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B----
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 1
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 2
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 3
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 4
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 5
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 6
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 7
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}} //Schieberegister 8
};
*/
const cube test_muster[8][8] = {
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
{{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}}
};
const cube layer8an[8][8] = {
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
{{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}}
};
void setup() {
Serial.begin(115200);
for (int i = 0; i < sizeof(allePins); i++) {
pinMode(allePins[i], OUTPUT);
}
allOff();
delay(1000);
}
//---------------------------------------------------------Loop
void loop() {
lampe(255, 255, 255, 300, 1, 1000);
anzeigen(test_muster);
}
//------------------------------------------------------------Muster anzeigen
void anzeigen(cube data[8][8]){
for (int k = 0; k < 1000; k++) {
for (int j = 0; j < 8; j++) {
digitalWriteFast(latchPin, 0);
shiftOut(data[0][j].rot, data[0][j].gruen, data[0][j].blau);
shiftOut(data[1][j].rot, data[1][j].gruen, data[1][j].blau);
shiftOut(data[2][j].rot, data[2][j].gruen, data[2][j].blau);
shiftOut(data[3][j].rot, data[3][j].gruen, data[3][j].blau);
shiftOut(data[4][j].rot, data[4][j].gruen, data[4][j].blau);
shiftOut(data[5][j].rot, data[5][j].gruen, data[5][j].blau);
shiftOut(data[6][j].rot, data[6][j].gruen, data[6][j].blau);
shiftOut(data[7][j].rot, data[7][j].gruen, data[7][j].blau);
digitalWriteFast(latchPin, 1);
delay(3000);
digitalWriteFast(alleLayers[j], HIGH);
delay(3000);
digitalWriteFast(alleLayers[j], LOW);
}
}
}
//------------------------------------------------------------lampe
void lampe(int u, int v, int w, int x, int y, int z) {
digitalWriteFast(latchPin, 0);
shiftOut(u, v, w);
shiftOut(u, v, w);
shiftOut(u, v, w);
shiftOut(u, v, w);
shiftOut(u, v, w);
shiftOut(u, v, w);
shiftOut(u, v, w);
shiftOut(u, v, w);
digitalWriteFast(latchPin, 1);
for (int j = 0; j < x; j++) {
for (int i = 0; i < 8; i++) {
digitalWriteFast(alleLayers[i], HIGH);
delay(y);
digitalWriteFast(alleLayers[i], LOW);
}
}
delay(z);
}
//------------------------------------------------------------allOff
void allOff() {
for (int i = 0; i < sizeof(alleLayers); i++) {
digitalWriteFast(alleLayers[i], LOW);
}
digitalWriteFast(latchPin, 0);
shiftOut(0, 0, 0);
shiftOut(0, 0, 0);
shiftOut(0, 0, 0);
shiftOut(0, 0, 0);
shiftOut(0, 0, 0);
shiftOut(0, 0, 0);
shiftOut(0, 0, 0);
shiftOut(0, 0, 0);
digitalWriteFast(latchPin, 1);
}
//------------------------------------------------------------shiftOut
void shiftOut(byte myDataOut1, byte myDataOut2, byte myDataOut3) {
int i = 0;
int pinState1;
int pinState2;
int pinState3;
digitalWriteFast(clockPin, 0);
for (i = 7; i >= 0; i--) {
digitalWriteFast(clockPin, 0);
if ( myDataOut1 & (1 << i) ) {
pinState1 = 1;
}
else {
pinState1 = 0;
}
if ( myDataOut2 & (1 << i) ) {
pinState2 = 1;
}
else {
pinState2 = 0;
}
if ( myDataOut3 & (1 << i) ) {
pinState3 = 1;
}
else {
pinState3 = 0;
}
digitalWriteFast(data1, pinState1);
digitalWriteFast(data2, pinState2);
digitalWriteFast(data3, pinState3);
digitalWriteFast(clockPin, 1);
}
digitalWriteFast(clockPin, 0);
}





