- Назначение и принцип работы,
- Разновидности и способы подключения,
- Примеры,
- Вывод,
- FAQ.
Назначение и принцип работы
Что такое светодиод, понятно всем - это небольшая экономичная “лампочка” которая светится, когда на нее подают напряжение и не светится, когда не подают. С помощью этого замечательного устройства можно не только освещать пространство вокруг, но и подавать сигналы, например, о том, какие системы работают, а какие отключены, извещать о неисправностях, отмечать активные кнопки и тумблеры и так далее. Если объединить несколько светодиодов в систему, появится возможность выдавать больше полезной информации, формируя из них наполненные смыслом фигуры и образы. Первым понятным примером такой системы светодиодов служит цифровой индикатор.Однако цифровые индикаторы, весьма ограничены в своих изобразительных возможностях и не дают развиваться прогрессу. Людям мало одних цифр, да и букв им недостаточно, подавай возможность рисовать что угодно! Попытка добавить черточек ситуацию спасла не сильно, а вот сложности подключения добавила изрядно.
Где можно приобрести?Светодиодные матрицы купить можно в нашем магазине 3DIY!
Разновидности и способы подключения
Все светодиодные матрицы в принципе работы одинаковы. Включая и выключая определенные светодиоды, мы формируем на матрице любую двухмерную картинку. Различия имеются лишь в характеристиках и техническом исполнении. Простейшие матрицы имеют количество элементов, исчисляемое несколькими десятками, например, особо популярны у DIY- мастеров матрицы 5х8 и 8х8 светодиодов, максимальное же количество ограничивается только желаниями пользователя и возможностями производителя. Простые матрицы одноцветны, каждый пиксель может либо светиться определенным цветом, либо не светиться вовсе, что уже неплохо развязывает руки творцам электроники.Следующий вопрос - как вообще подключаются подобные матрицы? Первое, что приходит в голову - каждый светодиод просто присоединить к своему пину контроллера. Для матрицы 8х8 потребуется 64 пина, что сразу вычеркивает из списка почти все контроллеры, кроме, разве что Atmega2560. Да, можно сделать и так, но подобная расточительность ресурсов мало кого устроит, поэтому возвращаемся к идее динамической индикации на несколько разрядов. Если в индикаторах поочередно высвечивалась целиком каждая цифра (разряд), то в матрице поочередно будет высвечиваться каждый столбик (или строка, выбирать программисту).
В конкретном примере 8 столбцов на анодах (С) и 8 строк на катодах (R). Подаем плюс на все аноды, кроме активного, на нем будет минус. На катодах выставляем плюс - там, где нужен светящийся символ, получаем столбик нашей картинки. И так поочередно и циклически со всеми столбиками, что при достаточно быстрой смене кадров даст четкое требуемое изображение.
Разумеется, если потребуется использовать матрицу, к примеру, трехцветную, количество контактов опять скакнет за пределы разумного.
Купить датчики для Arduino вы можете в нашем онлайн магазине 3DIY
Примеры
Для ознакомления с работой матриц на низком уровне возьмем самого простого распространенного ее представителя - одноцветную динамическую матрицу 8х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; }
Заливаем, смотрим результат: Динамическая индикация обладает как недостатками, так и преимуществами, одно из которых - частое обновление кадров, что всего в одном шаге анимации картинок. Давайте сделаем из матрицы простой, но анимированный рекламный баннер для аптеки, подобные которому мы видим часто в реальной жизни. Матрица поочередно будет показывать крест и стрелку, направленную на вход в аптеку.
Заодно усовершенствуем программу, сделав ее компактнее и быстрей. Первым делом преобразуем кадры в одномерные массивы из 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
Можно ли программным способом менять яркость свечения матрицы?Можно воспользоваться ШИМ на пинах-катодах для уменьшения яркости. Более того, можно менять скважность ШИМ для каждого пикселя отдельно, для чего в функцию вывода следует внести изменения, и в массив с картинкой тоже. Однако это заметно повысит нагрузку на контроллер и, как следствие, может снизить частоту кадров и плавность картинки, если контроллер недостаточно мощный.
Бывают ли в природе трехмерные матрицы?
Да, существуют разработки так называемых трехмерных кубов. Выглядят довольно эффектно, но сложно в создании и программировании. В последнее время тоже активно переводятся на адресные светодиоды, что на два порядка упрощает то и другое.
Что еще можно изобразить на светодиодных матрицах, кроме заранее созданных картинок?
Любую графическую информацию в рамках характеристик матрицы. Картинку можно менять программно как угодно. Существует множество примеров, в которых матрица используется для простых игр, таких как тетрис, арканоид или теннис. Некоторые применяют матрицы для изготовления графических элементов интерфейса: стрелочного или ползункового индикатора, анализатора спектра и так далее. Ограничения лишь в фантазии и упорстве программиста.