Дело было вечером, делать было нечего. (с)
![](https://habrastorage.org/r/w780q1/files/619/9cb/6ce/6199cb6ceb304155854baaa0ebcf5548.jpg)
Дело было года 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мм — это длина короткой из ножек светодиода.
![](https://habrastorage.org/r/w780q1/files/c7a/c83/4bf/c7ac834bf5254137a4b1d48154ec51ac.jpg)
Загибаем катод на 90 градусов — их будем спаивать в цепочку, получая «этажи» и красиво выставляем на полученную ранее матрицу-шаблон.
![](https://habrastorage.org/r/w780q1/files/1e1/0ed/6a0/1e10ed6a0278444aad447d83460518a2.jpg)
Далее загибаем анод (длинная нога) под небольшим углом. Это требуется чтобы удобно было спаивать «этажи»
![](https://habrastorage.org/r/w780q1/files/0c6/290/4b8/0c62904b8b634505989e871c16f379f0.jpg)
![](https://habrastorage.org/r/w780q1/files/bcd/0d0/f47/bcd0d0f47e3d4373b4eeef435272b01e.jpg)
и спаиваем всё вместе.
Пришло время тестировать.
Т.к. светодиоды были синие, нашёл синий шлейф и распустил его.
![](https://habrastorage.org/r/w780q1/files/da0/1ff/0e9/da01ff0e97ba4d9ab3ce166844f5e1ad.jpg)
Когда это всё заработало на макетке радости не было придела.
Собираем постамент.
Так уж получилось что купил я ровно 64 светодиода и один потерялся. Магазина где можно было купить по дороге у меня нет, а доставку из-за одного диода заказывать совсем уж странно. Выход нашёлся сам собой — поставить кубик на усечённую грань! И оригинально и внешний вид только выигрывает. Коробочка от болванок как раз подошла по размерам. В неё для надёжности и возможности отключения вплавил выключатель который перекрывает землю.
![](https://habrastorage.org/r/w780q1/files/5e8/c95/90c/5e8c9590c27c4234a21d3c2795e94123.jpg)
Далее идут фотографии уже обновлённой версии. Первый собранный кубик пал жертвой катаклизма локального масштаба и был безвозвратно утрачен кроме базы. Для сбора обновлённой версии я уже не сгибал ножки, т.к. они очень мягкие и плохо держат форму, я отрезал их почти под корень, а соединения делал из стальной проволоки 0,9 мм из строительного магазина. Возни получилось больше, зато результат намного лучше. Более ровные грани, да и жёсткость конструкции увеличилась. Диоды уже брал у китайцев и собрал полный 4х4х4 кубик.
![](https://habrastorage.org/r/w780q1/files/5d7/5bb/e35/5d75bbe358b8465291f0ccfca938dae5.jpg)
То, что внутри:
![](https://habrastorage.org/r/w780q1/files/ca0/9db/ce3/ca09dbce31bf4df193527e86107025ad.jpg)
И результат:
![](https://habrastorage.org/r/w780q1/files/1b3/74c/c7f/1b374cc7f3f746a08c955b88f3592846.jpg)
Питается от любого источника на 5В. Чаще всего подключен к USB порту. Для программирования необходимо выключать кубик, чтобы не светился. т.к. были использованы выходы 0 и 1, которые также используются для программирования контроллера. При включенной иллюминации и работе программы через выходы протекает ток, что ведёт в 90% случаев к сбоям при заливки нового скетча.
Писать про Arduino IDEи приводить код не стал. Простые циклы — ничего интересного и примеров уже в Интернете очень много.
Если появится у кого-нибудь интерес, добавлю код и сниму видео.
Led Romb
Спасибо за внимание.
З.Ы. Пересматривая перед публикацией статью увидел край подставки под кружки. Чую будут вопросы «что под кружкой?».
Вот:
![](https://habrastorage.org/r/w780q1/files/017/950/991/017950991239413a9149dd4bf0bddc45.jpg)
Склеено клеевым пистолетом.
![](https://habrastorage.org/r/w780q1/files/c44/7c2/953/c447c29534ef42d8a7c61429ae6f9b0f.jpg)
![](https://habrastorage.org/files/619/9cb/6ce/6199cb6ceb304155854baaa0ebcf5548.jpg)
Дело было года 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мм — это длина короткой из ножек светодиода.
![](https://habrastorage.org/files/c7a/c83/4bf/c7ac834bf5254137a4b1d48154ec51ac.jpg)
Загибаем катод на 90 градусов — их будем спаивать в цепочку, получая «этажи» и красиво выставляем на полученную ранее матрицу-шаблон.
![](https://habrastorage.org/files/1e1/0ed/6a0/1e10ed6a0278444aad447d83460518a2.jpg)
Далее загибаем анод (длинная нога) под небольшим углом. Это требуется чтобы удобно было спаивать «этажи»
![](https://habrastorage.org/files/0c6/290/4b8/0c62904b8b634505989e871c16f379f0.jpg)
![](https://habrastorage.org/files/bcd/0d0/f47/bcd0d0f47e3d4373b4eeef435272b01e.jpg)
и спаиваем всё вместе.
Пришло время тестировать.
Т.к. светодиоды были синие, нашёл синий шлейф и распустил его.
![](https://habrastorage.org/files/da0/1ff/0e9/da01ff0e97ba4d9ab3ce166844f5e1ad.jpg)
Когда это всё заработало на макетке радости не было придела.
Собираем постамент.
Так уж получилось что купил я ровно 64 светодиода и один потерялся. Магазина где можно было купить по дороге у меня нет, а доставку из-за одного диода заказывать совсем уж странно. Выход нашёлся сам собой — поставить кубик на усечённую грань! И оригинально и внешний вид только выигрывает. Коробочка от болванок как раз подошла по размерам. В неё для надёжности и возможности отключения вплавил выключатель который перекрывает землю.
![](https://habrastorage.org/files/5e8/c95/90c/5e8c9590c27c4234a21d3c2795e94123.jpg)
Далее идут фотографии уже обновлённой версии. Первый собранный кубик пал жертвой катаклизма локального масштаба и был безвозвратно утрачен кроме базы. Для сбора обновлённой версии я уже не сгибал ножки, т.к. они очень мягкие и плохо держат форму, я отрезал их почти под корень, а соединения делал из стальной проволоки 0,9 мм из строительного магазина. Возни получилось больше, зато результат намного лучше. Более ровные грани, да и жёсткость конструкции увеличилась. Диоды уже брал у китайцев и собрал полный 4х4х4 кубик.
![](https://habrastorage.org/files/5d7/5bb/e35/5d75bbe358b8465291f0ccfca938dae5.jpg)
То, что внутри:
![](https://habrastorage.org/files/ca0/9db/ce3/ca09dbce31bf4df193527e86107025ad.jpg)
И результат:
![](https://habrastorage.org/files/1b3/74c/c7f/1b374cc7f3f746a08c955b88f3592846.jpg)
Питается от любого источника на 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
Спасибо за внимание.
З.Ы. Пересматривая перед публикацией статью увидел край подставки под кружки. Чую будут вопросы «что под кружкой?».
Вот:
![](https://habrastorage.org/files/017/950/991/017950991239413a9149dd4bf0bddc45.jpg)
Склеено клеевым пистолетом.
![](https://habrastorage.org/files/c44/7c2/953/c447c29534ef42d8a7c61429ae6f9b0f.jpg)