Hey Forum ![]()
Ich und mein Partner arbeiten gerade an einem 4x4x4 RGB LED Cube.
Er entwirft gerade (also sollte heute fertig werden) die Platine und ich programmiere die Software an meinem Steckbrett.
da mein Steckbrett nicht unendlich groß ist kann ich erstmal nur eine Farbe und die ersten 2 ebenen ansteuern.
Ich habe es schonmal geschafft das die erste ebene von links nach rechts "zählt" also jeweils eine led wandert
und die 2. ebene von rechts nach links. und das durch Multiplexing
nun wollte ich das Programm schon mal erweitern mit allen Ebenen und alle Farben mit ein paar Funktionen. doch nun Funktioniert garnichts mehr ![]()
es blinkt nur abwechselnd die vorderste erste LED immer abwechselnd von der 1. und dann 2. Ebene..
Hier mal der Code:
//Pin connected to ST_CP of 74HC595
int latchPin_r = 10;
int latchPin_g = 8;
int latchPin_b = 9;
//Pin connected to SH_CP of 74HC595
int clockPin_r = 14;
int clockPin_g = 12;
int clockPin_b = 13;
////Pin connected to DS of 74HC595
int dataPin_r = 6;
int dataPin_g = 11;
int dataPin_b = 7;
int ebene1 = 2;
int ebene2 = 4;
int ebene3 = 3;
int ebene4 = 5;
char ebene1_links[] = {B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000};
char ebene1_rechts[] = {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001};
char ebene2_links[] = {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001};
char ebene2_rechts[] = {B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,};
char ebene3_links[] = {B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000};
char ebene3_rechts[] = {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001};
char ebene4_links[] = {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001};
char ebene4_rechts[] = {B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,};
void setup() {
//set pins to output so you can control the shift register
pinMode(latchPin_r, OUTPUT);
pinMode(latchPin_g, OUTPUT);
pinMode(latchPin_b, OUTPUT);
pinMode(clockPin_r, OUTPUT);
pinMode(clockPin_g, OUTPUT);
pinMode(clockPin_b, OUTPUT);
pinMode(dataPin_r, OUTPUT);
pinMode(dataPin_g, OUTPUT);
pinMode(dataPin_b, OUTPUT);
pinMode(ebene1, OUTPUT);
pinMode(ebene2, OUTPUT);
pinMode(ebene3, OUTPUT);
pinMode(ebene4, OUTPUT);
}
void loop() {
for(int i=0; i<=(sizeof(ebene1_links)); i++)
{
for(int j=0; j<500; j++)
{
funktion(i, ebene1, 'g');
funktion(i, ebene2, 'g');
delay(100);
}
}
}
void funktion(int i, char ebene, char farbe){
ebenenlatch(ebene, farbe, 1);
shift(ebene, farbe, i);
ebenenlatch(ebene, farbe, 0);
}
void shift (char ebene, int farbe, int i){
if(ebene == 'ebene1')
{
if( farbe == 'r')
{
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene1_rechts[i]);
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene1_links[i]);
}
if( farbe == 'g')
{
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene1_rechts[i]);
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene1_links[i]);
}
if( farbe == 'b')
{
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene1_rechts[i]);
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene1_links[i]);
}
}
if(ebene == 'ebene2')
{
if( farbe == 'r')
{
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene2_rechts[i]);
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene2_links[i]);
}
if( farbe == 'g')
{
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene2_rechts[i]);
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene2_links[i]);
}
if( farbe == 'b')
{
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene2_rechts[i]);
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene2_links[i]);
}
}
if(ebene == 'ebene3')
{
if( farbe == 'r')
{
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene3_rechts[i]);
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene3_links[i]);
}
if( farbe == 'g')
{
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene3_rechts[i]);
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene3_links[i]);
}
if( farbe == 'b')
{
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene3_rechts[i]);
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene3_links[i]);
}
}
if(ebene == 'ebene4')
{
if( farbe == 'r')
{
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene4_rechts[i]);
shiftOut(dataPin_r, clockPin_r, LSBFIRST, ebene4_links[i]);
}
if( farbe == 'g')
{
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene4_rechts[i]);
shiftOut(dataPin_g, clockPin_g, LSBFIRST, ebene4_links[i]);
}
if( farbe == 'b')
{
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene4_rechts[i]);
shiftOut(dataPin_b, clockPin_b, LSBFIRST, ebene4_links[i]);
}
}
}
void ebenenlatch (char ebene, char farbe, int zustand){
if( farbe == 'r')
{
digitalWrite(latchPin_r, ~zustand);
}
if( farbe == 'g')
{
digitalWrite(latchPin_g, ~zustand);
}
if( farbe == 'b')
{
digitalWrite(latchPin_b, ~zustand);
}
if(zustand==0) delay(50);
digitalWrite(ebene, zustand);
}
Arduino Uno mit den 47HC595 Schieberegistern. der 2. Register ist am 1. "angehangen" mit gleichem Latch und clockpin + Dataout in den Datain vom 2.
Meine Frage ist nun. warum er mein char Array nicht durchgeht sondern immer nur die erste LED blinkt?
Über Code-vereinfachungen wäre ich auch sehr erfreut
![]()
ist n bisschen durcheinander alles und kompliziert gemacht ^^
Mit freundlichen Grüßen
Kevin Baier
EDIT: Also ich hab jeweils ein Schieberegister für jeweils die linke hälfte einer Farbe LED's. sind ja 2x4 Pins. mit dem 2. Register die andere hälfte der Farbe. so steuer ich alle 3 farben mit 6 Schieberegistern an.. ![]()
Das Ground pro Ebene steuer ich mit einem BUZ11 Mosfet