Jak zbudować 4x4x4x Led Cube – Charliecube – Tutorial

Led Cube to stosunkowo ciekawy gadżet który potrafi zadziwić nie jednego. Jest to zabawka składająca się z diod RGB które można indywidualnie programować uzyskując bardzo widowiskowe efekty wizualne. W niniejszym artykule zostanie pokazane jak stworzyć samemu taką zabawkę korzystając głównie z 64 diod RGB oraz mikrokontrolera.

Poniżej możemy zobaczyć w działaniu przykładowy Led Cube o rozmiarze 4x4x4
httpss://www.youtube.com/watch?v=lNyc4WDKYAw

A tu już jako ciekawostka Led Cube o rozmiarze 16x16x16

httpss://www.youtube.com/watch?v=n4LAJfLYdmE
 
Przejdźmy więc do konstrukcji, będziemy potrzebować następujących komponentów:
 
1 x atmega 328P-PU
64x diody RGB z wspólną katodą
1x 18650 bateria
2x 22nf kondensator
1x 16 MHz rezonator kwarcowy
1x płytka uniwersalna
Drut srebrny/jubilerski o średnicy do 1mm (zalecam odrobinę mniejszy np 0,8mm)
Trochę kabli
 
Naszą pracę zaczynamy od zbudowaniu 16 wież w której każda będzie posiadała po 4 diody RGB. W tym celu każdą z nóżek diody RGB odginamy pod kątem 90°,180°,270°,360° według poniższego schematu:
 

dioda

 
Tak przygotowane diody układamy w równej odległości od siebie każdą obróconą o 90°. Warto w tym celu przygotować sobie szablon. Może to być zwykły karton po np. herbacie. U mnie odstęp pomiędzy diodami wynosi 25 mm jednak jest to wartość którą możemy spokojnie zmienić według naszego gustu.
 

leds

 
Tniemy 4 kawałki srebrnego drutu o równej długości. Każdy z tych kawałków prostujemy. Im będą one prostsze tym efekt wizualny będzie lepszy. Proces ten jest niezwykle trudny do wykonania jedynie rękoma dlatego warto skorzystać z innych metod. Osobiście uważam że najłatwiejsza opcja to skorzystanie z wiertarki jak na poniższym filmiku:
 
httpss://www.youtube.com/watch?v=ewuHD6RJFdE
Lutujemy każdy drut z wszystkimi czterema nóżkami diód RGB w linii. Nadmiarową ilość drutu ucinamy. Powinna powstać nam mniej więcej taka wieża jak na poniższym zdjęciu.
 

wieża

 
Dokładnie sprawdzamy miernikiem czy wszystkie diody świecą i są skierowane w odpowiednim kierunku, proces ten powtarzamy jeszcze 15 razy.
 
Proces ten może być dość monotonny i może zabrać nam dłuższą chwilę. Niemniej zróbmy to dokładnie bowiem później naprawianie czegokolwiek będzie znacznie trudniejsze.
 

Mamy już stworzone podstawowe komponenty naszego led cuba teraz musimy je przenieść na płytkę uniwersalną. Każdą więc wieże przekładamy przez dziurki w płytce uniwersalnej i lutujemy. Musimy przy tym jednak pamiętać by wszystkie wieże były zwrócone w tą samą stronę. Najlepiej jeśli wszystkie będą skierowane w taki sposób aby najniższa dioda nacięciem była skierowana w kierunku prawej górnej nóżki, Nacięcie drugiej od dołu diody było skierowane w kierunku prawej dolnej nóżki, Trzecia od dołu dioda nacięcie powinna mieć skierowane w kierunku lewej dolnej nóżki. Jeśli masz wątpliwości przyłożenie uziemienia do lewej dolnej nóżki i zasilania do jakiejkolwiek innej nóżki powinno zaświecić 2 od góry diodę. Poniżej rysunek przedstawiający jak powinno to wyglądać:
 

naciecia

 

Niemniej najistotniejsze jest to aby wszystkie wieże były zwrócone w tym samym kierunku, jeśli kierunek ten będzie inny od tego przedstawionego powyżej będziemy mogli to naprawić w programie. Dla dobrego efektu wizualnego wieże rozkładamy w równych odległościach od siebie. Dla ułatwienia miejsca gdzie mają wchodzić nasze wieże możemy sobie zaznaczyć pisakiem. Starajmy się również by wieże po włożeniu miały równą wysokość. Powinniśmy otrzymać mniej więcej coś takiego:
 

led forest

 

Na koniec pozostaje nam zalutowanie nie małej ilości kabelków według poniższych schematów:
 

board1


board2


board3


board4

 

Gdy to już mamy pozostaję nam podłączenie wszystkiego pod Arduino UNO według niniejszych instrukcji:
 

Numer przewodu Arduino Pin AVR Pin
1 Digital 2 Port D – Pin 2 [PD2]
2 Digital 3 Port D – Pin 3 [PD3]
3 Digital 4 Port D – Pin 4 [PD4]
4 Digital 5 Port D – Pin 5 [PD5]
5 Digital 6 Port D – Pin 6 [PD6]
6 Digital 7 Port D – Pin 7 [PD7]
7 Digital 8 Port B – Pin 0 [PB0]
8 Digital 9 Port B – Pin 1 [PB1]
9 Digital 10 Port B – Pin 2 [PB2]
10 Digital 11 Port B – Pin 3 [PB3]
11 Digital 12 Port B – Pin 4 [PB4]
12 Digital 13 Port B – Pin 5 [PB5]
13 Analog 0 (Digital 14) Port C – Pin 0 [PC0]
14 Analog 1 (Digital 15) Port C – Pin 1 [PC1]
15 Analog 2 (Digital 16) Port C – Pin 2 [PC2]
16 Analog 3 (Digital 17) Port C – Pin 3 [PC3]

 
Osobiście zamiast z całego Arduino korzystałem jedynie z kontrolera atmega 328p-pu, dwóch kondensatorów 22nf oraz 16 MHz rezonatora kwarcowego. Nie zapomnijcie podczas wyboru płytki uniwersalnej o tym iż te komponenty muszą znaleźć się również na płytce. Sam o tym niestety zapomniałem przez co miałem odrobinę więcej pracy przy powiększaniu płytki uniwersalnej i odpowiednim rozmieszczaniu kabli.
 

kable


kable2

 
Całość zasilamy napięciem 3-5v osobiście korzystam z baterii 18650 z samemu zmontowanym koszyku na baterie będący pozostałością po ładowarce do tychże właśnie baterii.
 

batery

 
Na atmege 328p-pu możemy wgrać następujące przykładowe programy bądź samemu stworzyć własne. Przedtem musimy jednak ściągnąć odpowiednią bibliotekę stworzoną przez Asher Glick – osobę dzięki której możliwe jest stworzenie led cuba tego typu.
 

//Draw Led
#include "cubeplex.h"
int color = red;
 
void setup() {
  // initilize the cube display
  initCube();
   
  // how many secconds until continuePattern is set to false
  animationMax = 10;
}
void loop() {
  randomLed();
}
void randomLed(){
  continuePattern = true; 
  int animationSpeed = 100; 
  while (continuePattern) {
    int xpos = random(0,4);
    int ypos = random(0,4);
    int zpos = random(0,4);
   
    drawLed(color,xpos,ypos,zpos);
     
    flushBuffer();
    clearBuffer();
    delay(animationSpeed);
  }
}
//Draw Box
#include "cubeplex.h"
 
void setup() {
  //initilize the cube display
  initCube();
   
  // set the number of seconds until continuePattern is set to false
  animationMax = 10;
}
void loop() {
  bigBlueBox();
  tinyGreenBox();
}
void bigBlueBox() {
  continuePattern = true;
  draw(blue,0,0,0,3,3,3);
  flushBuffer();
  clearBuffer();
  // do nothing while the pattern continues
  while(continuePattern);
}
void tinyGreenBox() {
  continuePattern = true;
  drawBox(green,FULL,1,1,1,2,2,2);
  flushBuffer();
  clearBuffer();
  // loop until the pattern is done
  while(continuePattern);
}
//Draw Hollow Box
#include "cubeplex.h"
 
int color = red;
 
void setup() {
  // initilize the cube display
  initCube();
  // set the number of seconds each animation should run for
  animationMax = 10;
}
void loop() {
  pulsingCube();
}
void pulsingCube() {
  continuePattern = true;
  int animationSpeed = 100;
  while (continuePattern) {
    for (int i = 0; i < 4; i++) {
      drawHollowBox(color,0,0,0,i,i,i);
      flushBuffer();
      clearBuffer();
      delay(animationSpeed);
    }
    for (int i = 0; i < 4; i++) {
      drawHollowBox(color,i,i,i,3,3,3);
      flushBuffer();
      clearBuffer();
      delay(animationSpeed);
    }
    color=nextColor(color);
  }
}
//Draw Box Outline
#include "cubeplex.h"
 
int color = red;
  
void setup() {
  // initilize the cube display
  initCube();
  // set the number of seconds each animation should run for
  animationMax = 10;
}
void loop() {
  pulsingCube();
}
void pulsingCube() {
  continuePattern = true;
  int animationSpeed = 100;
  while (continuePattern) {
    for (int i = 0; i < 4; i++) {
      drawBoxOutline(color,0,0,0,i,i,i);
      flushBuffer();
      clearBuffer();
      delay(animationSpeed);
    }
    for (int i = 0; i < 4; i++) {
      drawBoxOutline(color,i,i,i,3,3,3);
      flushBuffer();
      clearBuffer();
      delay(animationSpeed);
    }
    color=nextColor(color);
  }
}
//Draw Box Walls
#include "cubeplex.h"
 
int color = red;
  
void setup() {
  // initilize the cube display
  initCube();
  // set the number of seconds each animation should run for
  animationMax = 10;
}
void loop() {
  fountian();
}
void fountian() {
  continuePattern = true;
  int animationSpeed = 100;
  while (continuePattern) {
    for (int z = 0; z <= 3; z++) {
      drawBoxWalls(color,1,1,z,2,2,z);
      flushBuffer();
      clearBuffer();
      delay(animationSpeed);
    }
    for (int z = 3; z >= 0; z--) {
      drawBoxWalls(color,0,0,z,3,3,z);
      flushBuffer();
      clearBuffer();
      delay(animationSpeed);
    }
    color=nextColor(color);
  }
}
//Draw Line
#include "cubeplex.h"
 
int color = red;
 
void setup() {
  initCube;
  animationMax = 10;
}
void loop() {
  planarSpin();
}
void planarSpin() {
  continuePattern = true;
  int animationSpeed = 50;
  int spinsPerColor = 5; // a spin is actually half a revolution
  while (continuePattern) {
    int x = 0;
    int y = 0;
    for (int i = 0; i < spinsPerColor; i++) {
      for (int x = 0; x < 3; x++) {
        drawLine(color,x,0,0,3-x,3,0);
        drawLine(color,x,0,1,3-x,3,1);
        drawLine(color,x,0,2,3-x,3,2);
        drawLine(color,x,0,3,3-x,3,3);
        flushBuffer();
        clearBuffer();
        delay(animationSpeed);
      }
      for (int y = 0; y < 3; y++) {
        drawLine(color,3,y,0,0,3-y,0);
        drawLine(color,3,y,1,0,3-y,1);
        drawLine(color,3,y,2,0,3-y,2);
        drawLine(color,3,y,3,0,3-y,3);
        flushBuffer();
        clearBuffer();
        delay(animationSpeed);
      }
    }
    color = nextColor(color);
  }
}

 
Cały projekt w moim wykonaniu prezentuję się następująco:
 

 

Jeśli mamy trochę czasu możemy też stworzyć podstawkę pod nasz projekt:
 
charlie

 
Dla tych którzy nie lubią lutować ręcznie setek kabelków przygotowałem projekt w eagle umożliwiający wytworzenie płytki drukowanej:
 
schematics

schema2
 
Eagle schematy

Dodaj komentarz

WordPress Video Lightbox Plugin