Светодиодная матрица своими руками. Динамическая индикация

Время незаметно идет и казалось бы недавно купленная техника уже выходит из строя. Так, отработав свои 10000 часов, приказали долго жить лампы моего монитора (AOC 2216Sa). Вначале подсветка стала включаться не с первого раза (после включения монитора подсветка выключалась через несколько секунд), что решалось повторным включением/выключением монитора, со временем монитор приходилось выключать/выключать уже 3 раза, потом 5, потом 10 и в какой-то момент он не мог включить подсветку уже вне зависимости от числа попыток включения. Извлеченные на свет божий лампы оказались с почерневшими краями и законно отправились в утиль. Попытка поставить лампы на замену (были куплены новые лампы подходящего размера) успехом не увенчалась (несколько раз монитор смог включить подсветку, но быстро опять ушел в режим включился-выключился) и выяснение причин в чем может быть проблема уже в электронике монитора привели меня к мысли о том что проще будет собрать собственную подсветку монитора на светодиодах чем ремонтировать имеющуюся схему инвертора для CCFL ламп, тем более в сети уже попадались статьи показывающие принципиальную возможность такой замены.

Разбираем монитор

На тему разборки монитора уже написано немало статей, все мониторы очень похожи между собой, поэтому вкратце:
1. Откручиваем крепление поставки монитора и единственный болтик внизу, который придерживает заднюю стенку корпуса


2. В низу корпуса есть два пазика между передней и задней частью корпуса, в один из которых засовываем плоскую отвертку и начинаем снимать крышку с защелок по всему периметру монитора (просто проворачивая аккуратно отвертку вокруг своей оси и приподнимая этим крышку корпуса). Излишних усилий прилагать не надо, но тяжело снимается с защелок корпус только первый раз (за время ремонта я его открывал много раз, поэтому защелки стали сниматься со временем гораздо легче).
3. Нам открывается вид на монтаж внутренней металлической рамы в передней части корпуса:


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


5. Теперь необходимо разобрать «сендвич» содержащий саму матрицу и подсветку:


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


И блок с подсветкой отдельно:


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

Подсветка светодиодной лентой

Вначале решено было делать подсветку из светодиодной ленты с белыми светодиодами 3528 - 120 светодиодов на метр. Первое что оказалось - ширина ленты 9 мм, а ширина ламп подсветки (и посадочного места под ленту) - 7 мм (на самом деле бывают лампы подсветки двух стандартов - 9 мм и 7 мм, но в моем случае были 7 мм). Поэтому, после осмотра ленты, было принято решение обрезать по 1 мм с каждого края ленты, т.к. это не задевало токопроводящих дорожек на лицевой части ленты (а на обратной вдоль всей ленты идут две широкие жилы питания, которые от уменьшения на 1 мм своих свойств на длине подсветки 475 мм не потеряют, т.к. ток будет небольшой). Сказано - сделано:


Точно так же аккуратно светодиодная лента обрезается по всей длине (на фотографии пример того что было до и что стало после обрезки).
Нам понадобится две полоски ленты по 475 мм (19 сегментов по 3 светодиода в полоске).
Хотелось чтобы подсветка монитора работала так же как и штатная (т.е. включалась и выключалась контроллером монитора), а вот яркость я хотел регулировать «вручную», как на старых CRT мониторах, т.к. это часто используемая функция и лазить по экранным меню каждый раз нажимая несколько клавиш мне надоело (в моем мониторе клавиши вправо-влево регулируют не режимы монитора, а громкость встроенных динамиков, так что режимы каждый раз приходилось менять через меню). Для этого был найден в сети мануал на мой монитор (кому пригодится - прилагается в конце статьи) и на странице с Power Board по схеме найдены +12V, On, Dim и GND которые нас интересуют.


On - сигнал с платы управления на включение подсветки (+5V)
Dim - ШИМ управление яркостью подсветки
+12V оказались далеко не 12, а где-то 16V без нагрузки подсветкой и где-то 13.67V с под нагрузкой
Так же было решено никаких ШИМ регулировок яркости подсветки не делать, а запитывать подсветку постоянным током (заодно решается вопрос с тем, что у некоторых мониторов ШИМ подсветки работает на не очень высокой частоте и у некоторых от этого чуть больше устают глаза). В моем мониторе частота «родного» ШИМ была 240 Гц.
Дальше на плате были найдены контакты на которые подается сигнал On (помечен красным) и +12V на блок инвертора (перемычка которую необходимо выпаять чтобы обесточить блок инвертора помечена зеленым). (фотографию можно увеличить чтобы увидеть пометки):


В качестве основы схемы управления был взять линейный регулятор LM2941 в основном за то, что при токе до 1А он имел отдельный вывод управления On/Off, который предполагалось использовать для управления включением/выключением подсветки сигналом On с платы управления монитора. Правда в LM2941 этот сигнал инвертированный (т.е. на выходе есть напряжение когда на входе On/Off - нулевой потенциал), так что пришлось собрать инвертор на одном транзисторе для согласования прямого сигнала On с платы управления и инвертированного входа LM2941. Никаких других излишеств схема не содержит:


Расчет выходного напряжения для LM2941 производится по формуле:

Vout = Vref * (R1+R2)/R1

Где Vref = 1.275V, R1 в формуле соответствует R1 на схеме, а R2 в формуле соответствует паре резисторов RV1+RV2 на схеме (введено два резистора для более плавной регулировки яркости и сокращения диапазона регулируемых переменным резистором RV1 напряжений).
В качестве R1 я взял 1кОм, а подбор R2 осуществляется по формуле:

R2=R1*(Vout/Vref-1)

Максимальное необходимое нам напряжение для ленты - 13В (я взял четь больше чем номинальные 12В чтобы не терять в яркости, а лента такой легкое перенапряжение переживет). Т.е. максимальное значение R2 = 1000*(13/1.275-1) = 9.91кОм. Минимальное напряжение при котором лента еще хоть как-то светится - около 7 вольт, т.е. минимальное значение R2 = 1000*(7/1.275-1) = 4.49кОм. R2 у нас состоит из переменного резистора RV1 и многооборотного подстроечного резистора RV2. Сопротивление RV1 получаем 9.91кОм - 4.49кОм = 5.42кОм (выбираем ближайшее значение RV1 - 5.1кОм), а RV2 выставляем примерно в 9.91-5.1 = 4.81кОм (на самом деле лучше всего вначале собрать схему, выставить максимальное сопротивление RV1 и измеряя напряжение на выходе LM2941 выставить сопротивление RV2 таким чтобы на выходе было нужное максимальное напряжение (в нашем случае около 13В).

Монтаж светодиодной ленты

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


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


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




Питание и сигнал управления On заводились с платы блока питания:


Расчетная мощность, выделяемая на LM2941 рассчитывается по формуле:

Pd = (Vin-Vout)*Iout +Vin*Ignd

Для моего случая составляет Pd = (13.6-13)*0.7 +13.6*0.006 = 0.5 Ватт поэтому было решено обойтись самым маленьким радиатором для LM2941 (посажен через диэлектрическую прокладку т.к. от земли он в LM2941 не изолирован).
Окончательная сборка показала вполне себе работоспособность конструкции:


Из достоинств:

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

Регулировка яркости с помощью ШИМ

Для тех хаброжителей, которые в отличие от меня не вспоминают с ностальгией аналоговые ручки управления яркостью и контрастностью на старых ЭЛТ мониторах можно сделать управление от штатного ШИМ генерируемого платой управления монитором без выведения каких-либо дополнительных органов управления наружу (без сверления корпуса монитора). Для этого достаточно собрать на двух транзисторах схему И-НЕ на входе On/Off регулятора и убрать регулировку яркости на выходе (выставить выходное напряжение постоянным в 12-13В). Модифицированная схема:


Сопротивление подстроечного резистора RV2 для напряжения 13В должно быть в районе 9.9кОм (но лучше выставить точно при включенном регуляторе)

Более плотная LED подсветка

Для решения проблемы недостаточной яркости (а заодно и равномерности) подсветки было решено поставить больше светодиодов и чаще. Поскольку оказалось что покупать светодиоды поштучно дороже чем купить 1.5 метра ленты и выпаять их оттуда был выбран более экономный вариант (выпаивать светодиоды из ленты).
Сами светодиоды 3528 разместились на 4-х полосках 6 мм шириной и 238 мм длиной по 3 светодиода последовательно в 15 параллельных сборках на каждой из 4-х полосок (разводка плат для светодиодов прилагается). После припайки светодиодов и проводов получается следующее:




Полоски закладывается по две вверху и внизу проводами к краю монитора в стык в центре:




Номинальное напряжение на светодиодах 3.5В (диапазон от 3.2 до 3.8 В), так что сборка из 3-х последовательных светодиодов должна питаться напряжением порядка 10.5В. Так что параметры регулятора нужно пересчитать:


Максимальное необходимое нам напряжение для ленты - 10.5В. Т.е. максимальное значение R2 = 1000*(10.5/1.275-1) = 7.23кОм. Минимальное напряжение при котором сборка из светодиодов еще хоть как-то светится - около 4.5 вольт, т.е. минимальное значение R2 = 1000*(4.5/1.275-1) = 2.53кОм. R2 у нас состоит из переменного резистора RV1 и многооборотного подстроечного резистора RV2. Сопротивление RV1 получаем 7.23кОм - 2.53кОм = 4.7кОм, а RV2 выставляем примерно в 7.23-4.7 = 2.53 кОм и регулируем в собранной схеме для получения 10.5В на выходе LM2941 при максимальном сопротивлении RV1.
В полтора раза больше светодиодов потребляют 1.2А тока (номинально), поэтому рассеиваемая мощность на LM2941 будет равна Pd = (13.6-10.5)*1.2 +13.6*0.006 = 3.8 Ватт, что уже требует более солидного радиатора для отвода тепла:


Собираем, подключаем, получаем гораздо лучше:


Достоинства:
  • Достаточно большая яркость (возможно сравнимая, а возможно даже превосходящая яркость старой CCTL подсвтеки)
  • Отсутствие световых конусов по краям монитора от индивидуальных светодиодов (светодиоды расположены достаточно часто и подсветка равномерная)
  • Все еще простая и дешевая плата управления
Недостатки:
  • Никак не решился вопрос с балансом белого, уходящим в зеленоватые тона
  • LM2941 хоть и с большим радиатором, но греется и греет все внутри корпуса

Плата управления на основе Step-down регулятора

Для устранения проблемы нагрева решено было собрать регулятор яркости на базе Step-down регулятора напряжения (в моем случае был выбран LM2576 с током до 3А). Он так же имеет инвертированный вход управления On/Off, поэтому для согласования присутствует такой же инвертор на одном транзисторе:


Катушка L1 влияет на КПД преобразователя и должна быть 100-220 мкГ для тока в нагрузке около 1.2-3А. Напряжение на выходе рассчитывается по формуле:

Vout=Vref*(1+R2/R1)

Где Vref = 1.23V. При заданном R1 можно получить R2 по формуле:

R2=R1*(Vout/Vref-1)

В расчетах R1 эквивалентно R4 в схеме, а R2 эквивалентно RV1+RV2 в схеме. В нашем случае для регулировки напряжения в диапазоне от 7.25В до 10.5В возьмем R4=1.8кОм, переменный резистор RV1=4.7кОм а подстроечный резистор RV2 на 10кОм с начальным приближением в 8.8кОм (после сборки схемы лучше всего выставить его точное значение измеряя напряжение на выходе LM2576 при максимальном сопротивлении RV1).
Для этого регулятора решил сделать плату (размеры значения не имели, т.к. в мониторе достаточно место для монтажа даже габаритной платы):


Плата управления в сборе:


После монтажа в мониторе:


Все в сборе:


После сборки вроде все работает:


Итоговый вариант:


Достоинства:

  • Достаточная яркость
  • Step-down регулятор не греется и не греет монитор
  • Нет ШИМ а значит ничего не моргает ни с какой частотой
  • Аналоговая (ручная) регулировка яркости
  • Нет ограничений на минимальную яркость (для тех кто любит работать по ночам)
Недостатки:
  • Немного смещен баланс белого в сторону зеленых тонов (но не сильно)
  • При малой яркости (очень малой) видна неравномерность в свечении светодиодов разных сборок из-за разброса параметров

Варианты улучшения:

  • Баланс белого регулируется как в настройках монитора, так и в настройках почти любой видеокарты
  • Можно попробовать поставить другие светодиоды, которые не будут заметно сбивать баланс белого
  • Для исключения неравномерного свечения светодиодов при малой яркости можно использовать: а) ШИМ (регулировать яркость с помощью ШИМ всегда подавая номинальное напряжение) или б) соединить все светодиоды последовательно и питать их регулируемым источником тока (если соединить последовательно все 180 светодиодов, то понадобится 630В и 20мА), тогда через все светодиоды должен проходить один и тот же ток, а на каждом будет падать свое напряжение, яркость регулируется изменением тока а не напряжения.
  • Если хочется сделать схему на основе ШИМ для LM2576 можно использовать схему И-НЕ на входе On/Off этого Step-down регулятора (по аналогии с приведенной схемой для LM2941), но лучше поставить диммер в разрыв минусового провода светодиодов через logic-level mosfet

По ссылке можно скачать:

  • AOC2216Sa Service Manual
  • LM2941 и LM2576 datasheets
  • Схемы регулятора на LM2941 в формате Proteus 7 и PDF
  • Разводка платы для светодиодов в формате Sprint Layout 5.0
  • Схема и разводка платы регулятора на LM2576 в формате Proteus 7 и PDF

Иногда требуется подключить к микроконтроллеру несколько семисегментных индикаторов или светодиодную матрицу, при этом для отображения информации используется динамическая индикация. Суть динамической индикации заключается в поочередном выводе информации на индикаторы. Ниже на схеме представлен пример соединения нескольких семисегментных индикаторов (для примера с общим катодом) для реализации динамической индикации, вообще с учетом точки получается 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, смайлик, и просто узор в виде креста, эта анимация продемонстрирована в видеоролике ниже.

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

Светодиоды все стремительнее занимает свое место среди источников освещения.
Низкое потребление электроэнергии, яркость позволили светодиодам вытеснить традиционные лампы накаливания и довольно уверенно соперничать с энергосберегающими.
Поддавшись общей тенденции, решил собственными руками пощупать и собственными глазами посмотреть на светодиодную матрицу, не требующую каких-то отдельных драйверов, а подключающихся непосредственно к сети 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

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

Матрица подключается к 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 В блокнот
Резистор