Как правильно управлять 350 светодиодами

timur2008
Offline
Зарегистрирован: 06.03.2013

Добрый день. Я хочу выводить цифры используяс для их вывода группу светодиодов и включая одни и выключая другие формировать цифры на доске. У меня по моей задумке получается матрица 5 на 5 светодиодов , но ничего не получается сформировать.Я использую для объеденения светодиодов 6 сдвиговых регистров 74HC595 благодаря этому чисто теоретически смогу управлять 25 светодиодами. Я думал что будет все просто , но я застопорился  на алгоритме. Получается какая то фигня. Он выводит совсем не те светодиоды которые мне нужны и какую то логику в их управлении я уже просто не могу найти. Сижу уже три дня и и ничего не получается поэтому решил написать сюда. Вот кусок кода отвечающий за вывода части анных , но тоже чушь полнаяя т.к. я уже по всякому пробовал. Могу еще проект протеуса скинуть если кому нужно . П.С В теме написано про 350 светодиодов т.к. таких модулей из 25 светодиодов будет много.

  digitalWrite(LATCH,LOW);
    shiftOut(SER,CLK,MSBFIRST,B00000000<<8);
   
    //shiftOut(SER,CLK,MSBFIRST,leds[0]);    
    shiftOut(SER,CLK,MSBFIRST,leds[0]<<7);
    shiftOut(SER,CLK,MSBFIRST,B00000000<<8);
    shiftOut(SER,CLK,MSBFIRST,leds[0]<<5);
    digitalWrite(LATCH,HIGH);
    delay(250);

"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что это написано в коде? Вы можете построчно прокомментировать?

Например, чем отличается B00000000<<8 от просто 0?

Что такое leds[0]<<7 и leds[0]<<5?

Это вообще всё про что?

И почему это

timur2008 пишет:

 6 сдвиговых регистров 74HC595 благодаря этому чисто теоретически смогу управлять 25 светодиодами. 

именно 25, а не 48 как все нормальные люди?

Как они у Вас вообще подключены, светодиоды?

timur2008
Offline
Зарегистрирован: 06.03.2013

int leds[]={1,2,4,8,16,32,64,128};

25 светодиодов выбрал именно из-за экономии светодиодов их зватит чтобы любую однозначную цифру вывести.  Подключены через DS регистр стандартно, между собой микросхемы 74HC595 соеденины в каскад через регистр Q7'. По поводу leds[0]<<7 это я типо пытался сдвигать еденицу чтобы ее падать на тот светодиод который мне нужно. Если один каскад то это работает а если несколько то уже фигня получается :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, что значит "стандартно"? Их можно подключать 100500 способами и никакого стандарта нет.

Если у Вас 6 регистров, почему выводите только 4 байта?

Давайте-ка схмеу и полный скетч (маленький - без лишнего, просто вывод, но полный)

timur2008
Offline
Зарегистрирован: 06.03.2013
const int SER = 8;
const int LATCH = 9;
const int CLK = 10;
bool check = false;
int leds[]={1,2,4,8,16,32,64,128};
int leds1[]={128,192,224,240,248,252,254,255};
int leds2[]={1,3,7,15,31,63,127,255};
void setup() {
  pinMode(SER,OUTPUT);
  pinMode(LATCH,OUTPUT);
  pinMode(CLK,OUTPUT);
}

void loop() {
 
if (!check)
{
    digitalWrite(LATCH,LOW);
    shiftOut(SER,CLK,MSBFIRST,B00000000<<8);
   
    //shiftOut(SER,CLK,MSBFIRST,leds[0]);    
    shiftOut(SER,CLK,MSBFIRST,leds[0]<<7);
    shiftOut(SER,CLK,MSBFIRST,B00000000<<8);
    shiftOut(SER,CLK,MSBFIRST,leds[0]<<5);
    digitalWrite(LATCH,HIGH);
    delay(250);
    check= true;
} 


}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А схема?

В любом случае. Если у Вас 6 регистров, Вы должны выводть 6 байтов. А Вы выводите только 4. Вы точно понимаете что делаете?

timur2008
Offline
Зарегистрирован: 06.03.2013

http://disk.tom.ru/wy4my3t

Вот схема

timur2008
Offline
Зарегистрирован: 06.03.2013

Вот в этом то вся и проблема что я просто не понимаю как правильно вывести эти 6 байт. Как закодировать так чтобы в итоге например светодиоды зажгли цифру 1.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понимаю, чего Вы не понимаете. Если у Вас есть 6 регистров (Вы правда, так и не привели схему) и Вы их соединили правильно, то Вы должны передать 6 байтов. Самый первый отвечает за самый дальний от ардуины релистр, второй - за "чуть ближе", ..., последний - за ближайший к Ардуине. Попробуйте передать 255, а затем 5 нулей. На самом дальнем регистре долны включиться все ноги, а на остальных - ни одна.

Но, больше я с Вами без схемы не разговариваю, т.к. не понимаю для чего Вам 6 регистров на 25 светодиодов (каждый регистр обслуживает 8 светодиодов) и не понимаю, что за вывод Q7 о которым Вы писали.

timur2008
Offline
Зарегистрирован: 06.03.2013

так я вам схему в ссылке кинул ? Я ее на файлообменник залил. Так вопрос а как передать самые дальние байты ?

Мне нужно передать shiftOut(SER,CLK,MSBFIRST,255<<16);

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

timur2008 пишет:

так я вам схему в ссылке кинул ?

Я не нашёл там шести регистров

timur2008 пишет:

 Так вопрос а как передать самые дальние байты ?

Блин, ну я же Вам писал. Если регистров 6, то пердаёте 6 байтов. Первый пойдёт на самый дальний регистр. Второй, на "пред-самый дальний" и т.д. Самый последний байт - на ближайший к ардуине регистр.

И я Вам писал - попробуйте передать 255, а затем 5 нулей. Сделайте же наконец!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И кстати, о Вашей схеме, а что токограничивающих резисторов нет? Ваши регистры ещё живы? У них ведь абсолютный максимум - 70мА на корпус!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

timur2008 пишет:

Мне нужно передать shiftOut(SER,CLK,MSBFIRST,255<<16);

Не сходите с ума! 

Вам нужно 6 раз передать по байту!

shiftOut(SER,CLK,MSBFIRST,255);
shiftOut(SER,CLK,MSBFIRST,0);
shiftOut(SER,CLK,MSBFIRST,0);
shiftOut(SER,CLK,MSBFIRST,0);
shiftOut(SER,CLK,MSBFIRST,0);
shiftOut(SER,CLK,MSBFIRST,0);

 

timur2008
Offline
Зарегистрирован: 06.03.2013

Хмм сейчас попробую , спасибо , да я там еще читал как это по другому делается. Я тут просто моделирую у меня еще реальных элементов нет. Да вроде понял как этиими вещами управлять , спасибо большое за помощь :)

timur2008
Offline
Зарегистрирован: 06.03.2013

Так там все получилось но меня возник еще один вопрос,  у этого регистра данные подаются через регистр DS. Могу ли я параллельно подключить к разным пинам ардуины эти регистры DS разных 74HC595. Просто я сейчас так в симуляторе попробовал сделать но чтото не очень работает почему то. Аа да понял не могу ) это глупый вопрос был )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Можно, если с умом. Непонятно только зачем.

timur2008
Offline
Зарегистрирован: 06.03.2013

у меня просто когда одна цифры "рисуется"  светодиодами то все норм а если вторую начинаю рисовать то все сбивается :( Каждая цифра у меня занимает 3 сдвиговых регистра получается.

const int SER = 8;
const int SER1 = 7;
const int LATCH = 9;
const int CLK = 10;
bool check = false;

void setup() {
  pinMode(SER,OUTPUT);
  pinMode(LATCH,OUTPUT);
  pinMode(CLK,OUTPUT);
}

void loop() {
if (!check)
{
  numbOne(SER);    
  check= true;
}  
}


void numbOne(int numModule)
{
  digitalWrite(LATCH,LOW);   
//Здесь нарисовалась цифра "1" нормально
    shiftOut(numModule,CLK,MSBFIRST,66);    //Первый байт в самую даль проталкиваем
    shiftOut(numModule,CLK,MSBFIRST,8<<1);    //Следующий предпоследний и т.д.
    shiftOut(numModule,CLK,MSBFIRST,164);//считаем с H до A
//Здесь пытаюсь нарисовать цифру "2" и все сбивается и цифра 1 и ничего норм не рисуется .  
    shiftOut(numModule,CLK,MSBFIRST,124);
    shiftOut(numModule,CLK,MSBFIRST,124);
    shiftOut(numModule,CLK,MSBFIRST,124);
    digitalWrite(LATCH,HIGH);
}


 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я же не знаю, что и как у Вас подключено. Схему нет. Откуда мне знать, что такое напримере Ваши 124 в строках 30-32 - чему они соответсвуют? Как Вы раскидали 25 светодиодов по шести регистрам - тоже секрет. 

axill
Offline
Зарегистрирован: 05.09.2011

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

а по цене получается выгоднее чем стоимость одних светодиодов

timur2008
Offline
Зарегистрирован: 06.03.2013

Айй ) похоже реально в данном случае попробую смотреть в сторону светодиодных матриц , ЕвгенийП и axill спасибо за подсказки :)

axill
Offline
Зарегистрирован: 05.09.2011

посмотрите поиском на алиэкспресс по слову HUB75 это распространенный протокол, там много панелей

ими конечно ардуиной управлять не очень просто, нужно быстрое сканирование сотен-тясяч светодидов, но если нужны неторопливые надписи то вполне, есть готовая библиотека от adafruit. я пробовал, неплохо

ну а если подключить что то более мощное, STM32 или какой нибудь raspberry то можно хоть видео выводить

axill
Offline
Зарегистрирован: 05.09.2011

есть еще матрицы со свтроенным контроллером и памятью которыми ардуиной управлять легче, один из примеров в моей статье http://radiokot.ru/circuit/digital/home/194/

они соотвественно несколько дороже

arduinec
Offline
Зарегистрирован: 01.09.2015

timur2008 пишет:

Айй ) похоже реально в данном случае попробую смотреть в сторону светодиодных матриц

С помошью Ардуины легко управлять матрицами (лентами) с чипами ws2811 и ws2812.