led matrix cascade 8x8 Сегодня я хотел бы выступить в необычном для хаба Arduino качестве и рассказать не об устройстве, а о библиотеке.
Речь пойдет о библиотеке LedMatrix (русскоязычное описание), которая умеет управлять светодиодными матрицами 8x8 на чипах MAX7219 и MAX7221.



Я не буду здесь пересказывать readme из репозитория, а остановлюсь на основных особенностях.

Основополагающая концепция – это код должен подстраиваться под архитектуру вашего монтажа, а не монтаж под код.

Итак, что же такое умеет моя библиотека.

1. Она умеет программно поворачивать матрицы. Таким образом, вам не нужно стараться подогнать расположение матриц, что бы задуманная вами картинка отображалась корректно.
Такая проблема действительно существует. И часто поднимается на форумах.

2. Она умеет объединять матрицы в каскады. Работа с каскадом как с отдельной сущностью гораздо удобнее чем с простым массивом индивидуальных матриц.

3. Она умеет объединять каскады в суперкаскады.
Чипы MAX7219 и MAX7221 накладывают аппаратное ограничение на размер каскада в 8 матриц на каскад. Но можно подключить несколько каскадов, объединить их в один суперкаскад и работать с ним как с единым каскадом. Суперкаскад – это просто большой каскад. Интерфейсных отличий нет.

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

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

6. Ну и конечно, она умеет все что должна уметь такая библиотека. Сюда относится работа с отдельными строками, столбцами, точками. Получение, установка, инверсия, сдвиги et cetera.

Ну и в заключении, скажу, что библиотека имеет выверенный и гибкий интерфейс написанный на современном C++.

С примерами использования вы можете познакомиться на страничке русскоязычного описания и в разделе примеры.

PS
Изначально, моя библиотека была форком библиотеки LedControl. Я планировал внести несколько косметических правок и добавить недостающие мне возможности, но в итоге, я увлекся и полностью переписал исходную библиотеку. От оригинала осталась буквально пару строк, которые располагаются сейчас в файле src/CoreMax72xx.cpp




В настоящее время, Arduino IDE поставляется со встроенным avr-g++ версии 4.8.1, который, в достаточно полной мере, поддерживает стандарт C++11. Так почему же мы наблюдаем удручающую картину, когда большинство библиотек – это просто C с классами. Считаю, что пришло время переходить на современные стандарты. И предлагаю поддержать мое начинание.

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


  1. sim-dev
    14.03.2016 10:47

    В шапке заметки гифка — мне показалось или на самом деле библиотечка оставляет хвосты при сдвиге? Т.е. предыдущий столбец гаснет после того, как засвечивается новый.


    1. rotor
      14.03.2016 10:53

      На видео хвостов не видно. Это особенности сжатия. Гифка полученная из видеофайла имела размер 10 Мб. Пришлось ее ужать. Вот и такой эффект.


      1. IronHead
        14.03.2016 11:05

        На видео тот же эффект. Так быть не должно, сам натыкался на подобный эффект, была ошибка в коде.


        1. Oxigenium
          14.03.2016 20:04
          +1

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


          1. IronHead
            14.03.2016 21:55

            Что то неправдоподобное написали вы. У меня такого эффекта не было:
            http://www.youtube.com/watch?v=3etFtuy6sP0
            А вот тут была кривая прошивка, которая при динамической индикации засвечивала столбец:
            http://www.youtube.com/watch?v=Va96GCUEiPE


            1. rotor
              14.03.2016 22:50

              Да нет, у вас тоже такой эффект есть. Дело в fps камеры
              Я на планшет снимал. У вас может камера по продвинутей.

              image
              Убедится можно так:

              youtube-dl "https://www.youtube.com/watch?v=3etFtuy6sP0"
              mv "stm8s-discovery 74hc595 8x8 led matrix-3etFtuy6sP0.mp4" "matrix.mp4"
              mkdir frames
              ffmpeg -i "matrix.mp4" -r 10.1 -f image2 frames/image-%3d.png

              И смотрим папку frames


  1. GarryC
    14.03.2016 15:46

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


    1. rotor
      14.03.2016 18:54

      Что бы вы не гадали, что да как, выложил скетч который выводит эту надпись. Смотрите сами.


  1. master_luffe
    14.03.2016 18:38

    Не будет ли код, написанный на С++11 медленней чем то, что писали раньше? Ардуинка не резиновая ведь.
    --Шутка про драйвер на JavaScript--


    1. rotor
      14.03.2016 18:44

      С чего бы коду на C++11 быть медленнее? Медленнее может быть только компиляция, да и то вряд ли и вы этого даже не заметите. А исполняемый код ни чем не будет отличаться от кода на чистом C или на классическом C++.


    1. rotor
      14.03.2016 19:00

      Даже более того, благодаря constexpr и семантике переноса, исполняемый код получается даже более эффективный. Поскольку часть повторяющихся вычислений может быть перенесена на этап компиляции. А семантика переноса позволяет избежать ненужных копирований, заменив их переносом.


  1. Tomasina
    15.03.2016 10:08

    Работа действительно большая в плане универсальности.

    Но не хватает заметки (или просто примера) как использовать ее для вывода бегущих строк — ведь матрицы в 95% используют именно для этого. Дочитано полностью, но фраза "Библиотека не реализует средств для печати текстовых строк на каскаде матриц" все равно непонятна — что мешает определиться с количеством и ориентацией матриц и, уже используя эти данные, выводить текст?


    1. rotor
      15.03.2016 11:50
      +1

      Спасибо за отзыв.

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

      Я согласен, что в большинстве случаев, библиотека будет использоваться (ну я надеюсь, что будет) для управления однострочной горизонтальной компоновкой. Правильное решение — это сделать отдельную библиотеку поверх этой.
      У меня есть такие планы.

      На самом деле, даже сейчас это совсем не сложная задача. Вот два примера:
      https://github.com/valmat/LedMatrix/blob/master/examples/MultiShift/MultiShift.ino
      https://github.com/valmat/LedMatrix/blob/master/examples/HelloHabr/HelloHabr.ino

      Если кратко, то нужно с помощью метода void setCol(const Col &col, buint8_t value); установить соответствующие столбцы.

      Сейчас нет интерфейса для конвертации строки в набор символов с автоматической установкой в матрицу. Т.е. что бы работать с чем то вроде const char * / const wchar_t *.
      Но как я уже сказал, это отдельная задача, которая должна быть (и возможно, будет) реализована в отдельной библиотеке.