Подключение светодиодной матрицы

ustas
Offline
Зарегистрирован: 12.03.2012

Коллеги, подскажите пожалуйста.

Планируется девайс с массивом из 4 светодиодных матриц 8х8 (типа таких: http://www.seeedstudio.com/depot/datasheet/SZ012388K9.pdf - 8х8 двухцветные)

Управление планируется мегой. Подключить их планирую следующим образом - "ряды" (8 штук, через одну ULN) к выходам с ШИМ (чтобы можно было яркость регулировать). 

"Столбцы" (8х4=32) - через 4 сдвиговых регистра 74HC595 - это для одного цвета, такую конструкцию надо будет повторить (поскольку матрицы - двухцветные).

Вопросы:

1. Не попалю-ли выходы свдиговых регистров, если так подключать?

2. Сработает идея с подключением "рядов" к ШИМ? Или яркость надо как-то иначе при динамической индикации регулировать?

3. Не будет ли слишком медленной работа с таким количеством сдвиговых регистров (4 штуки) для динамической индикации?

4. Нет ли чего лишнего (или недостающего)?

5. Токоограничительные резисторы куда ставить (в цепь "строк" или "столбцов")? - сам склонаюсь к "строкам", но пока это как-то "на ощущениях" (правда, есть сомнение - не будут ли при разных условиях светодиоды гореть с разной яркостью при таком подключении)... 

6. Может, кто-то делал похожее? Поделитесь картой "граблей"?

tsostik
Offline
Зарегистрирован: 28.02.2013

К любому выходу 74HC595 одномоментно подключен только один светодиод, так что их выходы не погорят.

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

Отсюда два вывода -

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

2)На вход каждого ряда обязательно поставить по транзистору (лучше имхо по дарлингтону, чтобы запас был) или полевику.

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

Насчет медленной работы - для нормального отображения частота обновления экрана должна быть порядка 100 Гц или выше. 10 мс на одно отображение, около 1.25 на ряд.

Времени должно хватить, если вместо digitalWrite писать в регистры напрямую.

В этой теме подключали дисплей 16x32, который фактически так и устроен.

Но

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

Насколько я помню, в названии фигурируют цифры 1632

msng
Offline
Зарегистрирован: 07.06.2012

тоже калдую щас над такой же матрицей....

через шим не подключал, не было такой задачи

подключил строки и ряды через три штуки 74hc595. резисторы подключал к рядам (к катодам красных и зеленых диодов), управлять получается...

на счет транзисторов к строкам не ставил... (под рукой не было собрал без ключей) работает, но по расчетам работает за гранью возможности (если зажечь в строке все диоды одной матрицы  красные и зеленые - 16 штук подключенные через 470 ом, то не сложно засчитать ток через регистр - (5в-2в)/470оМ*16=100мА, максимальный ток регистра = 70мА) хотя над регистрами глумился зажигал сразу все диоды матрицы а это более чем 1/2 ампера... ниче живые, работают, не греются... ну это так... эксперементы...

в этой матрице не понрамилась нумерация выводов "катод зеленый", "катод красный", "анод" вникал как развести плату под нее.... видал другую матрицу у нее цокалевка поинтереснее 1-8 - катоды зеленого, с 9-12 аноды, с 13-24 катоды красного, удобнее подключать напрямую у регистрам, отправил в регистр какие диоды в строке зажечь они и засветились, тут немного замороченней..

ustas
Offline
Зарегистрирован: 12.03.2012

tsostik пишет:

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

....

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

Насколько я помню, в названии фигурируют цифры 1632

Да, я тут тоже "покурил" форумы, похоже правильнее использовать драйвер матрицы.

А что за мультиплексор?  хотя-бы пример, чтобы понимать, что искать? Или как правильнее реализовать регулировку яркости?

tsostik
Offline
Зарегистрирован: 28.02.2013

Драйвер.

Демультиплексор. Три адресных входа для выбора ряда. Один вход для тактовой линии, один (на самом деле два, но второй здесь не нужен) вход для шимирования, один из восьми выходов включает нужный ряд. Для 16 рядов ищем не 3-to-8 а 4-to-16

ustas
Offline
Зарегистрирован: 12.03.2012

Вот спасибо!

74HC138 - очень понравилась микросхемка. Только там нет тактовой линии (она там и не нужна совсем), а логикой на пинах CS1, CS2, CS3 очень удобно организовать регулировку яркости (достаточно завести ШИМ на CS1, а CS2, CS3 - посадить на землю).

Драйвер этот тоже шикарен, один корпус может рулить сразу всей матрицей 8*32 (правда, для одного цвета) - надо будет подумать (но транзисторов надо много).  

Вообще, есть еще драйвера попроще, например MAX7219

 

Пока на текущий момент, пожалуй, лидирует следующий вариант:

1. Ряды подключаются через демультиплексор и ULN 

2. Столбцы - через сдвиговые регистры

Динамическую индикацию производим по рядам (пробегаемся по рядам с 0 по 7, зажигая в столбцах нужные светодиоды). 

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

tsostik
Offline
Зарегистрирован: 28.02.2013

Насколько я знаю, есть два способа:

1)Сначала подключаются все красные цвета. Выход последнего красного регистра подключается на вход первого зеленого регистра. (Ну или красный и зеленый меняем местами). Тогда при управлении засылаем сначала все зеленые биты, потом все красные.

2)Красная и зеленая линии идут параллельно. По одному пину шлем красные биты, по второму - зеленые.

Первый подход экономит один пин на МК, во втором чуть пироще становится логика управления.

Из схем, которые я встречал - RGB обычно подключают по независимым линиям, RG - кто как, но чаще по одной.

PS: Десять минут назад принес с почты три вот таких матрицы. Они как раз на HT1632C сделаны. Буду экспериментитровать. Правда не с дуиной, а на Stellaris Launchpad'e. Но для дуины я даже библиотеку видел, которая работает с HT1632.

ustas
Offline
Зарегистрирован: 12.03.2012

Продолжаем разговор.

Получил микросхемы - демультиплексор 74HC138, UDN2981A (эта связка будет "рулить" строками). Собираю простенький макетик (цель - "рулить" 8 светодиодами, символизирующими "ряды" в матрице), чтобы все предварительно проверить.

Подключение простейшее - три цифровых пина идут на адресные входы 74HC138, входы E1 и E2 - на землю, на E3 - заводим один из пинов с ШИМ (для регулировки яркости).

Выходы 74HC138 заводим на входы UDN. 

Выходы UDN "нагужаем" светодиодами (катод светодиода на GND, анод - к выходу ULN).

Такое подключение обусловлено тем, что матрицы, которые будут использоваться в дальнейшем (и пока только едут) - выполнены по схеме с общим анодом.

 

И все в макете работает так, как требуется (выбирается нужный светодиод из линейки в зависимости от адреса, регулируется яркость его свечения с помощью ШИМ), но есть один "маленький" косячок.

Заключается он в том, что 74HC138 имеет инверсные выходы (т.е. все пины, кроме того, который соответствует "адресному" - в положении HIGH, и только "адресный" - LOW). UDN это положение вещей просто "транслирует" дальше.

В результате вся линейка светодиодов горит, за исключением "адресного".

Понятно, что между 74HC138 и UDN можно просто поставить элементы "логическое НЕ" (нашел в закромах К155ЛА3 - сделал 4 инвертора, подключил, как описал - работает как нужно), но это дополнительные корпуса (кстати, не нашел 8 элементов НЕ в одном корпусе). 

Может, есть демультиплексор аналогичный 74HC138, но без инверсии на выходе? (в гугле не забанен, но пока слабо представляю, как там искать микросхемы с нужными параметрами)

Или какой-то еще вариант?

ales2k
Offline
Зарегистрирован: 25.02.2013

Добрый день. А max7219 не рассматриваете? Микруха не дорогая 5$ за пучек. Можно последовательно 8 шт включать.

ustas
Offline
Зарегистрирован: 12.03.2012

рассматривал ее.. но там - " общим катодом" - не подходит

ales2k
Offline
Зарегистрирован: 25.02.2013
ustas
Offline
Зарегистрирован: 12.03.2012

за выходные успел проверить несколько своих гипотез.

http://www.youtube.com/watch?v=e9jpitH9mWQ

Выглядит, конечно, ужасно :) но суть:

1. линейка светодиодов - это один столбец большой результирующей матрицы

2. адресация строк сделана с помощью демультиплексора 74HC138 (3 пина)

3. работает регулировка яркости (1 пин ШИМ)

4. построена цепочка из 4 регистров сдвига 74HC595 для отображения соответствующих данных - работает отлично (реально будет 8 регистров сдвига - проверил программным путем - тоже работает без нареканий) - (3 пина)

5. отображение сделано на прерываниях (по переполнению таймера) - в основном цикле вообще ничего для отображения не крутится

 

P.S. похоже, специализированные контроллеры пока подождут. На "том, что есть" - вполне работает. Нужно дальше тестировать и оптимизировать. 

P.P.S. битовые операции - очень мощная штука, понравилось! :)

ustas
Offline
Зарегистрирован: 12.03.2012

Матрицы приехали. То, что было запрограммировано - с успехом отработало. Но.

Яркость получилась хиленькая (ну понятно, конечно, динамическая индикация, 8 строк, в лучшем случае это получается 1/8 от яркости полностью зажженного светодиода).

Как можно ее поднять?

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

Для питания анодов используется UDN. Может, ей дать питания побольше (например, 9 вольт). А сдвиговым регистрам от такого не сплохеет?

msng
Offline
Зарегистрирован: 07.06.2012

на udn дать то можно а вот сдвиговые.... вроде как 74-я серия она пятивольтовая...

у меня яркость вполне приличная без udn, матрица подключена напрямую к регистрам через сопротивления 470 ом

сниму видео, через 1/2 часика выложу

вот и видео

ustas
Offline
Зарегистрирован: 12.03.2012

ого. Вот это яркость... у меня существенно слабее светит. Поделитесь скетчем (интересует, как вывод делаете?).

а матрицы такие же, как я ссылку указвал? или другие?

я вывожу так:

// отображение дисплея
ISR(TIMER1_COMPA_vect)         
{
  // погасили текущую строку 
  PORTL|=(1<<6); // установили 6 бит в 1 (подключено к E1 и E2 демультиплексора)
  
  // считаем, какая строка должна быть следующей
  row++;
  if (row == 8) {
    row = 0;
  }
  
  // сформировали адрес новой строки
  PORTL = (PORTL & ~addrmask) | (row);
  //три младших байта - адресные - подключены к А0, А1 и А2 демультиплексора
  
  // готовим данные
  // начинаем передачу по SPI на регистры сдвига для матрицы
  PORTL&=~(1<<7); // установили 7 бит в 0 - ST_CP вход 74HC595
  

  // передаем последовательно данные
  for(char i=0; i < 8; i++){
    SPI.transfer(~array[7-row][i]);
  }

  // яроксть регулируется ШИМ на 43 пине (вынесено из функции обработки прерывания) - подключено к E3 демультиплексора
  
  //заканчиваем передачу по SPI
  PORTL|=(1<<7); // установили 7 бит в 1
  
  // зажигаем новую строку
  PORTL&=~(1<<6);
}

Собственно, тут все прозрачно. Ипользую порт L (mega2560). Работает, но как-то странно. 

Первые тесты проводил на nano328 (порт D использовал) - все работало нормально, без приключений.

Сейчас пересобрал макет на mega2560... и грабли. Почти работает.. но выяснилось, что во-первых, ШИМ на мега - почему-то вдвое более медленный (490Гц, против 977Гц на 328 - и из-за этого регулировка яркости выглядит как жуткое мерцание),  так еще и изредка (выглядит как "мерцание" предыдущей строки) - косячит с выбором строки. 

Почему так - понять не могу... 

ustas
Offline
Зарегистрирован: 12.03.2012

Вопрос с яркостью матрицы пока снимается... UDN рабоатет не в своем режиме. Нужно ставить транзисторные ключи (спасибо, maksim).

msng
Offline
Зарегистрирован: 07.06.2012

щас нет возможности скинуть свой скетч

делал вывод с помощью вот этой команды

матрицы брал на ибее вот такие помоему это такие же как и у вас

ярокость такая без ключей напрямую к 74hc595 через сопротивления 470 ом. седня пришли  ключи uln2803, не знаю ставить их или без них обойтись....

 

ustas
Offline
Зарегистрирован: 12.03.2012

матрицы похожие, у вас чуть меньше по размеру, но такая же схемотехника. ULN для подключения не подойдут (потому, как на наших матрицах "общие аноды").

 

msng
Offline
Зарегистрирован: 07.06.2012

про аноды я тоже читал(((

матрица у меня действительно меньше (значительно меньше) 32 мм

управлять ими так же, доберусь до компа скетч выложу...

тоже есть нерешенные вопросы

 

msng
Offline
Зарегистрирован: 07.06.2012

вот и мой скетч..

int latchPin = 9;
int clockPin = 12;
int dataPin = 11;
byte matrix[40]={0,0,0,0,0,0,0,0,255,255,6,12,0,206,223,243,230};
byte matrix1[40]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,219,137,66,0,118,137,129,66}; 
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);}
void loop() 
{for (byte s=0; s<=32; s++) 
  {for (int x = 0; x <= 7; x++)
    {int y=s+x;   
     int anod=pow(2,x); if (anod >=3 ) anod=anod+1;  
     for (byte f=0; f<=3; f++) 
     {digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, anod); 
        shiftOut(dataPin, clockPin, MSBFIRST, (255-matrix[y])); 
        shiftOut(dataPin, clockPin, MSBFIRST, 255-matrix1[y]);
        digitalWrite(latchPin, HIGH);
        delay(1);
      }
    }
  }
}

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

PS поглядел даташит на uln2803. вроде как можно и нагрузку на массу вешать и на плюс... хотя гдето читал что грузить только к катодам...

ustas
Offline
Зарегистрирован: 12.03.2012

В общем, движение идет! Уже вот что получается:   http://www.youtube.com/watch?v=YcYIvSukPWQ

ustas
Offline
Зарегистрирован: 12.03.2012

Потихоньку разбираюсь со своим проектом. В моем случае, самым правильным оказалось общие аноды матриц подключить с помощью транзисторов b772 (еще раз спасибо maksim).

Попутно решилась небольшая проблемка - на mega ШИМ оказался более медленным, чем на 328 (другие предделители стоят штатно). 

Пока получается вот что (это горят "зеленые" и "красные" одновременно, могу включать произвольно):

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

Но не без косяков. Вчера вечером запустил, сегодня с утра обнаружил "висящее" тело (на экране мусор, на ИК не реагируем). Перезагрузил - завелось. Почему так - пока не понимаю (может, есть идеи?)

И еще вчера обнаружил странную вещь, модуль RTC (DS1307) почему-то иногда (но довольно часто все-таки) выдает "крайние" состояния (2000 год или 2165 год и разный мусор в остальных параметрах даты/времени). Предполагаю, что это из-за того, что когда с модулем шел "диалог", сработало прерывание для динамической индикации и после возврата из прерывания - уже неудача.  

msng
Offline
Зарегистрирован: 07.06.2012

у меня вот что получилось

остается с платой разобраться...

ustas
Offline
Зарегистрирован: 12.03.2012

Одну проблему попборол (висящее тело), а вот с модулем часов пока не знаю, что делать... 

Получается пока примерно так

ustas
Offline
Зарегистрирован: 12.03.2012

tsostik пишет:

Насколько я знаю, есть два способа:

1)Сначала подключаются все красные цвета. Выход последнего красного регистра подключается на вход первого зеленого регистра. (Ну или красный и зеленый меняем местами). Тогда при управлении засылаем сначала все зеленые биты, потом все красные.

2)Красная и зеленая линии идут параллельно. По одному пину шлем красные биты, по второму - зеленые.

Первый подход экономит один пин на МК, во втором чуть пироще становится логика управления.

Есть еще третий:

Регистры подключены последовательно, цвета подключены "через один" (т.е. красный-зеленый-красный-зеленый и т.п.). 

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

Но вот с логикой управления в этом варианте все не так хорошо (приходится учитывать чередование байт для разных цветов, особенно, когда требуется организовать какую-то "динамику" (типа "бегущей строки")).

Но это тоже решаемо (по ссылке выше видно).

bbv
Offline
Зарегистрирован: 11.02.2020

схема вот такая

bbv пишет:
имеются семисегментные индикаторы в количестве 4 шт. - 18011AB, синие, подключаем их к ардуине через MAX7219 , по стандарной схеме, это часы, они работают, но индикаторы светят очень тускло, резистор на максе 10кОм, прогаммно пробывали по максимуму интенсивность включать, ничего не меняется, все также тускло...пробывали после 7219 по сегментам подключать Udn2981a, ярче начинает гореть, но засвечиваются те сегменты которые не должны гореть в данный момент и именно в четвертом разряде (крайний справа)...напряжение питтания индикаторов около 6в-7в через Udn2981a. Может кто подскажет как увеличить яркость без засвечивания сегментов которые не должны гореть??

rkit
Offline
Зарегистрирован: 23.11.2016

Даташит на индикаторы внимательно читай. 7 вольт им мало.

bbv
Offline
Зарегистрирован: 11.02.2020

Доделал схему с учетом всех имеющихся замечаний, да  теперь яркость индикаторов могу регулировать тем же питанием от 6-12 вольт, но...фантомы никуда не исчезли...понимаете что такое фантомы да? то есть ненужные в текущий момент заметные на глаз слегка зажженые сегменты...Прошу помощи у гуру , что не так? Схема на данный момент такая...