Pages: [1]   Go Down
Author Topic: LED Cube aansturen  (Read 1694 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
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.
« Last Edit: January 27, 2013, 05:17:36 am by Erates » Logged

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 68
Posts: 1926
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Erates
Ik snap niet zo goed wat het probleem is.
Kan je de array niet maken?
Dat doe je met
Code:
byte data[6]
en dan kan je jouw functie aanroepen
Code:
shift( data)

Met vriendelijke groet
Jantje
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Ik heb wat code toegevoegd:

Code:
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


* 2013-01-28 13.01.30.jpg (959.1 KB, 3264x1840 - viewed 46 times.)

* 2013-01-28 13.01.36.jpg (923.99 KB, 3264x1840 - viewed 26 times.)
Logged

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 68
Posts: 1926
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 7*7*7 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 7*7 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.
Code:
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
Code:
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.

Code:
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
Code:
for(byte laag=0; laag<7; laag++)
  {
    maakLaag(laag, image+(7*laag));
  }
Ik hoop dat dit je verder helpt.

Met vriendelijke groet
Jantje




Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Pages: [1]   Go Up
Jump to: