Green Digit Electronics

LED Cube

inleiding

Creative Commons-Licentie

Een ledcube is een kubus deze volledig gemaakt is uit ledjes (en randkomponenten om de ledjes aan te kunnen sturen),
Ik heb gekozen om een ledcube van 3 te maken. Dit betekend dat ik een kubus van 3*3*3 gemaakt heb.
Voor elke kolom van ledjes heb ik 1 stuur pin nodig op de microcontroller, voor elk vlak heb ik daarbij nog maals 1 stuurpin nodig.
Voor een 3*3*3 kubus heb ik dus 9 pinnen nodig voor de kolomen en 3 voor de vlakken, dit betekend dus dat ik een microcontroller nodig heb waarbij ik minstens 12 io's heb (of input/output pinnen), dit digitale.

Video



Benodigdheden

  • Printplaat, geetst of expirimenteer print
  • 27 leds met kleur naar keuze, 5mm en best difuse met hoge lichintensiteit
  • 9 2k2 Ohm weerstanden
  • 9 33 Ohm weerstanden (of 3 100Ohm weerstanden parallel)
  • 6 10k Ohm weerstanden
  • 18 1n4148 diodes
  • 9 bc557 (bc556 of bc558 werken ook)
  • 3 bc547 (wederom bc546 en bc548 ook werkende)
  • schakeldraad
  • arduino uno of andere µC met toebehoren

*-* elke arduino kan hiervoor gebruikt worden, de uno (duemilanove kan ook) is hiervoor perfect geschikt.
      als u een standalone wilt maken kunt u ook een atmega328 gebruikten met een arduino bootloader erop.


Het shema

Het maken van

Er bestaan heel veel mooie tutorials om ledcubes te maken, google vind er heel veel waar er een meerdereid direct kan gebruikt worden. Vaak word er echter geen rekenening gehouden met het feit dat niet elke led hetzelfde is en de ene al wat meer stroom zal nemen dan de andere als je ze allemaal aanstuurt. Ook word er zelden rekening gehouden met de maximum output van de microcontroller, deze meestal niet veel meer dan 20-40mA is. Mijn schema houd hier rekening mee, de stroombeperking wordt gerealiseerd in de kolom aansturing,door 2 diodes parrallel over de weerstand te schakeling zal hier ongeveer een 1.4V over staan, door de weerstand zorgt dan voor een onafhangkelijke stroombeperking, de keuze van leds maakt dus niets uit.
Stel we maken een ledcube zoals hierboven en we willen elk ledje aansturen met 20mA, dan komen we uit op 540mA, wat reeds teveel is voor een usb poort (arduino). Door op elke kolom een stroombeperking uit te voeren zullen we de waarde van 500mA nooit overschrijden (mits er een 3*3*3 cube gemaakt word).
Ook de code kan hierin helpen, het snel schakelen van leds is voor het menselijk oog zo goed als niet zichtbaar. Als we dus meerdere leds uit een zelfde kolom willen aanschakelen op een zelfde moment kunnen we dit realiseren door heel snel (en meerdere malen) de verschillende lagen aan en uit te zetten.
Hieronder zullen we de verschillende stappen overlopen van het maken van de ledcube.

1. De cube

Over de kubus zal ik niet veel zeggen, hier zijn talrijke goede tutorials over deze ik niet beter zou kunnen uitleggen. Hier is een voorbeeldje deze overeenkomt met mijn schema (enkel de kubus zelf).
Klik hier
Op de Instructables website zijn nog veel meer, mogenlijk beter tutorials te vinden.

2. Control Board

Het controle bord bestaat uit 2 delen. Ten eerste de schakeling uit het schema met de transistoren, weerstanden en de diodes, het 2de deel bestaat ui de microcontroller schakeling.
Voor de microcontroller schakeling zijn er 2 mogenlijk heden: u gebruikt een arduino, gelijk welk model zolang het maar genoeg io pinnen bezit, of u kiest voor een standalone microcontroller. De standalone microcontroller kan van verschillende bedrijven zijn (bv atmel, pic, TI), een atmel of pic zal hier waarschijnlijk de voorkeur krijgen. Als je voor de standalone zou kiezen mag je de bijhorende componenten niet vergeten: kristal, condensatoren, weerstand voor reset en een reset knop.
Voor beide versies kun je gebruik maken van een externe voeding deze met een regulator (7805 zal het hier worden, of een 78l05 als je max 4 ledjes tesamen aan laat komen). Om plaats te besparenkun je de transistoren, weerstanden en diodes makkelijk onder de ledcube zelf zetten.

3. Waarde van R1 bepalen

Om de waarde van R1 te bepalen moet je enkele zaken vooraf bepalen.
De spanning die over de weerstand zal staan is afhangkelijk van 2 zaken, namelijk welke diodes je gekozen hebt en welke transistoren je gebruikt.
Bij mijn opstelling staat er ongeveer een 0.5 over de weerstand, dit betekend dat er over de diodes ongeveer een 1.2V staat aangezien dee pn overgang van de transistor een 0.7V bedraagd. Hieraan kunnen wij de waarde van R1 bepalen als wij reeds een maximale I waarde hebben berekend. Ik had gekozen voor 20mA, dit betekend een weertsand van 25Ω, om makkelijk te werken heb ik hiervoor een 33Ω gebruikt wat op een stroomsterkte van 16mA.


De code

De code is zeer simpel, als je een bepaald ledje wilt aanzetten moet je 2 pinnen activeren.
1 pin om de kolom te selecteren, deze moet laag gemaakt worden om te activeren aangezien hier de BC55X pnp transistoren gebruikt worden, en 1 pin om de laag te selecteren, deze moet hoog gemaakt worden om te activeren door het gebruikt van de BC54X.

de code zelf:

int plane = 2;
int counter = 0;
int rand1 = 0;
int rand2 = 0;
int tijd;
int aantal = 2;
bool eerste = true;


In bovenstaande code staan de initialisaties die gebruikt worden in het programma.
plane zorgt ervoor dat het juiste vlak word gekozen, ik ben begonnen vanaf pin 2 (digitale pin) van mijn arduino, daarom staat plane op 2.
rand 1 en rand2 zijn variabelen waar random getallen in gezet zullen worden.
tijd is een variabele waar een random variabele in zal gestoken worden om een variabele snelheid van het knipperen van de ledjes te laten veranderen.
aantal is het aantal keer de willekeurige volgorde van de ledjes word opgeroepen.
eerste zorgt voor een test van alle ledjes zodat er duidelijk kan gezien worden of alle ledjes werken.

void setup() {
  randomSeed(analogRead(0));
  for(int i = 2; i<14;i++){
  pinMode(i, OUTPUT);
  if(i>4)
  digitalWrite(i, HIGH);
  }
  }


Dit is de setup van de code, om de random generator te kunnen gebruiken word de analog reed gebruikt op de randomSeed, zodat altijd een andere waarde zal bekomen worden.
De forlus activeerd alle pinnen op output zodat deze kunnen gebruikt worden. en deze worden op hoog gezet als de pin nummer hoger is dan 4.

void overlopen(){
  counter = 0;
  while (counter != 5){
  while(plane !=5){
   digitalWrite(plane, HIGH);
   for (int i = 5; i < 14;i++){
   digitalWrite(i,LOW);
   delay(50);
   digitalWrite(i,HIGH);
   delay(50);
   }
   digitalWrite(plane, LOW);
   plane +=1;
  }
  plane = 2;
  counter ++;
  }
}


Deze functie zorgt ervoor dat alle ledjes zullen overlopen worden zodat mogenlijk reeds kappote ledjes kunnen gededecteerd worden

void willk(int snelheid){
  rand1 = random(2,5);
  rand2 = random(5,14);
  digitalWrite(rand1,HIGH);
  digitalWrite(rand2,LOW);
  delay(snelheid);
  digitalWrite(rand1,LOW);
  digitalWrite(rand2,HIGH);
}


Deze functie zorgt voor het willekeurig activeren van de ledjes, in rand1 en rand2 worden willekeurige getallen gestoken wordendeze dan geactiveerd worden, door de willekeurig ingestelde snelheid zal de delay steeds een andere waarde krijgen.

void loop() {
  if (eerste)
  overlopen();
  eerste = false;
  tijd = random(2,120);
  for (int i = 0; i < aantal; i++)
  willk(tijd);
  aantal = random (1,10);
}


De loop is de main van de code, deze steeds zal overlopen worden, als eerste true is zullen alle ledjes getest worden.
Hierna word eerste op false gezet en zal overlopen niet meer uitgevoerd worden, dit zou ook kunne gebeuren met een oneindige while (while(1)) rond de onderste code te zetten.