Как управлять «рекламными» LED-матрицами

В последние годы получили широкое распространение в наружной рекламе и различных информационных табло светодиодные матрицы. Достаточно яркие, динамичные — они прекрасно привлекают внимание и не слепнут в солнечный день. Каждый из вас видит их на улицах вашего города ежедневно.
Конечно же, их распространению поспособствовала низкая цена (за счёт китайских производителей) и простота сборки экрана.
51d14e463d3043eaaf56f2ebd0593d1c.jpg
Но что если попробовать применить подобные матрицы в своих устройствах на микроконтроллерах? Какой интерфейс обмена и логика вывода у этих матриц?
Попробуем с этим всем разобраться.
Китайцы предлагают как сами матрицы разных размеров и с разным разрешением, так и контроллеры для вывода на них изображений с различными несложными эффектами, а также всю необходимую фурнитуру, соединительные кабели, рамы.
Матрицы встречаются как одноцветные (белые, желтые, красные, зеленые, синие), так и 3-цветные (RGB). Обозначение модели матрицы выглядит обычно так Pxx или PHxx, где xx — число, указывающее расстояние между пикселями в миллиметрах. В моём случае это P10. Кроме того, матрицы некоторых типоразмеров бывают не только прямоугольными, но и квадратными.

Возможные варианты типоразмеров матриц
7fd5ec1ade664694801e0b6c62c73d95.jpg


Итак, имеем белую матрицу 32×16 точек с размерами 320×160 мм и, соответственно, межпиксельным расстоянием в 10 мм. Давайте рассмотрим её поближе.
Вид спереди:
daf922e7a23447b29e21595139fdda9f.jpg

Вам тоже показалось, что светодиоды какие-то овальные? Вам не показалось…

06e6b3398ab448d2a41ef816fc594ca8.jpg
Над светодиодами сделан небольшой козырёк, который не даёт солнечному свету засвечивать светодиоды.

Вид спереди со снятой пластиковой маской
372b7cdf88af4561bcd9cddc67762241.jpg


Переворачиваем матрицу и видим плату:
4eeb75b1445b4b3893f7a8c4d4afeefe.jpg
На плате кучка микросхем логики. Давайте разберёмся, что это за микросхемы:
1. 1 x SM74HC245D — неинвертирующий буфер
2. 1 x SM74HC04 — 6-канальный инвертор
3. 1 x SM74HC138D — 8-битный дешифратор
4. 4 x APM4953 — сборка из 2 P-канальных MOSFET
5. 16×74HC595D — сдвиговый регистр с защёлкой
Два 16-пиновых разъёма — интерфейсные, один из них входной (к нему подключается контроллер экрана), а второй — выходной (к нему подключается следующая матрица в цепочке). Стрелка на плате направлена от входного разъёма к выходному.
Питание подаётся на клеммы в центре платы. Напряжение питания — 5В, максимальный ток (когда включены все светодиодны матрицы) — 2А (для белой матрицы).

На сайте удалось найти распиновку разъёма (разъёмов) матрицы:
0bc02e6435c04856a93533bdb10f40e3.jpg
Также на сайте удалось найти принципиальную схему, которая довольно точно соответствует схеме моей матрицы:
67bbb8862780441586c79c3825618402.gif

На разъёме:
— Пины 6, 14, 16 (C, G, D) — не используются (возможно они используются в 3-цветных матрицах).
— Пины 2 и 4 (A и B) — задают, какая из 4 групп светодиодов экрана работает в данный момент. Матрицы используют динамическую индикацию, поочерёдно переключая 4 группы светодиодов в зависимости от логических уровней на ножках A и B. На плате эти сигналы приходят на дешифратор D18, который открывает 1 из 4 групп P-канальных полевиков, тем самым подавая +5В на аноды светодиодов выбранной группы.
— Пин 1 (nOE) — разрешает работу матрицы (лог. 0 гасит все матрицы в цепочке). Логика работы этого пина реализована на элементах НЕ в D19 и дешифраторе D18.
— Пины 8 и 12 (CLK и R) — линии клока и данных синхронного последовательного интерфейса. Их подключаем к SCK и MOSI интерфейса SPI микроконтроллера.
— Пин 10 (SCLK) — по переднему фронту защёлкивает переданные в сдвиговые регистры данные на их выходы. Сдвиговые регистры подключены к катодам светодиодов матрицы. По этой причине передаваемые данные нужно инвертировать (светодиод будет гореть при лог. 0).

Все сигналы кроме сигнала R соединены у входного и выходного интерфейсных разъёмов матрицы. Сигнал R проходит от входного разъёма через буфер к первому сдвиговому регистру матрицы и, пройдя через всю цепочку регистров, выходит на выходной интерфейсный разъём. Таким образом, все сдвиговые регистры всех матриц включены в одну длинную цепочку.

Исходя из этого, логика обновления экрана (точнее четверти экрана) выглядит следующим образом:
1. Устанавливаем лог. 0 на ножке nOE.
2. Устанавливаем лог. уровни на ножках A и B в соответствии с обновляемой группой светодиодов (одной из четырёх). Это подаёт +5В на аноды светодиодов выбранной группы.
3. Выдаём по SPI данные для сдвиговых регистров. Для одной матрицы 32×16 это 16 байт (16 8-битных регистров).
4. Выдаём на ножку SCLK короткий положительный импульс. Это подаёт землю на катоды светодиодов в соответствии с загруженными в регистры байтами.
5. Устанавливаем лог. 1 на ножке nOE. При этом четверть экрана (одна группа светодиодов) загорается и горит до следующего обновления следующей группы светодиодов.
Повторяем пункты 1–5 с постоянным периодом.

Мои реализации этого алгоритма и небольшое демо работы матрицы:
Исходник проекта для AVR ATmega328 (IAR)
Исходник проекта для STM32f103c8t6 (IAR)

Вся изложенная выше информация, а также демонстрация работы матрицы в видео:

Также буду рад вас видеть на моём youtube-канале, где я ещё много всякой всячины подключаю к микроконтроллерам.

Всем спасибо за внимание!

© Geektimes