LED Cube aansturen

Hoi,

Ik heb thuis een 7x7x7 LED cube gemaakt. Deze gebruikt 7 Shift registers (74HC595). Ik zit nu echter in de knoei om een algoritme te vinden dat deze LED cube goed kan aansturen. Ik moet natuurlijk multiplexeren.

Ik heb al aan het zoeken geweest en waar ik op gekomen ben is om een array aan te maken waar elke laag in zit. Nu was ik aan het denken om een 2e array aan te maken waar grote getallen in zitten, en deze dan om te vormen naar de eerste array.

Hieronder de code die ik heb.

int Latchpin = 8;
int OEpin = 9;
int Clkpin  = 11;
int Datapin = 12;

void setup(){
  Serial.begin(9600);
  pinMode(Latchpin, OUTPUT);
  pinMode(OEpin, OUTPUT);
  pinMode(Clkpin, OUTPUT);
  pinMode(Datapin, OUTPUT);
  
  analogWrite(OEpin, 240);
}

void loop(){
   
}

void makeImage(int lagen[]){
  
}

void shift(byte data[]){
  digitalWrite(Latchpin, LOW);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[0]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[1]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[2]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[3]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[4]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[5]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[6]);
  delay(1);
  digitalWrite(Latchpin, HIGH);
}

Kan iemand mij hier mee helpen? Ik heb al 3 weken aan het zoeken geweest maar ik vind helemaal niets.

Groeten,
Erates

EDIT:
Ik kan ook natuurlijk elke keer de byte array opnieuw invullen, en dan deze uitsturen, maar dan zit mijn programmageheugen onmiddelijk vol en als ik het wil aanpassen word het ook een troep.

Erates
Ik snap niet zo goed wat het probleem is.
Kan je de array niet maken?
Dat doe je met

byte data[6]

en dan kan je jouw functie aanroepen

shift( data)

Met vriendelijke groet
Jantje

De arrays aanmaken is geen probleem. (En dat had ik ook op de hulp-pagina's kunnen vinden :))

Het probleem zit erin om een degelijk algoritme te vinden om de LEDjes aan te sturen.

Ik heb wat code toegevoegd:

int Latchpin = 8;
int OEpin = 9;
int Clkpin  = 11;
int Datapin = 12;
int helderheid = 240;
byte test[] = {2, 4, 8, 16, 32, 64, 255};
byte test2[] = {129, 254, 4, 8, 16, 32, 64};

void setup(){
  Serial.begin(9600);
  pinMode(Latchpin, OUTPUT);
  pinMode(OEpin, OUTPUT);
  pinMode(Clkpin, OUTPUT);
  pinMode(Datapin, OUTPUT);
  
  analogWrite(OEpin, helderheid);
}

void loop(){
  for(int i = 0; i < 1000; i++){
   shift(test);
   delayMicroseconds(1);
   shift(test2);
   delayMicroseconds(1);
  }
  
  test[0] = 128;
  test2[0] = 3;
  
  for(int i = 0; i < 1000; i++){
   shift(test);
   delayMicroseconds(1);
   shift(test2);
   delayMicroseconds(1);
  }
  
  test[0] = 2;
  test2[0] = 129;
}

void makeImage(int lagen[]){
  
}

void shift(byte data[]){
  digitalWrite(Latchpin, LOW);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[0]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[1]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[2]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[3]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[4]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[5]);
  shiftOut(Datapin, Clkpin, MSBFIRST, data[6]);
  digitalWrite(Latchpin, HIGH);
}

In bijlage zitten 2 foto's om te laten zien wat hij nu doet.

Nu ik zou graag per afbeelding een array maken en deze array meegeven naar makeImage(). Die functie zet dit dan om naar elke keer een nieuwe array, welke hij op zijn beurt doorstuurt naar shift().
Dan kan ik bijvoorbeeld gewoon een SD-kaart extensie kopen, deze erop zetten en vanuit het programma elke keer een regel lezen, in de array steken, en naar makeImage() sturen.

Want als ik het moet doen zoals nu, moet ik heel het programma vol schrijven, en wil ik het aanpassen, moet ik heel het programma opnieuw schrijven.

Groeten,
Erates

Erates
Ik heb nog nooit met led cubes gewerkt en ook nog nooit met shift registers en ik begrijp niks van hoe je code zou moeten werken.
Hoe ik het zie: Als je een cubus hebt van 777 leds heb je 7*7 bytes nodig om alle leds te controleren.
In je code zie ik naar mijn bescheiden inzicht dus maar data om 2 vlakken te zetten. Ook kan ik de gegeven data niet mappen op de brandende leds op de foto's.

Maar ervan uitgaand dat je makimage een 3 d beeld maakt en je dus 77 bytes geeft.
In dat geval zou ik per image een file aanmaken. die 7
7 bytes bevat.
Om die te lezen maak je een array aan van 7*7 bytes.

byte image[7*7] ;

Je vult de array door van sd de file te lezen.
en dan schrijf je die naar de shiftregister.
Om het hoe uit te leggen eerst wat achtergrond info over arrays in C/C++
In C/C++ is de grote van een array niet van belang als je een functie aanroept. Je kan dus evengoed een array van 1 als 77 bytes geven. Dus

shift(image);

Geeft geen probleem en zal gewoon de 7 eerste bytes gebruiken.

Verder kan je rekenen met arrays. zo is image[5] hetzelfde als image+5.

void maakLaag(byte laag, byte laaginfo[])

Veronderstellend dat je een functie hebt maakLaag die een laag nummer mee krijgt van 0 tot en met 6 en een array van 7 bytes kan je met volgende code je image naar je cube sturen

for(byte laag=0; laag<7; laag++)
  {
    maakLaag(laag, image+(7*laag));
  }

Ik hoop dat dit je verder helpt.

Met vriendelijke groet
Jantje