Скетч для LED-куба 4х4х4

yanbaev72
Offline
Зарегистрирован: 08.11.2013

Доброго времени суток всем!

Подскажите может кто то в курсе!?! Собрал я светодидный куб 4х4х4, хочу подключить его к Arduino UNO, но незнаю как....

В программировании полный ноль, хотя один светодиод могу зажечь самостоятельно!)))

Пример работы и библиотеку взял здесь но не совсем понятно к каким пинам подключать все мои 20 (16-столбов+4-слоя) получившихся контактов.

Если ориентироваться этой статьей то все получается так как там в скетче описаны номера портов к которым нужно подключаться и хватает цивровых пинов, но куб получается 3х3х3(((

подскажите как использовать 6 аналоговых портов вместес 14 цифровыми?

Или может кто то уже делал такое и у когото есть скетч для такого куба, или хотя бы ссылочку на статью где есть схема подключения куба 4х4х4 к Arduino UNO.?

Или может как то можно переделать скетч 3х3х3 на 4х4х4?

надеюсь на помощь опытных Arduinщиков))))

 

maksim
Offline
Зарегистрирован: 12.02.2012

yanbaev72 пишет:

подскажите как использовать 6 аналоговых портов вместес 14 цифровыми?

Так же как и 14 цифровых.

pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

maksim пишет:

yanbaev72 пишет:

подскажите как использовать 6 аналоговых портов вместес 14 цифровыми?

Так же как и 14 цифровых.

pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);

 

Сделал подключение как в этой статье (разбирался по фото)

Но скетч который там предоставлен очень короткий, точнее цикл маленький хотя сам скетч на 250 строк.

Вопрос заключается в том, можно ли его изменить "под себя", на какие строчки обратить внимание, какие можно трогать какие не стоит?

И можно ли как то воспользоваться вот этим приложением, если да то как перенести получившиеся значения в Arduino IDE?

Заранее благодарю за ответ!

 

 

Разобрался все таки!)))

Только очень уж длинный скетч у меня получается...наверное его можно как то оптимизировать и уменьшить?! Посмотрите если не сложно м по возможности подскажите в каком направлении думать?!)

MaksMS
Offline
Зарегистрирован: 11.03.2013

Кстати , аналоговые входы можно не только по имени А0..А5 обращатся ..А можно как обычный номер ,начиная с 14 по 19 (для UNO ,точнее м/к 328).На МЕГЕ вроде нумерация с 54.

yanbaev72
Offline
Зарегистрирован: 08.11.2013

MaksMS пишет:

Кстати , аналоговые входы можно не только по имени А0..А5 обращатся ..А можно как обычный номер ,начиная с 14 по 19 (для UNO ,точнее м/к 328).На МЕГЕ вроде нумерация с 54.

 

Да, спасибо, это я уже понял)

 

А вы не можете глянуть мой скетч? Если разбираетесь?! ону меня уж очень длинный получился и занял всю памать UNO...наверное его можно как то оптимизировать и уменьшить?! Посмотрите если не сложно и по возможности подскажите в каком направлении думать?!

 

Например в шаге когда горят все диоды у меня вот такое:

  digitalWrite(LEDPin[0], HIGH);
  digitalWrite(LEDPin[1], HIGH);
  digitalWrite(LEDPin[2], HIGH);
  digitalWrite(LEDPin[3], HIGH);
  digitalWrite(LEDPin[4], HIGH);
  digitalWrite(LEDPin[5], HIGH);
  digitalWrite(LEDPin[6], HIGH);
  digitalWrite(LEDPin[7], HIGH); 
  digitalWrite(LEDPin[8], HIGH);
  digitalWrite(LEDPin[9], HIGH);
  digitalWrite(LEDPin[10], HIGH);
  digitalWrite(LEDPin[11], HIGH);
  digitalWrite(LEDPin[12], HIGH);
  digitalWrite(LEDPin[13], HIGH);
  digitalWrite(LEDPin[14], HIGH);
  digitalWrite(LEDPin[15], HIGH);
  digitalWrite(LayerPin[0], HIGH);   
  digitalWrite(LayerPin[1], HIGH);
  digitalWrite(LayerPin[2], HIGH);
  digitalWrite(LayerPin[3], HIGH);
Как то ведь можно это "укоротить"?
Пробовал так: 
  digitalWrite(LEDPin[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], HIGH);
  digitalWrite(LayerPin[0,1,2,3], HIGH);
но ничего не вышло
MaksMS
Offline
Зарегистрирован: 11.03.2013

Изучайте функции типа for() {... }

yanbaev72
Offline
Зарегистрирован: 08.11.2013

MaksMS пишет:

Изучайте функции типа for() {... }

 

А можно по подробнее на моем примере как ее написать правильно?

maksim
Offline
Зарегистрирован: 12.02.2012
for(int i = 0; i < 16; i++) digitalWrite(LEDPin[i], HIGH);

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

maksim пишет:

for(int i = 0; i < 16; i++) digitalWrite(LEDPin[i], HIGH);

 

Спасибо maksim)

оптимизировал свой скетч-сэкономил немного место МК для новых эффектов

Подскажите еще команду для повтора эффекта? Я сейчас тупо копирую несколько раз один и  тотже эффект для неоходимого количства повторов этого эффекта)

olegab
Offline
Зарегистрирован: 09.04.2013

 

Почитайте про вызовы функций

 

http://arduino.ru/Reference/FunctionDeclaration

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Что-то мне говорит, что надо смотреть в сторону MAX7219. Он по 3м проводам контролирует как раз 64 диода (8*8 тут (4+4)*(4+4)). К нему стандартная библиотека Ledcontrol.h

Далее рыть в сторону SD-reader. С которого считывать и заливать кадры. Сами кадры можно и нужно на компе попрописывать, благо виндовый калк умеет перевести с бинарного в окт дабы поформировать по 8 байт из 64 битного кадра.

yanbaev72
Offline
Зарегистрирован: 08.11.2013

teodor4ik пишет:

Что-то мне говорит, что надо смотреть в сторону MAX7219. Он по 3м проводам контролирует как раз 64 диода (8*8 тут (4+4)*(4+4)). К нему стандартная библиотека Ledcontrol.h

Далее рыть в сторону SD-reader. С которого считывать и заливать кадры. Сами кадры можно и нужно на компе попрописывать, благо виндовый калк умеет перевести с бинарного в окт дабы поформировать по 8 байт из 64 битного кадра.

Ни чего не понял из того что вы написали, к сожалению........

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Max7219 - по 3м проводам контролирует 64 диода. Включить можна последовательно до 8 шт (например на куб 8*8*8), причем без особых переделок логики. Программу свечения можна переделать на показ кадров записанных на SD карту. 1 кадр=8 байт(64бита) итого на 10к/с, минута 8*10*60=4800 байт. Собирать кадры и писать на карту на РС.

maksim
Offline
Зарегистрирован: 12.02.2012

teodor4ik пишет:

Что-то мне говорит, что надо смотреть в сторону MAX7219.

Зачем? Аппаратная часть уже собрана, причем адекватно. Вы так как не знаете как описать динамическую индикацию предлагаете все перепаять и добавить еще микруху из-за готовой библиотеки?

yanbaev72
Offline
Зарегистрирован: 08.11.2013

maksim пишет:

teodor4ik пишет:

Что-то мне говорит, что надо смотреть в сторону MAX7219.

Зачем? Аппаратная часть уже собрана, причем адекватно. Вы так как не знаете как описать динамическую индикацию предлагаете все перепаять и добавить еще микруху из-за готовой библиотеки?

Так MAX7219 это микросхема, которую нужно дополнительно впаять в мою уже существующую?

простите, но это не для меня) я задался сделать куб 4х4х4, в UNO выходов как раз хватает, поэтому не вижу смысла что то менять и усложнять! Тема изначально было создана чтобы создать (или понять как создать) скетч, и в дальнейшем по возможности оптимизировать его!

teodor4ik
Offline
Зарегистрирован: 04.11.2013

maksim пишет:

Зачем? Аппаратная часть уже собрана, причем адекватно. Вы так как не знаете как описать динамическую индикацию предлагаете все перепаять и добавить еще микруху из-за готовой библиотеки?

Только хардкор?

Суть предложения в возможности масштабирования, смены паттернов без перепрошивки, упрощения работы "художника". Мало?

maksim
Offline
Зарегистрирован: 12.02.2012

Это все хорошо, но в данном случае когда речь идет о кубе 4х4х4 это неверный подход, тем более если хочется понять и разобраться с динамической индикацией.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Ок, не буду спорить. Сам тут постоянно влипаю в "полезные советы" вместо ответа на конкретный вопрос.

yanbaev72
Offline
Зарегистрирован: 08.11.2013

Ребят, дайте команду повтора?!

есть вот такое:

for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);
for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
delay(1000);

for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], LOW);
delay(1000);
 
и чтобы это повторялось 3 раза у меня сделано так:

\\1 раз
for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);
for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
delay(1000);
 
for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], LOW);
delay(1000);

\\2 раз
for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);

for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
delay(1000);

for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], LOW);
delay(1000);
 
\\3 раз
for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);
for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
delay(1000);
 
for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], LOW);
delay(1000);

Хотелось бы исбежать тройного повтора заменив какой то командой?!

maksim
Offline
Зарегистрирован: 12.02.2012

Тем же циклом

for(int j = 0; j < 3; j++)
{
  for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);
  for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
  delay(1000);

  for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
  for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], LOW);
  delay(1000);
}

и почитайте Вставка программного кода в тему/комментарий.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013
for(int k =0;k<3;k++)
{ 
 for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);
 for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
 delay(1000);
ну и дальше чо там по циклу 3 раза
}

почитать описание языка програмирования религя не позволяет?

teodor4ik
Offline
Зарегистрирован: 04.11.2013

а я б ищо делеев натыкал

for(int j = 0; j < 3; j++)
{
  for(int p = 0; p < 16; p++)  digitalWrite(LEDPin[p], HIGH);
  for(int l = 0; l < 4; l++) { digitalWrite(LayerPin[l], HIGH);delay(30); } ;
  delay(30);

  for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
  for(int l = 0; l < 4; l++) { digitalWrite(LayerPin[l], LOW); delay (30); } ;
  delay(30);
}

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

maksim пишет:

Тем же циклом

for(int j = 0; j < 3; j++)
{
  for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);
  for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
  delay(1000);

  for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
  for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], LOW);
  delay(1000);
}

и почитайте Вставка программного кода в тему/комментарий.

спасибо!

про вставку почитаю обязательно!

yanbaev72
Offline
Зарегистрирован: 08.11.2013

Michal пишет:

for(int k =0;k<3;k++)
{ 
 for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], HIGH);
 for(int l = 0; l < 4; l++) digitalWrite(LayerPin[l], HIGH);
 delay(1000);
ну и дальше чо там по циклу 3 раза
}

почитать описание языка програмирования религя не позволяет?

моя религия позволяет делать мне абсолютно все))

описание языка программирования читал и не раз, но там для новичка очень сложно что то понять, точнее читая все понимаешь, но когда пытаешься сделать что то свое, отличающееся от тех примеров которые там приведены, сразу появляются проблемы и вопросы-именно поэтому была создана эта тема 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

teodor4ik пишет:

а я б ищо делеев натыкал

for(int j = 0; j < 3; j++)
{
  for(int p = 0; p < 16; p++)  digitalWrite(LEDPin[p], HIGH);
  for(int l = 0; l < 4; l++) { digitalWrite(LayerPin[l], HIGH);delay(30); } ;
  delay(30);

  for(int p = 0; p < 16; p++) digitalWrite(LEDPin[p], LOW);
  for(int l = 0; l < 4; l++) { digitalWrite(LayerPin[l], LOW); delay (30); } ;
  delay(30);
}

 

а смысл какой в дополнительных делеях? Можете поподробнее объяснить что они в итоге дадут?

maksim
Offline
Зарегистрирован: 12.02.2012

Смысл, я так понимаю, сделать некий эффект "поэтажного" разгорания/затухания.

Пока все ваши попытки не имеют никакого намека на динамику. Вы задумывались как, например, зажечь 4 светодиода по диагонали куба?

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Если я правильно понял схему, то в лоб никак...

Только поджигая по очереди. тоесть фактически ШИМ на 1/4 мощности. 

Точнее мне кажется правильным собрать свою процедуру которая разбивает показ "кадра" на 4 временных отрезка, поджигая по очереди 1 из 4 диодов. Тогда мы добьемся полностью независимого засвета нужных диодов. Возможно прийдется повышать напряжение на диодах.

yanbaev72
Offline
Зарегистрирован: 08.11.2013

maksim пишет:

Смысл, я так понимаю, сделать некий эффект "поэтажного" разгорания/затухания.

Пока все ваши попытки не имеют никакого намека на динамику. Вы задумывались как, например, зажечь 4 светодиода по диагонали куба?

Я уже столкнулся с проблемой зажеч например по одному диоду в разных рядах и не засветить те которые находятся "над" или "под" теми диодами которые необходимо зажечь....но, естественно не догадался как это сделать....пока не возникало острой необходимости в этом, пока хватает "обычных" эффектов)

Но если вы мне поможете реализовать эти сложные для меня эффекты буду вам только благодарен) мне бы хотя бы какой нибудь кусочек скетча для примера, и на его примере я бы попытался что тосделать самостоятельно))

teodor4ik
Offline
Зарегистрирован: 04.11.2013

попробуй представить решетку 16*4 (в случае кубика( (4+4+4+4)*4 )из синих и желтых полосок. Так вот на пересечениях ты получишь зеленые точки (пока вроде понятно) тоесть подали питание на все ноги и все зажглось. Если провести 1с и 1ж полоски получим 1 точку, (тоже вроде очевидно). 2с и 1ж = 2 точки в ряд(логично же)... Дальше уже хуже для тебя. Тебе надо 2 точки по диагонали.... 2с и 2ж дадут не 2 а 4 точки по углам квадрата (западло блин). Что делать... Разводить по времени. Сначала 1с1ж, потом другие 1с1ж и так по очереди 50/50... что получим? правильно! 2 мигающие точки по очереди. При достаточной частоте мы уже не заметим мигания, просто светить они будут тусклее.

Дальше строим картинку из 4 линий по 16 точек которые загораются по очереди (в 1 линию то все ОК работает?). Тогда по очереди загораются линейки с нужными  значениями, но достаточно быстро, чтобы не заметить что оно мигает. Сразу предупредю. DigitalWrite тут не котируется, менять надо прямой записью в регистры, так намного быстрее т.к. меньше тактов уходит на операцию. Начать то канешна можна и так, но надо быть готовым все переделать.

А теперь главнючая пакость. Т.к. в процессе работы основная программа тоже это время занимает, то на каком то этапе картинка будет замирать что визуально будет выглядеть как неравномерная яркость. А вот для того чтобы этого избежать и нужон драйвер, который сам себе мигает и ничего более не считает. Либо вернемся к чтению кадров с SD карты, т.к. время чтения прогнозируемо и равномерно.

maksim
Offline
Зарегистрирован: 12.02.2012

teodor4ik пишет:

А теперь главнючая пакость. Т.к. в процессе работы основная программа тоже это время занимает, то на каком то этапе картинка будет замирать что визуально будет выглядеть как неравномерная яркость. А вот для того чтобы этого избежать ...

... придумали прерывание по таймеру. И тогда обработка индикации работает в фоновом режиме независимо от основной программы без дополнительного железа.

Да и то оно особо и не нужно для анимации эффектов с разрешением 64 бита, просто все эффекты можно менять без задержек используя millis().

teodor4ik
Offline
Зарегистрирован: 04.11.2013

тоже трезво... Нам надо где-то от 100Гц... итого 16м/100=160к тактов на операцию... фатит... я как-то об этом зафтыкал. Завтра на 8 7сегментах попробую... благо как раз спаял правда 8+8.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Упсь... а вот теперь я подвис... У меня вышло что надо просчитывать линию, выводить на экран. просчитывать следующую и т.д. Фантазия как это сделать кончилась. Можно показывать по прерыванию по времени, но как тогда считать... Просчет кадра надо вписать в четверть такта, три четверти сидеть в засаде ожидая времени показа, и так по кругу. Жесть.

yanbaev72
Offline
Зарегистрирован: 08.11.2013

Всем привет!

Вот примерно что у меня получилось!

<iframe src="http://vk.com/video_ext.php?oid=3308094&id=167005534&hash=f656ba68a5795c1f&hd=1" width="607" height="360" frameborder="0"></iframe>