Σάββατο 9 Απριλίου 2011

Led Cube 4x4x4



Σε αυτό το άρθρο μπορούμε να κάνουμε ένα κύβο 4x4x4 με led που να ελέγχουμε με ένα Arduino. Θα χρειαστούμε:
  • 1 Arduino
  • 64 led
  • Καλώδια
  • 4 transistor NPN (Εγώ χρησιμοποίησα το2N2222)
  • 4 αντιστάσεις
  • Κολλητήρι για το στήσιμο του κύβου


Προαιρετικά
Πλακέτα PCB 

Για να στήσω τον κύβο, χρησιμοποίησα ένα ξύλο το οποίο τρύπησα ώστε να στηρίξω το κάθε επίπεδο των led για να τα κολλήσω.
 Έβαλα τα led Στις θέσεις τους και ένωσα όλες τις καθόδους μεταξύ τους.

Συνέχισα και με τα υπόλοιπα επίπεδα του κύβου...
Στην συνέχεια άρχισα να κολλάω τα επίπεδα μεταξύ τους. Κάθε στήλη είναι ενωμένη μεταξύ της με τις ανόδους των led.




Ο κύβος μας είναι έτοιμος... Τώρα μένει να τον συνδέσουμε με το arduino και να γράψουμε και τον κώδικα. Πρέπει να συνδέσουμε την κάθε στήλη του κύβου μας με ένα pin του arduino. Δηλαδή 16 pin. Το arduino uno που χρησιμοποιώ εγώ έχει μόνο 13 ψηφιακά pin, αλλά μπορούμε να δουλέψουμε και με τα αναλογικά ως 14-19. Συνδέουμε με την σειρά τις στήλες από το pin 0 έως το pin 15. Τα επίπεδα τώρα τα συνδέουμε στους συλλέκτες των transistor (με τις αντιστάσεις ανάμεσά τους) των οποίων η βάση συνδέεται στα pin 16-19 και ο εκπομπός στην γείωση.
Έχουμε τελειώσει με τις συνδέσεις και το μόνο που μένει είναι ο κώδικας. Παρακάτω έχω κάποια δικά μου σχέδια, αλλά υπάρχουν πολλά που μπορούν να γίνουν με λίγη φαντασία...

int time = 50;  //delay time
 int cols= 16;   //stiles
 int rows= 4;    //epipeda
 int ledcol[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 int ledrow[] = {16, 17, 18, 19 };
 void setup() {                
  int thisPin;
  for (int thisPin = 0; thisPin < cols; thisPin++) {
  pinMode(ledcol[thisPin], OUTPUT); 
  }  
    for (int thisPin = 0; thisPin < rows; thisPin++) {
  pinMode(ledrow[thisPin], OUTPUT); 
  } 
}

void loop() {

 //--------------------------------------------------//
  for (int thisRow = 0; thisRow < rows; thisRow++) {
      digitalWrite(ledrow[thisRow],HIGH);
  for (int thisPin = 0; thisPin < cols; thisPin++) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);
     digitalWrite(ledcol[thisPin],LOW);
  }
 digitalWrite(ledrow[thisRow],LOW); 
 }

//--------------------------------------------------//
 for (int thisPin = 0; thisPin < cols; thisPin++) {
     digitalWrite(ledcol[thisPin],HIGH);
  for (int thisRow = 0; thisRow < rows; thisRow++) {
      digitalWrite(ledrow[thisRow],HIGH);
     delay(time);
      digitalWrite(ledrow[thisRow],LOW);     
  }
 digitalWrite(ledcol[thisPin],LOW);
 }

//--------------------------------------------------//
for (int thisRow = 0; thisRow < rows; thisRow++) {
digitalWrite(ledrow[thisRow],HIGH);
 for (int thisPin = 0; thisPin < rows; thisPin++) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);   
     digitalWrite(ledcol[thisPin],LOW);  
  }
 
 for (int thisPin = 7; thisPin < 16; thisPin=thisPin+4) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);  
     digitalWrite(ledcol[thisPin],LOW);   
  } 
 for (int thisPin = 14; thisPin > 11; thisPin--) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);  
     digitalWrite(ledcol[thisPin],LOW);   
  } 
 for (int thisPin =8 ; thisPin > 3; thisPin=thisPin-4) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);  
     digitalWrite(ledcol[thisPin],LOW);   
  } 
 digitalWrite(ledrow[thisRow],LOW); 
}//rows
 
//--------------------------------------------------//
for (int repeat = 0; repeat < 2; repeat++) {
for (int thisRow = 0; thisRow < rows; thisRow++) {
digitalWrite(ledrow[thisRow],HIGH);
}
 for (int thisPin = 0; thisPin < rows; thisPin++) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);     
  } 
 for (int thisPin = 7; thisPin < 16; thisPin=thisPin+4) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);  
  } 
 for (int thisPin = 14; thisPin > 11; thisPin--) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);      
  } 
 for (int thisPin =8 ; thisPin > 3; thisPin=thisPin-4) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);    
  } 
  for (int thisPin = 0; thisPin < rows; thisPin++) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);     
  } 
 for (int thisPin = 7; thisPin < 16; thisPin=thisPin+4) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);  
  } 
 for (int thisPin = 14; thisPin > 11; thisPin--) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);      
  } 
 for (int thisPin =8 ; thisPin > 3; thisPin=thisPin-4) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);    
  } 
  for (int thisRow = 0; thisRow < rows; thisRow++) {
  digitalWrite(ledrow[thisRow],LOW);
  }
}//repeat

//--------------------------------------------------//
for (int repeat = 0; repeat < 2; repeat++) {
for (int thisRow = 0; thisRow < rows; thisRow++) {
digitalWrite(ledrow[thisRow],HIGH);
}
 for (int thisPin =0 ; thisPin < 13; thisPin=thisPin+4) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);    
  } 
   for (int thisPin = 13; thisPin < 16; thisPin++) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);      
  } 
   for (int thisPin = 11; thisPin > 2; thisPin=thisPin-4) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);  
  } 
 for (int thisPin = 2; thisPin > 0; thisPin--) {
     digitalWrite(ledcol[thisPin],HIGH);
     delay(time);     
  } 
 for (int thisPin =0 ; thisPin < 13; thisPin=thisPin+4) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);    
  } 
   for (int thisPin = 13; thisPin < 16; thisPin++) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);      
  } 
  for (int thisPin = 11; thisPin > 2; thisPin=thisPin-4) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);  
  } 
  for (int thisPin = 2; thisPin > 0; thisPin--) {
     digitalWrite(ledcol[thisPin],LOW);
     delay(time);     
  }
  for (int thisRow = 0; thisRow < rows; thisRow++) {
  digitalWrite(ledrow[thisRow],LOW);
  }
 }//repeat

//--------------------------------------------------//

for (int thisPin = 0; thisPin < rows; thisPin++) {
     digitalWrite(ledrow[thisPin],HIGH);
}
for (int repeat = 0; repeat < 2; repeat++) {
for (int thisCol = 3; thisCol < cols-3; thisCol=thisCol+3) {
     digitalWrite(ledcol[thisCol],HIGH);    
}
      delay(500);
for (int thisCol = 3; thisCol < cols-3; thisCol=thisCol+3) {
     digitalWrite(ledcol[thisCol],LOW);    
}
for (int thisCol = 0; thisCol < cols; thisCol=thisCol+5) {
     digitalWrite(ledcol[thisCol],HIGH);   
}
delay(500);
for (int thisCol = 0; thisCol < cols; thisCol=thisCol+5) {
     digitalWrite(ledcol[thisCol],LOW);   
}
}
//--------------------------------------------------//
for (int repeat = 0; repeat < 100; repeat++) {
int randCol = random(cols);
int randRow = random(rows);

digitalWrite(ledcol[randCol],HIGH); 
digitalWrite(ledrow[randRow],HIGH); 
delay(time);
digitalWrite(ledcol[randCol],LOW); 
digitalWrite(ledrow[randRow],LOW); 
}
}//void loop 

Ένα μεγάλο ευχαριστώ στον traxterry :)

back to top