Светодиодные матрицы: устройство, виды и подключение к Arduino

Как устроена светодиодная матрица, чем различаются её разновидности и как управлять матрицей 8х8 напрямую с Arduino через динамическую индикацию.
От сегментного индикатора к матрице
Объединив несколько светодиодов в систему, из них можно складывать осмысленные изображения. Самый знакомый пример — цифровой сегментный индикатор: зажигая нужные сегменты, получают любую цифру и часть букв. Увеличение числа сегментов усложняет подключение, но свободы в рисовании почти не добавляет.


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

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

- Одноцветные: каждый пиксель либо светится одним цветом, либо погашен.
- Многоцветные: в каждой точке два и более разноцветных кристалла, цвета получают смешением. Каждый дополнительный цвет удваивает количество входных контактов, растут требования к памяти и вычислительной нагрузке контроллера.
- На адресных светодиодах: пиксели соединены цепочкой, «змейкой». Для управления нужен один пин, матрица полноцветная и быстрая, её можно собрать из светодиодной ленты любого размера и формы. Среди недостатков называют высокую цену, чувствительность элементов, слабую помехоустойчивость и высокую нагрузку на контроллер.
Способы подключения
Если соединить каждый светодиод матрицы 8х8 с отдельным выводом контроллера, понадобится 64 пина. Такое по силам разве что плате на Atmega2560. Гораздо экономнее динамическая индикация: в каждый момент времени светится только один столбец (или строка), а столбцы перебираются по кругу настолько быстро, что глаз видит цельную картинку. Число задействованных выводов при этом сокращается с 64 до 16.
В рассматриваемом примере 8 столбцов подключены к анодам (C), 8 строк — к катодам (R). На все аноды подаётся плюс, кроме активного — на нём минус. На катодах плюс выставляется там, где пиксель должен светиться; так формируется один столбец изображения, после чего очередь переходит к следующему. Для трёхцветной матрицы количество выводов при такой схеме снова становится чрезмерным.
Когда свободных пинов мало, матриц несколько или они крупные, применяют дополнительные микросхемы:
- Сдвиговые регистры 74HC595. У каждого 8 выходов, поэтому на матрицу 8х8 нужны два регистра, соединённые каскадом. Контроллеру достаточно трёх пинов, а при удлинении каскада на тех же трёх пинах можно добавлять новые матрицы.
- Специализированная микросхема для одноцветных матриц 8х8 (в источнике она обозначена как MAX7219). Она имеет все 16 выводов, сама поддерживает динамическую индикацию и тоже соединяется в каскад при трёх управляющих пинах. На её основе выпускают готовые модули из одной и более матриц, для которых есть библиотеки, упрощающие вывод надписей и эффектов вроде бегущей строки.
Матрица 8х8 напрямую от Arduino
Чтобы понять работу матрицы на низком уровне, одноцветную матрицу 8х8 подключают к контроллеру без вспомогательных микросхем. Реальная распиновка корпуса не совпадает с принципиальной схемой и не подчиняется очевидной логике, поэтому её берут из даташита. Развёртка ведётся по столбцам, значит, токоограничивающие резисторы ставят на строки: тогда на каждый резистор в любой момент приходится не более одного горящего светодиода.
В скетче строки назначены на пины A0–A5, 10 и 11, столбцы — на пины 2–9.
Кадр хранится в двухмерном массиве 8х8 из нулей и единиц, расположенных так же, как светодиоды: единица — пиксель горит, ноль — погашен. Картинку удобно рисовать прямо в тексте программы. Функция вывода вызывается в основном цикле и не чаще раза в миллисекунду гасит предыдущий столбец, выставляет на строках значения очередного столбца и включает его. В примере заданы два кадра, крест и рожица, но на матрицу выводится только один массив.
Анимация и экономия памяти
Частое обновление кадров при динамической индикации позволяет легко перейти к анимации. В качестве примера матрицу превращают в вывеску аптеки: раз в секунду чередуются крест и стрелка, указывающая на вход.
Программа при этом становится компактнее. Каждый кадр записывается одномерным массивом из 8 байт, где отдельный бит отвечает за один пиксель, так что тратить на точку целый байт не нужно. Функция вывода получает указатель на массив с активным кадром, а отдельная функция раз в секунду подменяет этот указатель. Благодаря этому одна функция обслуживает любое количество кадров, и чередовать их можно с любой скоростью.
Яркость, игры и объёмные конструкции
Яркость матрицы можно менять программно, используя ШИМ на выводах катодов. Допустимо задавать скважность и для каждого пикселя отдельно, изменив функцию вывода и формат массива с картинкой, но нагрузка на контроллер заметно вырастет, и у слабого контроллера могут упасть частота кадров и плавность изображения.
Изображение не обязано быть заготовленным заранее: его можно формировать программно. На матрицах делают простые игры — тетрис, арканоид, теннис, — а также элементы интерфейса: стрелочные и ползунковые индикаторы, анализаторы спектра. Существуют и трёхмерные светодиодные кубы; они сложны в сборке и программировании, и их всё чаще строят на адресных светодиодах, что существенно упрощает обе задачи.