Самодельные часы на светодиодных матрицах. Делаем светодиодную бегущую строку на Arduino своими руками Как самому сделать светодиодную матрицу

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

В данном видео мы предлагаем вам посмотреть процесс создания такой светодиодной матрицы.

Для работы нам необходимо подготовить следующее:
- макетная плата;
- 100 светодиодов;
- паяльник;
- 100 резисторов;
- скотч;
- кусачки;


Подготовив все необходимое, приступаем к изготовлению светодиодной матрицы с размерами 100х100 мм.

Для питания светодиодов мы будем использовать напряжение в 5 В, резисторы используем с номиналом 470 Ом, это необходимо для задания нужной величины тока в 20 мА, проходящей через каждый светодиод.


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

Сначала припаиваем на плату светодиоды. Для удобства закрепляем каждую состоящую из них линию скотчем, чтобы у нас была возможность перевернуть плату и запаять сразу все линию светодиодов.

Расставляем все светодиоды на плате. Обратите внимание, что эти радиоэлементы имеют анодный и катодный выводы. Чтобы не ошибиться - более длинный вывод имеет знак «+». Закрепляем их скотчем, чтобы временно зафиксировать их на месте.


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

После запаивания первого ряда, чтобы выводы уже припаянных светодиодов не мешали дальнейшей работе можно откусить при помощи кусачек. Скотч убираем.

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

Светодиоды все стремительнее занимает свое место среди источников освещения.
Низкое потребление электроэнергии, яркость позволили светодиодам вытеснить традиционные лампы накаливания и довольно уверенно соперничать с энергосберегающими.
Поддавшись общей тенденции, решил собственными руками пощупать и собственными глазами посмотреть на светодиодную матрицу, не требующую каких-то отдельных драйверов, а подключающихся непосредственно к сети 220 вольт. Кому интересна данная тема, прошу под кат.
В результате остановил свой выбор на следующем экземпляре:

Из описания на странице следует, что данный источник света:
- производится по технологии LED СОВ;
- напряжение питания 220 вольт;
- потребляемая мощность 30 ватт;
- цветовая температура 2500- 3200К;
- материал подложки (основания) алюминий;
- габаритные размеры 40*60мм;

Пока ехала посылка, изучил теорию.
Что собой представляет технология LED СОВ?

Примерно до 2009 года у светодиодной продукции было только одно направление развития – увеличение мощности светодиода или Power LED. Совершенствование данной технологии позволило добиться мощности одного светодиода на уровне 10 ватт.
Как оказалось дальнейшее наращивание мощности не имеет смысла ввиду высокой стоимости производства отдельного мощного светодиода. Важную роль в поисках иного пути развития так же послужило то, что светодиод является точечным источником света и добиться засветки большой площади поверхности с помощью мощных светодиодов оказалось не просто и весьма не дешево. Для получения более-менее приемлемых результатов требовалось применение оптических систем для того, чтобы сделать свет рассеянным.
Следующим шагом было применение для создания приемлемых источников рассеянного света SMD светодиодов – на одну плату припаивалось большое количество светодиодов. Недостатками является общая трудозатратность процесса – производство отдельных светодиодов (каждый на своей керамической подложке + персональный слой люминофора и т.д.). Кроме того, недостатками метода являлась невысокая надежность отдельных светодиодов и необходимость ремонта при выходе хотя бы одного из них из них из строя.
В итоге, к инженерам пришла мысль о необходимости производства светодиодов без персональных атрибутов и размещения их на одной плате на небольшом расстоянии друг от друга под общим слоем люминофора, т.е. технология LED СОВ. В конечном итоге это позволило снизить стоимость источника света в целом и в случае выхода из строя отдельных светодиодов менять весь модуль (матрицу).

Приехала посылка в желтом конверте с пупыркой внутри. Сама матрица вложена в соразмерный пластиковый пакет.





Как видим, действительно светодиоды расположены близко друг к другу, покрыты общим слоем люминофора и защищены массой, напоминающей пластичный клей.
Белая субстанция по периметру матрицы и защищающая схему драйвера похожа на резину или термоклей – не твердая, упругая масса. Это позволило снять ее с наиболее выдающихся корпусов и определить, что один из них диодный мост MB10S с максимальным постоянным обратным напряжением 1000 вольт и максимальным прямым током 0,5 ампер.
Даташит:

Размеры соответствуют указанным в описании.



Толщина подложки 1 мм и вес матрицы аж 8 грамм.

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


Саморезами, через термопасту КПТ -8 матрица была закреплена на радиаторе.
В данной последовательности действий была допущена ошибка – провод следовало припаивать до крепления матрицы к радиатору – тепло от паяльника уходило в теплоотвод. Результат пайки виден на фото. Однако провода держались надежно, и снимать матрицу уже не стал.


Первое включение произвело неизгладимое впечатление – сказать «ярко», ничего не сказать. Даже если смотреть с расстояния под небольшим углом к плоскости матрицы «зайцы» обеспечены. По сравнению с имеющимися в наличии энергосберегающими лампами температурой 2800К свет белый и его много.

Комната площадью 14 кв. метров освещается более, чем хорошо.







После 20 минут температура поднялась до 85 градусов. Далее испытывать на прочность матрицу не стал, хотя чипы управления могут контролировать ток через светодиоды при сильном нагреве.

Далее тесты проводились с использованием принудительного охлаждения штатным куллером от данного радиатора и платой контроля частоты вращения вентилятора. Последнюю снял со старого блока питания ПК.





Температура в течение полутора часов не поднималась больше 31,5 градуса, а вентилятор работал на малых оборотах, не разгоняясь.



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

Увеличение напряжения в сети позволило убедиться что заявленная потребляемая мощность соответствует действительности.



Ожидаемо фотоаппарат реагировал на мерцание матрицы частотой 100 Герц. Видео не снимал, но смог зафиксировать следующее

Можно было бы побороться с пульсациями, припаяв к диодному мосту конденсатор. Это вызвало бы повышение напряжения до 220*1,41=310,2 вольта и нужно было бы играться с ограничивающими резисторами BP5132H, но поскольку изначально отдавал себе отчет о том, что данный источник света не для жилых помещений, то затевать эту борьбу не стал.
Сфера применения матрицы – общее освещение улицы, подсобных помещений и тому подобное, и, следовательно, пульсациями можно пренебречь.
С помощью ЛАТРа удалось установить (эксперимент проводился на работе и фото не делал, дабы не отвечать на вопросы: «Зачем?»), что нижний порог, при котором матрица еще излучает свет, 130 с небольшим вольт. Больше 250 вольт не подавал, но в том случае не помешает маска сварщика).
В связи с тем, что данный источник света обладает высокой мощностью и, если так можно выразиться, повышенной плотностью света, то совсем не лишним будет рассеивающий экран перед матрицей.

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

Однако эти минусы с лихвой перекрываются яркостью данной матрицы, способностью освещать большую площадь, соответствием заявленным характеристикам.
Мерцание не могу отнести к отрицательным чертам так, как область применения матрицы НЕ ЖИЛЫЕ помещения.
Отдельно хочу обратиться к адептам ордена «Ненавистников пункта 18»). Друзья, прошу быть объективными в оценке изложенной в обзоре информации, тем более, что для ее сбора, систематизации и изложения пришлось затратить довольно много усилий и времени.

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Планирую купить +44 Добавить в избранное Обзор понравился +60 +111

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


Алгоритм индикации следующий: сначала устанавливаем на линиях требуемые логические уровни в зависимости от того какие сегменты надо включить на первом индикаторе (индикация слево направо), при этом высокий логический уровень для включения, низкий для выключения сегмента. Далее подаем высокий логический уровень на базу транзистора VT1, тем самым общий катод первого индикатора подключается к общему проводу, в этот момент загораются те сегменты, на анодах которых присутствует логическая единица. Через определенное время (пауза) индикатор отключаем, подав низкий логический уровень на базу транзистора, затем снова меняем логические уровни на линиях в соответствии с выводимой информацией, предназначенной для второго индикатора, и подаем сигнал включения на транзистор VT2. Таким образом, по порядку в круговом цикле коммутируем все индикаторы, вот и вся динамическая индикация.

Для получения цельного изображения без мерцаний, переключение необходимо выполнять с большой скоростью, для исключения мерцания светодиодов частоту обновления необходимо устанавливать от 70 Гц и более, я обычно устанавливаю 100 Гц. Для вышерассмотренной конструкции пауза рассчитывается следующим образом: для частоты в 100 Гц период равен 10 мс, всего 4 индикатора, соответственно время свечения каждого индикатора устанавливаем на уровне 10/4=2,5 мс. Существуют многоразрядные семисегментные индикаторы в одном корпусе, в которых одноименные сегменты соединены внутри самого корпуса, естественно для их использования необходимо применять динамическую индикацию.

Для реализации динамической индикации необходимо воспользоваться прерываниями по переполнению одного из таймеров. Ниже представлен код с использованием таймера TMR0:

;Реализация динамической индикации для 4-х семисегментных индикаторов ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; bcf ind1 ;выключение 1-го индикатора bcf ind2 ;выключение 2-го индикатора bcf ind3 ;выключение 3-го индикатора bcf ind4 ;выключение 4-го индикатора; incf shet,F ;инкремент регистра shet movlw .5 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 5 btfss STATUS,Z ; goto met1 ;число в регистре shet не равно 5 movlw .1 ;число в регистре shet равно 5: запись числа 1 movwf shet ;в регистр shet ; met1 movlw .1 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 1 btfss STATUS,Z ; goto met2 ;число в регистре shet не равно 1: переход на met2 movf datind1,W ;число в регистре shet равно 1: копирование movwf PORTB ;содержимого регистра datind1 в регистр PORTB bsf ind1 ;включение 1-го индикатора met2 movlw .2 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 2 btfss STATUS,Z ; goto met3 ;число в регистре shet не равно 2: переход на met3 movf datind2,W ;число в регистре shet равно 2: копирование movwf PORTB ;содержимого регистра datind2 в регистр PORTB bsf ind2 ;включение 2-го индикатора goto exxit ;переход на метку exxit met3 movlw .3 ;проверка содержимого регистра shet xorwf shet,W ;на равенство числу 3 btfss STATUS,Z ; goto met4 ;число в регистре shet не равно 3: переход на met4 movf datind3,W ;число в регистре shet равно 3: копирование movwf PORTB ;содержимого регистра datind3 в регистр PORTB bsf ind3 ;включение 3-го индикатора goto exxit ;переход на метку exxit met4 movf datind4,W ;копирование содержимого регистра datind3 movwf PORTB ;в регистр PORTB bsf ind4 ;включение 4-го индикатора; movlw .100 ;запись числа 156 в регистр таймера TMR0 movwf TMR0 ; ; movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа ................. movlw b"11010011" ;OPTION_REG, тем самым устанавливаем внутренний ;устанавливаем коэффициент предделителя 1:16 ; clrf shet ;обнуление регистра shet, перед запуском;прерываний по переполнению TMR0, выполняется; clrf datind1 ;очистка регистров вывода информации на clrf datind2 ;индикаторы, равнозначно выключению clrf datind3 ;индикаторов, так как индикаторы с общим clrf datind4 ;катодом; bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0 bsf INTCON,GIE ;разрешение глобальных прерываний; movlw b"00000110" ;пример вывода числа 13,52 movwf datind1 ; movlw b"11001111" ; movwf datind2 ; movlw b"01101101" ; movwf datind3 ; movlw b"01011011" ; movwf datind4 ; ; ................. ; ................. ; ................. ; ; end ;конец всей программы;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Реализация динамической индикации для 4-х семисегментных индикаторов

;Частота тактового генератора для примера 4 МГц, машинный цикл 1 мкс

org 0000h ;начать выполнение программы с адреса 0000h

goto Start ;переход на метку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма обработки прерываний

org 0004h ;начать выполнение подпрограммы с адреса 0004h

movwf W_TEMP ;сохранение значений ключевых регистров

swapf STATUS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;выключение 1-го индикатора

bcf ind2 ;выключение 2-го индикатора

bcf ind3 ;выключение 3-го индикатора

bcf ind4 ;выключение 4-го индикатора

incf shet,F ;инкремент регистра shet

movlw .5 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 5

btfss STATUS,Z ;

goto met1 ;число в регистре shet не равно 5

movlw .1 ;число в регистре shet равно 5: запись числа 1

movwf shet ;в регистр shet

met1 movlw .1 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 1

btfss STATUS,Z ;

goto met2 ;число в регистре shet не равно 1: переход на met2

movf datind1,W ;число в регистре shet равно 1: копирование

movwf PORTB ;содержимого регистра datind1 в регистр PORTB

bsf ind1 ;включение 1-го индикатора

goto exxit ;переход на метку exxit

met2 movlw .2 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 2

btfss STATUS,Z ;

goto met3 ;число в регистре shet не равно 2: переход на met3

movf datind2,W ;число в регистре shet равно 2: копирование

movwf PORTB ;содержимого регистра datind2 в регистр PORTB

bsf ind2 ;включение 2-го индикатора

goto exxit ;переход на метку exxit

met3 movlw .3 ;проверка содержимого регистра shet

xorwf shet,W ;на равенство числу 3

btfss STATUS,Z ;

goto met4 ;число в регистре shet не равно 3: переход на met4

movf datind3,W ;число в регистре shet равно 3: копирование

movwf PORTB ;содержимого регистра datind3 в регистр PORTB

bsf ind3 ;включение 3-го индикатора

goto exxit ;переход на метку exxit

met4 movf datind4,W ;копирование содержимого регистра datind3

movwf PORTB ;в регистр PORTB

bsf ind4 ;включение 4-го индикатора

exxit bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0

movlw .100 ;запись числа 156 в регистр таймера TMR0

swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;выход из подпрограммы прерывания

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

Start ................. ;первоначальная настройка регистров

................. ;специального назначения

.................

bsf STATUS,RP0 ;запись двоичного числа 11010011 в регистр

movlw b"11010011" ;OPTION_REG, тем самым устанавливаем внутренний

movwf OPTION_REG ;источник тактового сигнала для TMR0

bcf STATUS,RP0 ;включаем предделитель перед TMR0

;устанавливаем коэффициент предделителя 1:16

clrf shet ;обнуление регистра shet, перед запуском

;прерываний по переполнению TMR0, выполняется

;однократно, после включения питания

clrf datind1 ;очистка регистров вывода информации на

clrf datind2 ;индикаторы, равнозначно выключению

clrf datind3 ;индикаторов, так как индикаторы с общим

clrf datind4 ;катодом

bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0

bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0

bsf INTCON,GIE ;разрешение глобальных прерываний

movlw b"00000110" ;пример вывода числа 13,52

movlw b"11001111" ;

movlw b"01101101" ;

movlw b"01011011" ;

................. ;

................. ;

................. ;

end ;конец всей программы

В основной программе сначала настраиваем таймер с помощью регистра OPTION_REG, ранее я рассказывал про использование таймеров для . Далее очищаем регистр shet, предназначенный для введения счета от 1 до 4, для каждого индикатора. Этот регистр инкрементируется в подпрограмме обработки прерываний и там же корректируется (он будет считать от 1 до 4), поэтому данная очистка выполняется однократно после включения питания. По этому регистру будем определять, какой индикатор включать и выдавать данные соответствующие ему. Следующим шагом будет очистка регистров хранения информации, четыре регистра dataind1,2,3,4 соответствующие четырем индикаторам. Очистка равнозначна выключению индикаторов, так как в подпрограмме обработки прерываний, содержимое этих регистров передается в регистр PORTB, к которому подключены аноды индикаторов. Это необходимо для того чтобы на индикаторах не высвечивался всякий мусор после разрешения прерываний, в принципе этого можно и не делать, если сразу записывать правильную информацию для вывода. Далее сбрасываем флаг прерывания по переполнению таймера, разрешаем прерывания по переполнению TMR0, и наконец, разрешаем глобальные прерывания.

В подпрограмме обработки прерываний, первым делом выключаем все индикаторы (подав низкие логические уровни на базы транзисторов), потому что неизвестно какой из них включен. Производим инкремент регистра shet, с проверкой на равенство числу 5, при наличии такого совпадения записываем в регистр число 1, так как необходимо вести счет от 1 до 4. Далее проверяем, какое именно число лежит в регистре shet, по которому загружаем в PORTB данные из регистров хранения информации (dataind) для соответствующего индикатора и включаем его. После чего сбрасываем флаг прерывания по переполнению TMR0, записываем число 100 в таймер (ниже приведен расчет этого значения), для временной задержки и выходим из обработчика прерываний. При первом прерывании включается первый индикатор, во втором прерывании второй и так по круговому циклу. В основной программе остается только загружать данные в регистры хранения информации для каждого индикатора. В подпрограмме прерываний не забываем сохранять и восстанавливать значения ключевых регистров, об этом я писал в статье про .

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

Частоту тактового генератора примем за 4 МГц, машинный цикл 1 мкс. Частота обновления каждого индикатора пускай составит 100 Гц (период T=10 мс), соответственно необходимая временная задержка равна 10/4 = 2,5 мс. Коэффициент предделителя для TMR0 устанавливаем равным 1:16, при этом максимально возможная задержка равна 256х16 = 4096 мкс, а нам требуется пауза в 2,5 мс. Рассчитаем число для записи в TMR0: 256-((256х2,5)/4,096) = 256-156,25 = 99,75. После округления получим число 100.

Ниже можно скачать модель для программы Proteus, прошивку и исходник с реализацией динамической индикации на 4-х разрядный индикатор с общим катодом с применением микроконтроллера PIC16F628A. Для примера на индикатор выводятся числа 0000; 0001; 0002; 13,52; 9764.

Теперь рассмотрим подключение матрицы с разрешением 8х8 точек (светодиодов). Структуру матрицы обычно рассматривают в виде строк и столбцов. На картинке ниже в каждом столбце соединены катоды всех светодиодов, а в каждой строке аноды. Строки (8 линий, аноды светодиодов) через резисторы подключают к микроконтроллеру. Каждый столбец (катоды светодиодов) подключают к микроконтроллеру через 8 транзисторов. Алгоритм индикации такой же, сначала устанавливаем необходимые логические уровни на строках, в соответствии с тем, какие светодиоды должны гореть в столбце, далее подключаем первый столбец (индикация слева направо). Через определенную паузу выключаем столбец, и изменяем логические уровни на строках для отображения второго столбца, далее подключаем второй столбец. И так поочередно коммутируем все столбцы. Ниже представлена схема подключения матрицы к микроконтроллеру.


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

Самым распространенным последовательным регистром является микросхема 74НС595, которая содержит в себе сдвиговый регистр для загрузки данных, и регистр хранения через который данные передаются на выходные линии. Загружать данные в него просто, устанавливаем логический 0 на входе тактирования SH_CP, далее устанавливаем требуемый логический уровень на входе данных DS, после чего переключаем вход тактирования в 1, при этом происходит сохранение значения уровня (на входе DS) внутри сдвигового регистра. Одновременно с этим происходит сдвиг данных на один разряд. Снова сбрасываем вывод SH_CP в 0, устанавливаем требуемый уровень на входе DS и поднимаем SH_CP в 1. После полной загрузки сдвигового регистра (8 бит), устанавливаем в 1 вывод ST_CP, в этот момент данные передаются в регистр хранения и поступают на выходные линии Q0…Q7, после чего сбрасываем вывод ST_CP. Во время последовательной загрузки, данные сдвигаются от Q0 до Q7. Вывод Q7’ подключен к последнему разряду сдвигового регистра, этот вывод можно подключить на вход второй микросхемы, таким образом можно загружать данные сразу в две и более микросхемы. Вывод OE переключает выходные линии в третье (высокоомное) состояние, при подаче на него логической 1. Вывод MR предназначен для сброса сдвигового регистра, то есть установка низких логических уровней на выходах триггеров регистра, что эквивалентно загрузке восьми нулей. Ниже представлена диаграмма загрузки данных в микросхему 74НС595, установка значения 11010001 на выходных линиях Q0…Q7, при условии, что изначально там были нули:


Рассмотрим подключение матрицы 8×8 к микроконтроллеру PIC16F628A с помощью двух сдвиговых регистров 74HC595, схема представлена ниже:


Данные загружаются в микросхему DD2 (управление логическими уровнями на строках, аноды светодиодов) затем через вывод Q7’ передаются в DD3 (управление столбцами), соответственно сначала загружаем байт для включения столбца, затем байт с логическими уровнями на строках. К выходным линиям DD3 подключены транзисторы коммутирующие столбцы матрицы (катоды светодиодов). Ниже приведен код программы для вывода изображения на матрицу:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Реализация динамической индикации для матрицы с разрешением 8х8 ;Частота тактового генератора для примера 4 МГц, машинный цикл 1 мкс org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма обработки прерываний org 0004h ;начать выполнение подпрограммы с адреса 0004h movwf W_TEMP ;сохранение значений ключевых регистров swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; movwf FSR_osn ;в регистр FSR_osn movf FSR_prer,W ;восстановление ранее сохраненного значения movwf FSR ;регистра FSR из регистра FSR_prer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;загрузка содержимого регистра stolb в микросхему movf stolb,W ;копирование содержимого регистра stolb movwf var ;в регистр var met2 btfsc var,0 ;устанавливаем вывод ds в соответствии с btfss var,0 ; bcf ds ; bcf sh_cp ; rrf var,F ;сдвиг регистра var вправо, для подготовки;следующего бита goto met2 ;scetbit не равен нулю: переход на метку met2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;загрузка содержимого регистра INDF в микросхему;74HC595 (последовательный сдвиговый регистр) movf INDF,W ;копирование содержимого регистра INDF movwf var ;в регистр var movlw .8 ;запись числа 8 в регистр scetbit, для отсчета movwf scetbit ;переданных битов met1 btfsc var,7 ;устанавливаем вывод ds в соответствии с bsf ds ;значением 7-го бита регистра var btfss var,7 ; bcf ds ; bsf sh_cp ;тактируем вывод sh_cp, для защелкивания данных bcf sh_cp ; rlf var,F ;сдвиг регистра var влево, для подготовки;следующего бита decfsz scetbit,F ;декремент с условием регистра scetbit goto met1 ;scetbit не равен нулю: переход на метку met1 ; bsf st_cp ;тактируем вывод st_cp, для передачи загруженных bcf st_cp ;байтов на выходные линии микросхем 74HC595 ; bcf STATUS,C ;сброс бита C регистра статус перед сдвигом rrf stolb,F ;сдвиг влево регистра stolb ; incf FSR,F ;инкремент регистра FSR, подготовка следующего;регистра для отправки данных на 74HC595 decfsz shet,F ;декремент с условием регистра shet goto exxit ;регистр shet не равен 0: переход на exxit movlw data1 ;регистр shet равен 0: запись адреса первого movwf FSR ;регистра хранения иннформации в регистр FSR movlw .8 ;запись числа 8 в регистр shet, для ведения movwf shet ;счета столбцов ; exxit bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 movlw .124 ;запись числа 124 в регистр таймера TMR0 movwf TMR0 ; ; movf FSR,W ;сохранение текущего значения регистра FSR movwf FSR_prer ;в регистр FSR_prer movf FSR_osn ,W ;восстановление ранее сохраненного значения movwf FSR ;регистра FSR из регистра FSR_osn ; swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; retfie ;выход из подпрограммы прерывания;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start ................. ;первоначальная настройка регистров................. ;специального назначения................. bsf STATUS,RP0 ;запись двоичного числа 11010011 в регистр movlw b"11010010" ;OPTION_REG, тем самым устанавливаем внутренний movwf OPTION_REG ;источник тактового сигнала для TMR0 bcf STATUS,RP0 ;включаем предделитель перед TMR0 ;устанавливаем коэффициент предделителя 1:8 ; movlw .8 ;запись числа 8 в регистр shet, перед запуском movwf shet ;прерываний по переполнению TMR0, выполняется;однократно, после включения питания movlw b"10000000" ;запись двоичного числа 10000000 в movwf stolb ;регистр stolb, для включения 1-го столбца;выполняется однократно, после включения питания; movlw data1 ;запись адреса первого регистра (регистры хранения movwf FSR_prer ;информации) в регистр FSR_prer, выполняется;однократно, после включения питания; movlw .8 ;очистка 8-ми регистров вывода информации на movwf tmp ;матрицу, равнозначно выключению movlw data1 ;матрицы movwf FSR ; met3 clrf INDF ; incf FSR,F ; decfsz tmp,F ; goto met3 ; ; bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0 bsf INTCON,GIE ;разрешение глобальных прерываний; m1 movlw data1 ;пример вывода буквы R movwf FSR ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"01111111" ; movwf INDF ; incf FSR,F ; movlw b"00001001" ; movwf INDF ; incf FSR,F ; movlw b"00011001" ; movwf INDF ; incf FSR,F ; movlw b"00101001" ; movwf INDF ; incf FSR,F ; movlw b"01000110" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; ; ................. ; ................. ; ................. ; ; end ;конец всей программы;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Реализация динамической индикации для матрицы с разрешением 8х8

;Частота тактового генератора для примера 4 МГц, машинный цикл 1 мкс

org 0000h ;начать выполнение программы с адреса 0000h

goto Start ;переход на метку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма обработки прерываний

org 0004h ;начать выполнение подпрограммы с адреса 0004h

movwf W_TEMP ;сохранение значений ключевых регистров

swapf STATUS,W ;

movwf STATUS_TEMP ;

movf FSR,W ;сохранение текущего значения регистра FSR

movwf FSR_osn ;в регистр FSR_osn

movf FSR_prer,W ;восстановление ранее сохраненного значения

movwf FSR ;регистра FSR из регистра FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (последовательный сдвиговый регистр)

movf stolb,W ;копирование содержимого регистра stolb

movwf var ;в регистр var

movlw .8 ;запись числа 8 в регистр scetbit, для отсчета

movwf scetbit ;переданных битов

met2 btfsc var,0 ;устанавливаем вывод ds в соответствии с

bsf ds ;значением 7-го бита регистра var

bsf sh_cp ;тактируем вывод sh_cp, для защелкивания данных

rrf var,F ;сдвиг регистра var вправо, для подготовки

;следующего бита

decfsz scetbit,F ;декремент с условием регистра scetbit

goto met2 ;scetbit не равен нулю: переход на метку met2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (последовательный сдвиговый регистр)

movf INDF,W ;копирование содержимого регистра INDF

movwf var ;в регистр var

movlw .8 ;запись числа 8 в регистр scetbit, для отсчета

movwf scetbit ;переданных битов

met1 btfsc var,7 ;устанавливаем вывод ds в соответствии с

bsf ds ;значением 7-го бита регистра var

bsf sh_cp ;тактируем вывод sh_cp, для защелкивания данных

rlf var,F ;сдвиг регистра var влево, для подготовки

;следующего бита

decfsz scetbit,F ;декремент с условием регистра scetbit

goto met1 ;scetbit не равен нулю: переход на метку met1

bsf st_cp ;тактируем вывод st_cp, для передачи загруженных

bcf st_cp ;байтов на выходные линии микросхем 74HC595

bcf STATUS,C ;сброс бита C регистра статус перед сдвигом

rrf stolb,F ;сдвиг влево регистра stolb

incf FSR,F ;инкремент регистра FSR, подготовка следующего

;регистра для отправки данных на 74HC595

decfsz shet,F ;декремент с условием регистра shet

goto exxit ;регистр shet не равен 0: переход на exxit

movlw data1 ;регистр shet равен 0: запись адреса первого

movwf FSR ;регистра хранения иннформации в регистр FSR

movlw .8 ;запись числа 8 в регистр shet, для ведения

movwf shet ;счета столбцов

movlw b"10000000" ;запись двоичного числа 10000000 в

movwf stolb ;регистр stolb, для включения 1-го столбца

exxit bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0

movlw .124 ;запись числа 124 в регистр таймера TMR0

movf FSR,W ;сохранение текущего значения регистра FSR

movwf FSR_prer ;в регистр FSR_prer

movf FSR_osn ,W ;восстановление ранее сохраненного значения

movwf FSR ;регистра FSR из регистра FSR_osn

swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;выход из подпрограммы прерывания

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

Start ................. ;первоначальная настройка регистров

................. ;специального назначения

.................

bsf STATUS,RP0 ;запись двоичного числа 11010011 в регистр

movlw b"11010010" ;OPTION_REG, тем самым устанавливаем внутренний

movwf OPTION_REG ;источник тактового сигнала для TMR0

bcf STATUS,RP0 ;включаем предделитель перед TMR0

;устанавливаем коэффициент предделителя 1:8

movlw .8 ;запись числа 8 в регистр shet, перед запуском

movwf shet ;прерываний по переполнению TMR0, выполняется

;однократно, после включения питания

movlw b"10000000" ;запись двоичного числа 10000000 в

movwf stolb ;регистр stolb, для включения 1-го столбца

Информация с логическими уровнями для строк каждого столбца, хранится в 8-ми регистрах хранения информации, обращение к которым выполняется через . Адресу первого регистра присвоено название data1. Кроме первоначальной записи регистров shet и stolb, необходимо записать в регистр FSR_prer адрес первого регистра хранения информации (регистр – data1, запись в FSR_prer выполняется однократно, далее корректируется в обработчике), только после этого разрешать прерывания по переполнению TMR0.

Перед разрешением прерываний, желательно очистить регистры хранения информации, данная операция производится с помощью дополнительного регистра tmp (в качестве счетчика) и косвенной адресации, очистка равнозначна выключению матрицы.

В подпрограмме обработки прерываний загружаем в микросхему DD2 содержимое регистра stolb (при первом входе в обработчик после разрешения прерываний, в регистре лежит число 10000000, как было сказано выше). Загрузка начинается с младшего бита регистра stolb, который сдвигается в направлении от Q0 к Q7 (внутри микросхемы DD2) по мере загрузки, алгоритм загрузки был рассмотрен выше, так что думаю, разобраться в коде не составит труда. Далее загружаем в DD2 содержимое регистра INDF, это один из регистров хранения информации, адрес которого находится в FSR (при первом входе в обработчик после разрешения прерываний в FSR лежит адрес первого регистра хранения информации с названием data1). Загрузка начинается со старшего бита регистра INDF. После загрузки рассмотренных 2-х байтов, тактируем вывод st_cp, тем самым загруженные данные передаются на выходные линии микросхем DD2, DD3. Таким образом, при первом входе в обработчик коммутируется первый столбец матрицы, в котором загораются светодиоды, на анодах которых присутствует высокий логический уровень, в соответствии с содержимым регистра data1 (первый регистр хранения информации).

Далее сдвигаем регистр stolb вправо на один бит, для того чтобы подготовить к коммутации второй столбец матрицы при следующем входе в обработчик прерываний. Перед сдвигом необходимо очистить флаг C регистра STATUS, так как сдвиг происходит через этот флаг, и его состояние не известно на момент сдвига. После сдвига, инкрементируем регистр FSR, подготавливая следующий регистр хранения информации (после регистра data1) с логическими уровнями строк для второго столбца. Далее декрементируем с условием регистр shet, и если он не равен нулю, сбрасываем флаг прерывания по переполнению TMR0, производим запись числа в таймер, и выходим из обработчика прерываний.

При следующем входе в обработчик включится второй столбец матрицы и так далее. При обнулении регистра shet (после коммутации 8-го столбца), в него записывается число 8 для очередного цикла коммутации столбов, кроме этого корректируется значение регистра stolb, в регистр FSR записывается адрес первого регистра хранения информации (data1).

Выполним расчет временной задержки для таймера TMR0, частота тактового генератора 4 МГц, машинный цикл 1 мкс. Чтобы избежать мерцания светодиодов, примем частоту обновления каждого столбца в 100Гц (период T=10 мс), временная задержка равна 10/8 = 1,25 мс. Коэффициент предделителя TMR0 установим равным 1:8, при этом максимально возможная задержка равна 256х8 = 2048 мкс. Для паузы в 1,25 мс таймер должен отсчитать (256х1,25)/2,048 = 156,25 раз, округляя получим 156 отсчетов. Соответственно в таймер необходимо записать число 256-156 = 100. Но это не совсем правильное значение, так как на выполнение подпрограммы обработки прерываний затрачивается некоторое время, в данном случае на это уходит около 190 мкс, в перерасчете с учетом коэффициента предделителя получаем 190/8 = 23,75 или 24 отсчета. Правильное значение для записи в TMR0 равно: 100+24=124.

В основной программе записываем 8 регистров хранения информации, в соответствии с тем, что хотим вывести на матрицу. Ниже представлена схема поясняющая вывод информации на матрицу для вышерассмотренного кода.


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

Ниже по ссылке можно скачать прошивку и исходник для микроконтроллера PIC16F628A, с реализацией динамической индикации на матрице 8х8 с применением двух сдвиговых регистров 74HC595, схема подключения была рассмотрена выше. На матрицу поочередно выводятся буквы R, L, цифра 46, смайлик, и просто узор в виде креста, эта анимация продемонстрирована в видеоролике ниже.

с метками , . Читать .

Начнём с типов соединения матрицы, их всего два: последовательный и параллельный, + совмещённый вариант по питанию. Плюсы и минусы указаны на рисунке, для больших матриц предпочтительнее использовать параллельный тип, так гораздо лучше организуется питание. Но вот с ответвлениями силовых проводов придётся повозиться. Если делать матрицу из гирлянды модулей, то естественно проще сделать её зигзагом. Но обязательно проверить на разной яркости и убедиться, что тока хватает дальним светодиодам (при просадке напряжения заданный белый цвет уходит в желтизну (небольшая просадка) или в красный (сильная просадка напряжения). В этом случае питание нужно будет продублировать толстыми проводами к каждому отрезку ленты (к каждой строке матрицы).

Матрица подключается к Arduino согласно , далее идёт выжимка из него. Важные моменты:

  • Логический пин Arduino соединён с пином DIN ленты (матрицы) через резистор с номиналом 220 Ом (можно брать любой в диапазоне 100 Ом – 1 кОм). Нужен для защиты пина Ардуино от перегрузки, т.е. ограничить ток в цепи (см. закон Ома);

  • GND (земля, минус) ленты обязательно соединяется с пином GND Arduino даже при раздельном питании;

  • Электролитический конденсатор по питанию Arduino нужен для фильтрации резких перепадов напряжения, которые создаёт лента при смене цветов. Напряжение конденсатора от 6.3V (чем больше, тем крупнее и дороже кондер), ёмкость – в районе 470 мкФ, можно больше, меньше не рекомендуется. Можно вообще без него, но есть риск нарушения стабильности работы!

  • Конденсатор по питанию ленты нужен для облегчения работы блока питания при резких изменениях яркости матрицы. Опять же можно вообще без него, но есть риск нарушения стабильности работы!

  • Мощность (и максимальный отдаваемый ток) блока питания выбирается исходя из размера матрицы и режимов, в которых она будет работать. Смотрите табличку и помните о китайских амперах , т.е. блок питания нужно брать с запасом по току на 10-20%! В таблице приведены значения тока потребления ленты.

  • В прошивке GyverMatrixOS версии 1.2 и выше настраивается ограничение тока системы. Как это работает: в настройках скетча есть параметр CURRENT_LIMIT , который задаёт максимальный ток потребления матрицы в миллиамперах. Ардуино будет делать расчёт на основе цветов и яркостей светодиодов и автоматически уменьшать яркость всей матрицы, чтобы не допустить превышения установленного лимита по току на особо “жрущих” режимах. Это очень крутая функция!

СБОРКА КОРПУСА И РАССЕИВАТЕЛЯ

ПРОШИВКА И НАСТРОЙКИ

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

Данный тип инициализации матрицы позволяет подключать матрицу любой конфигурации с любым положением начала матрицы. Это удобно для покупных матриц, которые можно только “крутить”, так и для самодельных, когда есть какие-то особенности корпуса или укладки проводов. То есть как бы вы ни сделали и не расположили матрицу, она всё равно будет работать с корректным положением начала координат. Кстати, можно очень легко “отзеркалить” матрицу по горизонтали или вертикали, если это зачем-то вдруг нужно: просто меняете подключение на “противоположное” по желаемой оси. Например хотим отзеркалить тип подключения (1, 0) по вертикали. Настраиваем его как (2, 2) – смотрите рисунок выше. Хотим отзеркалить тип (3, 1) по вертикали – настраиваем его как (2, 3). Тип (3, 2) по горизонтали? Пожалуйста, ставим его как (2, 2). Надеюсь логика понятна.

Если вы впервые работаете с Arduino, то остановитесь и изучите . После установки драйверов и библиотек можно переходить к прошивке платформы. У меня есть готовый проект с играми и эффектами, переходите за подробностями и прошивками. Дальше будет информация для разработчиков, то есть тех, кто хочет написать что-то для матрицы самостоятельно!

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

// **************** НАСТРОЙКИ МАТРИЦЫ **************** #define LED_PIN 6 // пин ленты #define BRIGHTNESS 60 // стандартная маскимальная яркость (0-255) #define WIDTH 16 // ширина матрицы #define HEIGHT 16 // высота матрицы #define MATRIX_TYPE 0 // тип матрицы: 0 - зигзаг, 1 - последовательная #define CONNECTION_ANGLE 0 // угол подключения: 0 - левый нижний, 1 - левый верхний, 2 - правый верхний, 3 - правый нижний #define STRIP_DIRECTION 0 // направление ленты из угла: 0 - вправо, 1 - вверх, 2 - влево, 3 - вниз

Также в прошивке содержится вкладка utility_funx , в которой как раз сидят все функции по работе с матрицей:

Void loadImage(название массива битмап); // отобразить картинку из массива "название массива". По картинкам читайте ниже void drawDigit3x5(byte digit, byte X, byte Y, uint32_t color); // нарисовать цифру (цифра, коорд. Х, коорд. У, цвет) void drawDots(byte X, byte Y, uint32_t color); // нарисовать точки для часов (коорд. Х, коорд. У, цвет) void drawClock(byte hrs, byte mins, boolean dots, byte X, byte Y, uint32_t color1, uint32_t color2); // нарисовать часы (часы, минуты, точки вкл/выкл, коорд. Х, коорд. У, цвет1, цвет2) static uint32_t expandColor(uint16_t color); // преобразовать цвет из 16 битного в 24 битный uint32_t gammaCorrection(uint32_t color); // гамма-коррекция (преобразует цвет более натуральный цвет) void fillAll(uint32_t color); // залить всю матрицу цветом void drawPixelXY(byte x, byte y, uint32_t color); // функция отрисовки точки по координатам X Y (коорд. Х, коорд. У, цвет) uint32_t getPixColor(int thisPixel); // функция получения цвета пикселя по его номеру uint32_t getPixColorXY(byte x, byte y); // функция получения цвета пикселя в матрице по его координатам (коорд. Х, коорд. У) uint16_t getPixelNumber(byte x, byte y); // получить номер пикселя в ленте по координатам (коорд. Х, коорд. У, цвет)

Начало координат матрицы – левый нижний угол, имеет нулевые координаты!

Пользуясь этими функциями можно создавать различные эффекты разной степени сложности, а также классические игры!

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

Ну, и чего же вы ждете? Берите светодиоды и паяльник, потому, что мы сейчас вместе будет делать светодиодную матрицу 24х6!

Шаг 1: Сбор всего необходимого

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

Для изготовления матрицы необходимо:
1. 144 светодиода
2. 24 резистора (номинал определяется по типу светодиодов, в моем случае 91 Ом)
3. Десятичный счетчик 4017
4. 6 резисторов номиналом 1 кОм
5. 6 транзисторов 2N3904
6. Длинная макетная плата
7. Arduino
8. 3 x 74HC595 регистра сдвига
10. Несколько штыревых разъемов

Шаг 2: Как это работает?

Идея работы светодиодной матрицы заключается в следующем: обычно информация разбивается на небольшие части, которые затем передаются одна за другой. Таким способом вы может сэкономить множество выводов на Arduino и сделать вашу программу достаточно простой.

Теперь пришло время задействовать 3 сдвиговых регистра, которые умножают несколько выходов и позволяют сэкономить множество выводов arduino.

Каждый сдвиговый регистр имеет 8 выходов и вам нужно только 3 вывода arduino для контроля почти неограниченного числа сдвиговых регистров.

Мы также будем использовать десятичный счетчик 4017 для сканирования рядов. С помощью него можно сканировать до 10 рядов, поскольку у вас есть только 10 выходов, однако для контроля их необходимо всего лишь 2 вывода.

4017 - это очень полезная микросхема. Ознакомиться с ее работой можно по сноске

Как я сказал ранее, сканирование выполняется с помощью десятичного счетчика 4017, посредством подсоединения одного ряда к земле за один раз и пересылки данных через сдвиговые резисторы в колонки.

Шаг 3: Схемное решение

Единственными элементами, которые я не указал на схеме, являются резисторы ограничения тока, поскольку их номинал зависит от типа используемых светодиодов. Поэтому их величину вам необходимо вычислить самостоятельно.

Для расчета величин 24 резисторов перейдите по следующей ссылке: .

Сначала необходимо посмотреть спецификацию светодиодов, чтобы узнать прямое напряжение и прямой ток. Эту информацию можно узнать у продавца. Схема работает от напряжения 5В. Следовательно, вам необходим источник питания напряжением 5В.

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

Шаг 4: Пайка светодиодов

Пайка 144 светодиодов для создания матрицы может оказать трудной задачей, если вы не знаете наверняка, как это сделать.

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

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

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

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

Шаг 5: Программирование матрицы

Вот мы и подошли к последнему этапу нашего проекта – программированию матрицы.

До этого я уже написал две программы, которые имеют много общего.

Я добавил программу, которая получает слово или предложение от последовательного монитора IDE arduino и отображает его на матрице. Код программы достаточно простой и не претендует на лучший в мире, но он действительно работает. Вы можете написать свой код или изменить мой на свое усмотрение.

Я приложил файл в формате excel, чтобы вы смогли создать свои собственные знаки и символы.

Вот как это работает:

Создайте требуемый символ пиксель за пикселем (не беспокойтесь, это очень легко) и скопируйте выходную строку следующим образом - #define {OUTPUT LINE}

В дальнейшем я планирую добавить код для анимации, когда у меня появится больше времени.

Шаг 6: Устройство готово!

Поздравляю! Вы самостоятельно сделали матрицу a 24x6 и теперь можете оперативно выводить на нее все, что вам нужно.

Теперь вы можете протестировать матрицу, придумать новые программы или улучшить интерфейс.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino

Arduino Uno

1 В блокнот
U1-U3 Сдвиговый регистр

CD74HC595

3 В блокнот
U4 Специальная логика

CD4017B

1 K561ИЕ8 В блокнот
Q1-Q6 Биполярный транзистор

2N3904

6 В блокнот
Резистор