- Назначение и принцип работы,
- Разновидности и способы подключения,
- Примеры,
- Вывод,
- FAQ.
Назначение и принцип работы
Что такое светодиод, понятно всем - это небольшая экономичная “лампочка” которая светится, когда на нее подают напряжение и не светится, когда не подают. С помощью этого замечательного устройства можно не только освещать пространство вокруг, но и подавать сигналы, например, о том, какие системы работают, а какие отключены, извещать о неисправностях, отмечать активные кнопки и тумблеры и так далее. Если объединить несколько светодиодов в систему, появится возможность выдавать больше полезной информации, формируя из них наполненные смыслом фигуры и образы. Первым понятным примером такой системы светодиодов служит цифровой индикатор. Зажигая на нем определенные сегменты, мы получаем изображения любой цифры (и даже некоторых букв и символов). Разумеется, такие индикаторы, благодаря своей простоте и удобству, заслужили безграничную любовь электронщиков и широкое распространение в приборах всех мастей.Однако цифровые индикаторы, весьма ограничены в своих изобразительных возможностях и не дают развиваться прогрессу. Людям мало одних цифр, да и букв им недостаточно, подавай возможность рисовать что угодно! Попытка добавить черточек ситуацию спасла не сильно, а вот сложности подключения добавила изрядно. Потому, следующим логичным шагом стал отказ от сегментов и переход на пиксели, то есть черточки в заранее заданных местах заменили кружочками (или квадратиками), равномерно разбросанными по рабочему полю индикатора. Получившееся изделие можно смело назвать полноценной светодиодной матрицей, поскольку она имеет определенное количество равноценных столбцов и строк. Преимущество такого расположения элементов очевидно: нет ограничения на сложность картинки, в рамках разрешающей способности конкретной матрицы, разумеется, недостаток один: большее количество светодиодов, а значит более сложное подключение и большее количество ресурсов на поддержание. Но красота требует жертв.
Где можно приобрести?Светодиодные матрицы купить можно в нашем магазине 3DIY!
Разновидности и способы подключения
Все светодиодные матрицы в принципе работы одинаковы. Включая и выключая определенные светодиоды, мы формируем на матрице любую двухмерную картинку. Различия имеются лишь в характеристиках и техническом исполнении. Простейшие матрицы имеют количество элементов, исчисляемое несколькими десятками, например, особо популярны у DIY- мастеров матрицы 5х8 и 8х8 светодиодов, максимальное же количество ограничивается только желаниями пользователя и возможностями производителя. Простые матрицы одноцветны, каждый пиксель может либо светиться определенным цветом, либо не светиться вовсе, что уже неплохо развязывает руки творцам электроники. Чуть более сложные экземпляры оборудованы двумя и более разноцветными пикселями на каждую точку, что позволяет получать два, три и более цветов в каждом пикселе путем смешения.Следующий вопрос - как вообще подключаются подобные матрицы? Первое, что приходит в голову - каждый светодиод просто присоединить к своему пину контроллера. Для матрицы 8х8 потребуется 64 пина, что сразу вычеркивает из списка почти все контроллеры, кроме, разве что Atmega2560. Да, можно сделать и так, но подобная расточительность ресурсов мало кого устроит, поэтому возвращаемся к идее динамической индикации на несколько разрядов. Если в индикаторах поочередно высвечивалась целиком каждая цифра (разряд), то в матрице поочередно будет высвечиваться каждый столбик (или строка, выбирать программисту). Данная схема подключения сокращает количество задействованных пинов контроллера с 64 до жалких 16, что тоже немало, но уже по силам почти всем Ардуино.
В конкретном примере 8 столбцов на анодах (С) и 8 строк на катодах (R). Подаем плюс на все аноды, кроме активного, на нем будет минус. На катодах выставляем плюс - там, где нужен светящийся символ, получаем столбик нашей картинки. И так поочередно и циклически со всеми столбиками, что при достаточно быстрой смене кадров даст четкое требуемое изображение.
Разумеется, если потребуется использовать матрицу, к примеру, трехцветную, количество контактов опять скакнет за пределы разумного. Если же количество свободных для матрицы пинов ограничено, или если матриц несколько, или они большого размера (в смысле количества пикселей и цветов), используются различные ухищрения и приспособления. Например, сдвиговые регистры типа 74HC595. У каждого из них по 8 выводов, значит для матрицы 8х8 потребуется таких два, соединенных в каскад, но от контроллера будет достаточно всего три пина. Кроме того, продляя каскад можно добавлять матрицы еще и еще, используя для управления всего лишь те же самые 3 пина. Еще больше облегчить жизнь способна специализированная микросхема MAX2719, специально созданная для одноцветных матриц 8х8, она имеет все 16 выводов и самостоятельно поддерживает динамическую индикацию. Кроме того, MAX2719 тоже способна соединяться каскадами, образуя цепочку матриц при тех же трех пинах на входе. На базе данной микросхемы промышленным способом выпускаются светодиодные модули из одной и более матриц. Под них существуют готовые библиотеки, что делает вывод изображений и надписей с различными эффектами, например “бегущая строка”, предельно простыми.
В последнее время появился и набирает популярность еще один отдельный тип матриц, о котором следует упомянуть - из адресных светодиодов. Пиксели просто соединяются цепочкой в “змейку”.
Купить датчики для Arduino вы можете в нашем онлайн магазине 3DIY
Примеры
Для ознакомления с работой матриц на низком уровне возьмем самого простого распространенного ее представителя - одноцветную динамическую матрицу 8х8 - и попытаемся ее оживить напрямую контроллером без помощи дополнительных микросхем.Приведенная выше принципиальная схема подключения не имеет ничего общего с реальной распиновкой, не обладающей никакой разумной системой, поэтому не стоит пытаться ее понять и запомнить, но следует посмотреть в даташите. Где, напомню, R - строки-катоды, С - столбцы-аноды. “Динамить” матрицу будем по столбцам, а значит на строки поставим токоограничивающие резисторы, таким образом в каждый момент времени на один резистор будет приходиться не более одного включенного светодиода. Для реализации задумки собираем простую, но немного запутанную схему. Матрица великовата для сборки на беспаечной макетной платы, поэтому я был вынужден спаять некий адаптер для ее установки. Как нетрудно догадаться из сказанного выше и по расположению резисторов, верхний ряд контактов предназначен для строк, нижний для столбцов. Чтобы привести их к нормальной очередности от 1 до 8, на обратной стороне пришлось накрутить проводки в стиле загадки “помоги мышонку найти свою норку”. В итоге каждый входящий контакт благополучно соединился с соответствующим по номиналу контактом на матрице.
Теперь осталось всего ничего - написать программу, которая будет выводить на нее картинки. Принцип ее работы был кратко описан в предыдущей главе, повторяться не будем. В самой программе создадим пару “кадров” в виде массива нулей и единиц, которые будем выводить на матрицу, где единица соответствует включенному светодиоду, ноль - выключенному. Для простоты сделаем массив двухмерным и расположим элементы в том же порядке, как светодиоды в матрице, таким образом картинку можно легко наблюдать (и рисовать) прямо в программе.
byte r[8] = {A0, A1, A2, A3, A4, A5, 10, 11}; // пины строк byte c[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // пины столбцов byte m[8][8] = { // кадр "крест" 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }; byte y[8][8] = { // кадр "рожица" 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0 }; void setup() { for (byte i = 0; i < 8; i++) { // инициализация пинов pinMode(r[i], OUTPUT); digitalWrite(r[i], LOW); pinMode(c[i], OUTPUT); digitalWrite(c[i], HIGH); } } void loop() { view(); // каждая итерация функции = 1 кадр } void view() { static unsigned long timer; static byte ii = 0; static byte ii_old = 0; if (timer > millis()) return; // не чаще 1 кадра в 1 мс digitalWrite(c[ii_old], HIGH); // выключаем предыдущий активный столбец for (byte i = 0; i < 8; i++) { // выводим строки digitalWrite(r[i], y[i][ii]); } digitalWrite(c[ii], LOW); // включаем новый активный столбец до следующего входа в цункцию ii_old = ii; ii = ii == 7 ? 0 : ii + 1; timer = millis() + 1; }
Заливаем, смотрим результат: Почему видим только кадр с рожицей, когда в программе еще есть кадр с крестом? Потому что в таком виде программа выводит только что-то одно, в данном случае содержимое массива ”y”, где нарисована именно рожица. Как переделать программу, чтобы она выводила крест, следует догадаться самостоятельно.Динамическая индикация обладает как недостатками, так и преимуществами, одно из которых - частое обновление кадров, что всего в одном шаге анимации картинок. Давайте сделаем из матрицы простой, но анимированный рекламный баннер для аптеки, подобные которому мы видим часто в реальной жизни. Матрица поочередно будет показывать крест и стрелку, направленную на вход в аптеку.
Заодно усовершенствуем программу, сделав ее компактнее и быстрей. Первым делом преобразуем кадры в одномерные массивы из 8 байт, где биты будут строками. Зачем тратить на один пиксель целый байт, если достаточно бита? Вторым делом, при помощи магии ссылок и указателей, будем подменять периодически картинку на вход в функцию вывода в матрицу. Это позволит не писать для каждого кадра свою функцию, а пользоваться одной для всех.
byte r[8] = {A0, A1, A2, A3, A4, A5, 10, 11}; // пины строк byte c[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // пины столбцов byte m2[8] = { 0b01100110, 0b10010101, 0b00010101, 0b00100101, 0b00010101, 0b00010101, 0b10010101, 0b01100110 }; byte m3[8] = { 0b00100101, 0b00100101, 0b00100010, 0b01101010, 0b10100010, 0b10101010, 0b10101010, 0b01101010 }; byte m4[8] = { // кадр "стрелка" 0b00000000, 0b11000000, 0b01100000, 0b00110001, 0b00011001, 0b00001111, 0b00000111, 0b00011111 }; byte m5[8] = { // кадр "крест" 0b00011000, 0b00011000, 0b00011000, 0b11111111, 0b11111111, 0b00011000, 0b00011000, 0b00011000 }; byte* bin; // указатель на массив с кадром void setup() { for (byte i = 0; i < 8; i++) { // инициализация пинов pinMode(r[i], OUTPUT); digitalWrite(r[i], LOW); pinMode(c[i], OUTPUT); digitalWrite(c[i], HIGH); } } void loop() { view(bin); // вывод активного кадра change(); // смена активного кадра каждую секунду } void change() { static byte nom = 0; static unsigned long timer; if (timer > millis()) return; switch (nom) { // циклически меняем активный кадр каждую секунду case 0: bin = &m4[0]; break; case 1: bin = &m5[0]; break; } nom++; nom = nom % 2; timer = millis() + 1000; } void view(byte* n) { static unsigned long timer; static byte ii = 0; static byte ii_old = 0; if (timer > millis()) return; digitalWrite(c[ii_old], HIGH); byte bb = 0b00000001; for (byte i = 0; i < 8; i++) { // перебираем биты, выводим в пины digitalWrite(r[i], (bb & *(n + ii))); bb = bb << 1; } digitalWrite(c[ii], LOW); ii_old = ii; ii = ii == 7 ? 0 : ii + 1; timer = millis() + 1; }
Как результат наблюдаем такую картину: Невольно захотелось зайти и купить пару пластырей.Внимательный читатель снова спросит, а почему в программе четыре кадра, если мы видим два? Потому что чередование двух других будет выглядеть так: Переделать программу для этого предлагается в качестве самостоятельной работы.
Разумеется, чередовать можно любое количество кадров с любой скоростью и при любых обстоятельствах, все зависит от потребностей и возможностей контроллера с программистом.
Как видите, принцип работы у динамической светодиодной матрицы довольно прост, не сложнее чем у цифрового индикатора. При использовании матриц с большим количеством элементов с привлечением дополнительных микросхем принцип останется тем же, изменится лишь способ вывода информации.
Вывод
Светодиодная матрица - простой, но важный и эффектный элемент вывода информации. Множество разновидностей, размеров, форм и характеристик позволяет использовать матрицы в огромном разнообразии применений, от рекламных вывесок до мониторов. Да, мониторы это тоже, по сути, светодиодные матрицы с огромным количеством многоцветных пикселей и огромной производительностью. Знать основы работы матриц и уметь ими пользоваться должен любой уважающий себя DIY-мастер.FAQ
Можно ли программным способом менять яркость свечения матрицы?Можно воспользоваться ШИМ на пинах-катодах для уменьшения яркости. Более того, можно менять скважность ШИМ для каждого пикселя отдельно, для чего в функцию вывода следует внести изменения, и в массив с картинкой тоже. Однако это заметно повысит нагрузку на контроллер и, как следствие, может снизить частоту кадров и плавность картинки, если контроллер недостаточно мощный.
Бывают ли в природе трехмерные матрицы?
Да, существуют разработки так называемых трехмерных кубов. Выглядят довольно эффектно, но сложно в создании и программировании. В последнее время тоже активно переводятся на адресные светодиоды, что на два порядка упрощает то и другое.
Что еще можно изобразить на светодиодных матрицах, кроме заранее созданных картинок?
Любую графическую информацию в рамках характеристик матрицы. Картинку можно менять программно как угодно. Существует множество примеров, в которых матрица используется для простых игр, таких как тетрис, арканоид или теннис. Некоторые применяют матрицы для изготовления графических элементов интерфейса: стрелочного или ползункового индикатора, анализатора спектра и так далее. Ограничения лишь в фантазии и упорстве программиста.