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

Но что если попробовать применить подобные матрицы в своих устройствах на микроконтроллерах? Какой интерфейс обмена и логика вывода у этих матриц?
Попробуем с этим всем разобраться.

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


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


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


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

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


Переворачиваем матрицу и видим плату:

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

На сайте удалось найти распиновку разъёма (разъёмов) матрицы:

Также на сайте удалось найти принципиальную схему, которая довольно точно соответствует схеме моей матрицы:


На разъёме:
— Пины 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. Выдаём по SPI данные для сдвиговых регистров. Для одной матрицы 32x16 это 16 байт (16 8-битных регистров).
2. Устанавливаем лог. 0 на ножке nOE.
3. Устанавливаем лог. уровни на ножках A и B в соответствии с обновляемой группой светодиодов (одной из четырёх). Это подаёт +5В на аноды светодиодов выбранной группы.
4. Выдаём на ножку SCLK короткий положительный импульс. Это подаёт землю на катоды светодиодов в соответствии с загруженными в регистры байтами.
5. Устанавливаем лог. 1 на ножке nOE. При этом четверть экрана (одна группа светодиодов) загорается и горит до следующего обновления следующей группы светодиодов.
Повторяем пункты 1-5 с постоянным периодом.

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

Вся изложенная выше информация, а также демонстрация работы матрицы в видео ниже. В нём я с 13:04 по 15:00 говорю про зависимость яркости экрана от кол-ва матриц. Это из-за ошибки в алгоритме. Ошибка исправлена и теперь данные загружаются до отключения экрана.


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

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

Комментарии (25)


  1. sumrakssk
    09.05.2016 22:29

    Где ты был 7 лет назад… Все было только на китайском… Дома до сих пор пара матриц лежит. Если кому нужно…


    1. ElectricFromUfa
      09.05.2016 22:34

      7 лет назад я вроде даже не знал о существовании таких матриц. Да и из Китая делал редкие осторожные заказы)


    1. Z80A
      10.05.2016 09:16

      Год назад удалось разжиться такой б/у матрицей за треть цены.



      Подключал к ардуино методом тыка, собрал мечту детства — цветомузыку, эх до чего красивая и мощная хрень!


      1. Radan
        10.05.2016 11:19

        А можно подробнее про вашу цветомузыку? Цветомузыки на такой матрице я ещё не встречал!


        1. Z80A
          10.05.2016 20:04

          Выход с аудио плеера идёт на аналоговый вход к ардуине, программа анализирует уровень сигнала, строит картинку и засылает в панель. Одна матрица вечером освещает всю комнату — можно дискотеки устраивать!


      1. ElectricFromUfa
        10.05.2016 11:28

        Да уж, в помещении эти матрицы слепят прилично


  1. herr_kaizer
    09.05.2016 22:29
    +1

    Вопрос не по теме: не ваши табло висят по всей Айской? :) Очень много одинаковых, разве что эффекты различаются.


    1. ElectricFromUfa
      09.05.2016 22:33

      Нее, к светодиодной рекламе я не имею никакого отношения. Просто было интересно, как можно применить такие матрицы в своих устройствах


  1. Andy_Big
    09.05.2016 23:04
    +1

    А нельзя ли минимизировать время отключения экрана, изменив алгоритм? Пункт 3 выносим в начало, убирая его из времени отключения экрана:
    1. Выдаём по SPI данные для сдвиговых регистров.
    2. Устанавливаем лог. 0 на ножке nOE.
    3. Устанавливаем лог. уровни на ножках A и B в соответствии с обновляемой группой светодиодов (одной из четырёх).
    4. Выдаём на ножку SCLK короткий положительный импульс.
    5. Устанавливаем лог. 1 на ножке nOE.

    И время загрузки новых данных в регистры больше не влияет на время отключения экрана для обновления, можно загружать сколько угодно модулей последовательно, упадет только FPS, но не яркость.


    1. ElectricFromUfa
      09.05.2016 23:07

      Точно! Можно! Завтра внесу изменения в код


      1. Andy_Big
        09.05.2016 23:08
        +1

        Вроде так и работал наш алгоритм, когда мы делали схемы для бегущих строк :)


        1. ElectricFromUfa
          10.05.2016 18:30

          Ну да, это я ступил.
          Проверил в железе, поправил статью и исходники. В видео этот косяк, к сожалению, останется.
          Спасибо за замечание!


          1. Andy_Big
            10.05.2016 19:22

            Да не за что, для этого вроде и существуют комментарии :)


  1. Sun-ami
    10.05.2016 00:01

    Пины C и D — это дополнительные линии адреса группы, они для матриц со сканированием 1/8 и 1/16. R и G — это входы данных сдвиговых регистров для красных и зелёных светодиодов — распиновка разъёма взята с красно-зелёной матрицы со сканированием 1/16.


    1. ElectricFromUfa
      10.05.2016 08:17

      Во! Спасибо за пояснение!
      Только не совсем понял, в случае RGB-матрицы, через какой пин будут лететь данные синего цвета?


      1. Sun-ami
        10.05.2016 09:04
        +1

        Распиновка бывает разная. Вот в этой статье: https://learn.adafruit.com/downloads/pdf/32x16-32x32-rgb-led-matrix.pdf — совсем другая распиновка для RGB-матриц


      1. Z80A
        10.05.2016 09:08
        +1

        На RBG матрицах больше управляющих сигналов:


  1. GennPen
    10.05.2016 02:27
    +1

    Всегда думал, что там стоят обычные светодиоды. Овальные скорее всего для того, чтобы фокусировка была размазана по горизонтальной плоскости, а не строго вперед.


  1. Shadow_Runner
    10.05.2016 09:02
    +4

    Ничего личного, но подобная реклама одна из причин, по которой хочется Адблок в реальность. Это соревнование на тему «Ярче, дерганее, долой эпилептиков с этого света» ничего хорошего не приносит.


  1. Infthi
    10.05.2016 10:46
    +1

    Ну и заодно библиотека для ардуино, которую подключаешь, устанавливаешь пины, и всё работает: https://github.com/freetronics/DMD. Несмотря на то, что она позиционируется как библиотека для экранов конкретной конторы, у меня она взлетела с китайской 32х16


    1. ElectricFromUfa
      10.05.2016 11:31

      Ну эта контора как раз покупает в Китае эти модули и продаёт комплектом с arduino и переходником с arduino на 16-пиновый интерфейс матрицы


  1. Dark_Purple
    10.05.2016 19:25

    Отлично, жду статью про эту матрицу.


    1. Z80A
      10.05.2016 19:55

      Всего 12 таких матриц и получится большой ZX Spectrum за 30 тыр.
      Уууу, как же я хочу на таком демки посмотреть или в эксолона поиграть…
      48х64 см, это будет как 80 см телевизор. Круть!


    1. ElectricFromUfa
      10.05.2016 20:15

      Такой у меня нет, но зато есть такая


      1. Dark_Purple
        10.05.2016 20:18

        Такая не интересно. :(