Pull to refresh

Led Romb

Reading time 5 min
Views 105K
Дело было вечером, делать было нечего. (с)



Дело было года 3 назад. Случайно наткнулся на одно видео LED cube 8x8x8 demo и скажу честно, оно меня впечатлило. У меня на тот момент уже давно чесались руки что-нибудь сотворить «этакое». Тогда я ещё не знал что такое Arduino, да и вообще имел смутные понятия даже как правильно подключить светодиод. Набравшись храбрости, я отправился на просторы Интернета, где достаточно быстро нашёл идеи и схемы как собирают подобные кубики, и магазин, где можно купить компоненты. Выбрал кубик 4х4х4 как оптимальный вариант для первого опыта.


Немного теории и ход размышлений:
Как зажечь светодиод?
Подать напряжение и подключить землю. Питание 5В — нужен резистор.
Как зажечь 16 диодов с возможностью зажигать по отдельности?
Нужно 16 ключей для подачи напряжения.
Как зажигать любой диод из матрицы 4х4х4?
Раскладываем матрицу на «этажи» 4 на 4. Получаем 16 ключей на напряжение по «столбам» + 4 для открытия земли на «этаже».

Итого необходимо 20 управляемых выходов некого микроконтроллера.
Паять обвязку и программировать с нуля микроконтроллер без опыта я не решился и выбрал Arduino, точнее аналог Freeduino.
Freeduino Nano v5
Микроконтроллер: ATmega328
Цифровые порты ввода/вывода: 14 портов (из них 6 с ШИМ-сигналом)
Аналоговые порты ввода: 8 портов

22 программируемых входов/выходов с напряжением +5В при логической единице — то что надо.

Материалы:
Светодиоды 64шт.
Резисторы 20 шт.
Транзисторы биполярные 4 шт.
МК: Freeduino Nano v5
Проводки, выключатель, разъёмы, макетки и прочее.
Светодиоды и Freeduino были куплены в ближайшем магазине остальное выпаяно из ближайшего блока питания или найдено где-нибудь ещё.

Итак, приступаем:
Размечаем что-либо на квадраты со сторонами 5мм на 5мм — это длина короткой из ножек светодиода.


Загибаем катод на 90 градусов — их будем спаивать в цепочку, получая «этажи» и красиво выставляем на полученную ранее матрицу-шаблон.


Далее загибаем анод (длинная нога) под небольшим углом. Это требуется чтобы удобно было спаивать «этажи»




и спаиваем всё вместе.

Пришло время тестировать.
Т.к. светодиоды были синие, нашёл синий шлейф и распустил его.


Когда это всё заработало на макетке радости не было придела.

Собираем постамент.
Так уж получилось что купил я ровно 64 светодиода и один потерялся. Магазина где можно было купить по дороге у меня нет, а доставку из-за одного диода заказывать совсем уж странно. Выход нашёлся сам собой — поставить кубик на усечённую грань! И оригинально и внешний вид только выигрывает. Коробочка от болванок как раз подошла по размерам. В неё для надёжности и возможности отключения вплавил выключатель который перекрывает землю.


Далее идут фотографии уже обновлённой версии. Первый собранный кубик пал жертвой катаклизма локального масштаба и был безвозвратно утрачен кроме базы. Для сбора обновлённой версии я уже не сгибал ножки, т.к. они очень мягкие и плохо держат форму, я отрезал их почти под корень, а соединения делал из стальной проволоки 0,9 мм из строительного магазина. Возни получилось больше, зато результат намного лучше. Более ровные грани, да и жёсткость конструкции увеличилась. Диоды уже брал у китайцев и собрал полный 4х4х4 кубик.


То, что внутри:


И результат:


Питается от любого источника на 5В. Чаще всего подключен к USB порту. Для программирования необходимо выключать кубик, чтобы не светился. т.к. были использованы выходы 0 и 1, которые также используются для программирования контроллера. При включенной иллюминации и работе программы через выходы протекает ток, что ведёт в 90% случаев к сбоям при заливки нового скетча.

Писать про Arduino IDE и приводить код не стал. Простые циклы — ничего интересного и примеров уже в Интернете очень много.
Если появится у кого-нибудь интерес, добавлю код и сниму видео.

Скетч ромбика
/*
Rombik Arduino. Created by Azurius
 */

int i,z,x,c,v,b,a,s,d;
int dt = 100;
int dts = 2;
int nprog =1;
int tmp1=0, tmp2=0, tmp3=0;
int timeb=0, timew=0;
int LEDM[4][4] = 
{
  4,5,6,7,
  8,9,10,11,
  16,17,18,19,
  15,14,12,13};
int LEDF[4] = {
  3,2,0,1};
int ma[12]={
  4,5,6,7,11,19,13,12,14,15,16,8}; 
int mas[4]={
  0,3,12,15};


void setup() {                
  for (i=0;i<4;i++){
    for (z=0;z<4;z++){
      pinMode(LEDM[i][z], OUTPUT);     
    }
  }
  for (i=0;i<4;i++){
    pinMode(LEDF[i], OUTPUT);
  }
 LedOFFAll(); //tushim vse pered nachalom
 
}


void LedON(int pin){
  digitalWrite(pin, HIGH);
}
void LedOFF(int pin){
  digitalWrite(pin, LOW);
}
void DotON(int kx, int ky, int kz){
 LedON(LEDM[kx][ky]);
 LedON(LEDF[kz]); 
}
void DotOFF(int kx,int ky, int kz){
 LedOFF(LEDM[kx][ky]);
 LedOFF(LEDF[kz]); 
}


void LedOFFAll(){
  for (i=0;i<4;i++){
    for (z=0;z<4;z++){
      LedOFF(LEDM[i][z]);     
    }
    LedOFF(LEDF[i]);
  }
}

void change(){
  timew=millis();
  
  if ((timew-timeb)>=10000){nprog++;timeb=millis();dt=70;}
  if (nprog==10) nprog=1;
}

void loop() {
 change();
//nprog = 0;
 //##########[## Prog 0 ##############
 // ALL ON
  if (nprog==0){
    // ON begin
   for (c=0;c<4;c++){
   LedON(LEDF[c]);
   
      for (i=0;i<4;i++){
      for (z=0;z<4;z++){
        LedON(LEDM[i][z]);
       delay(300);
        LedOFF(LEDM[i][z]);
        }
        
      }
       LedOFF(LEDF[c]);
     }
   
  } // end nprog 0
 
  //############ Prog 1 ##############
  // zajigaet po ocheredi tochkami
  if (nprog==1){
    // ON begin 
    for (c=0;c<4;c++){
      for (i=0;i<4;i++){
      for (z=0;z<4;z++){
        DotON(i,z,c);
        delay(dt);
        DotOFF(i,z,c);
       }
     }
   }
  
  } // end nprog 1
  //############ Prog 2 ##############
  // zajigaem stolbiki po ocheredi
  if (nprog==2){
    
    // ON begin 
    for (c=0;c<4;c++){
        LedON(LEDF[c]);
    }
      for (i=0;i<4;i++){
        for (z=0;z<4;z++){
          LedON(LEDM[i][z]);
          delay(dt);
        }
      }
      for (i=0;i<4;i++){
        for (z=0;z<4;z++){
          delay(dt);
          LedOFF(LEDM[i][z]);
        }
      }
 
  } // end nprog 2

  //############ Prog 3 ##############
  // zajigaem etaji po ocheredi
  if (nprog==3) { 
    // ON begin 
    for (i=0;i<4;i++){
      for (z=0;z<4;z++){
        //LedON(LEDF[c]);
        LedON(LEDM[i][z]);
      }
    }
    for (c=0;c<4;c++){
      LedON(LEDF[c]);
      delay(dt);
      LedOFF(LEDF[c]);     
    }
  LedOFFAll();
  } //end nprog 3
  //############ Prog 4 ##############
  //  Zmeyka po granyam 
if (nprog ==4){
 dt=30;
  while(1){
  x=v;
  v=random(0,3);
  if(x!=v){break;}
}
if(v==0){if(i==0){
              for(b=0;b<4;b++){i=b;DotON(i,z,c); delay(dt); DotOFF(i,z,c);}}
         else{
              for(b=3;b>-1;b--){i=b;DotON(i,z,c); delay(dt); DotOFF(i,z,c);}}
  }
if(v==1){if(z==0){
             for(b=0;b<4;b++){z=b;DotON(i,z,c); delay(dt); DotOFF(i,z,c);}}
         else{
             for(b=3;b>-1;b--){z=b;DotON(i,z,c); delay(dt); DotOFF(i,z,c);}}
  }
if(v==2){if(c==0){
             for(b=0;b<4;b++){c=b;DotON(i,z,c); delay(dt); DotOFF(i,z,c);}}
         else{  
             for(b=3;b>-1;b--){c=b;DotON(i,z,c); delay(dt); DotOFF(i,z,c);}}
 }
    
  } //end nprog 4

  //############ Prog 5 ##############
  // goryashie grani
  if (nprog == 5){
      for (c=0;c<4;c++){
      LedON(LEDF[c]);
      for (i=0;i<12;i++){
        LedON(ma[i]);
        if (c==1 | c==2){
          i=i+2;
        }

      }
      delay(dts);
      LedOFF(LEDF[c]);
      for (i=0;i<12;i++){
        LedOFF(ma[i]);
      }

    }  
  }// end nprog 5
  //############ 6 ###########
  // ploskosti po ocheredi
  if (nprog==6){
    // ON begin
       for (i=0;i<4;i++){
      LedON(LEDM[i][0]);
      LedON(LEDM[i][3]);
      LedON(LEDF[i]);
    }
    delay(1000);
    LedOFFAll();    
    for (i=0;i<4;i++){
      LedON(LEDM[0][i]);
      LedON(LEDM[3][i]);
      LedON(LEDF[i]);
    }
    delay(1000);
    LedOFFAll();    

  } //end nprog 6

//############ 7 ###########
if (nprog==7){
  i=random(0,4);
  z=random(0,4);
  c=random(0,4);
        DotON(i,z,c);
        delay(dt);
        DotOFF(i,z,c);
  
  } //end nprog 7

//############ 8 ###########
if (nprog==8){
//random up
  i=random(0,4);
  z=random(0,4);
  v=random(0,4);
  b=random(0,4);
  a=random(0,4);
  s=random(0,4);
  
LedON(LEDM[i][z]);
LedON(LEDM[v][b]);
LedON(LEDM[a][s]);

   for (c=0;c<4;c++){
       LedON(LEDF[c]);
        delay(dt);
       LedOFF(LEDF[c]);
      }
LedOFF(LEDM[i][z]);
LedOFF(LEDM[v][b]);
LedOFF(LEDM[a][s]);
    
  } //end nprog 8

//############ 8 ###########
if (nprog==9){
//obhod po krugu
LedOFFAll();
for(c=0;c<4;c++){
LedON(LEDF[c]);
}
for(i=0;i<12;i++){
LedON(ma[i]);
delay(dt);
if(i>1){LedOFF(ma[i-2]);}
}

} //end nprog 9 
} // end loop


Led Romb


Спасибо за внимание.

З.Ы. Пересматривая перед публикацией статью увидел край подставки под кружки. Чую будут вопросы «что под кружкой?».
Вот:

Склеено клеевым пистолетом.
Tags:
Hubs:
+78
Comments 37
Comments Comments 37

Articles