Сегодня я хотел бы выступить в необычном для хаба Arduino качестве и рассказать не об устройстве, а о библиотеке.
Речь пойдет о библиотеке LedMatrix (русскоязычное описание), которая умеет управлять светодиодными матрицами 8x8 на чипах MAX7219 и MAX7221.
Я не буду здесь пересказывать readme из репозитория, а остановлюсь на основных особенностях.
Основополагающая концепция – это код должен подстраиваться под архитектуру вашего монтажа, а не монтаж под код.
Итак, что же такое умеет моя библиотека.
1. Она умеет программно поворачивать матрицы. Таким образом, вам не нужно стараться подогнать расположение матриц, что бы задуманная вами картинка отображалась корректно.
Такая проблема действительно существует. И часто поднимается на форумах.
2. Она умеет объединять матрицы в каскады. Работа с каскадом как с отдельной сущностью гораздо удобнее чем с простым массивом индивидуальных матриц.
3. Она умеет объединять каскады в суперкаскады.
Чипы MAX7219 и MAX7221 накладывают аппаратное ограничение на размер каскада в 8 матриц на каскад. Но можно подключить несколько каскадов, объединить их в один суперкаскад и работать с ним как с единым каскадом. Суперкаскад – это просто большой каскад. Интерфейсных отличий нет.
4. Она умеет работать как через аппаратный SPI так и через программный. Вы сами выбираете способ подключения своего устройства и в зависимости от ваших потребностей выбираете через какой интерфейс работать.
5. Она снабжена небольшой порцией синтаксического сахара в виде итераторов, удобной работы с бинарными представлениями.
6. Ну и конечно, она умеет все что должна уметь такая библиотека. Сюда относится работа с отдельными строками, столбцами, точками. Получение, установка, инверсия, сдвиги et cetera.
Ну и в заключении, скажу, что библиотека имеет выверенный и гибкий интерфейс написанный на современном C++.
С примерами использования вы можете познакомиться на страничке русскоязычного описания и в разделе примеры.
В настоящее время, Arduino IDE поставляется со встроенным avr-g++ версии 4.8.1, который, в достаточно полной мере, поддерживает стандарт C++11. Так почему же мы наблюдаем удручающую картину, когда большинство библиотек – это просто C с классами. Считаю, что пришло время переходить на современные стандарты. И предлагаю поддержать мое начинание.
Речь пойдет о библиотеке 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 с классами. Считаю, что пришло время переходить на современные стандарты. И предлагаю поддержать мое начинание.
sim-dev
В шапке заметки гифка — мне показалось или на самом деле библиотечка оставляет хвосты при сдвиге? Т.е. предыдущий столбец гаснет после того, как засвечивается новый.
rotor
На видео хвостов не видно. Это особенности сжатия. Гифка полученная из видеофайла имела размер 10 Мб. Пришлось ее ужать. Вот и такой эффект.
IronHead
На видео тот же эффект. Так быть не должно, сам натыкался на подобный эффект, была ошибка в коде.
Oxigenium
Скорей всего дело в записи на камеру, когда один из кадров в череде видеофайла ловит момент, в одну половину которого горел предыдущий пиксель, а в другую — следующий. Избежать этого при съёмке без хардовой модификации платы нельзя, если уменьшить выдержку — будет видно на видео, как загораются отдельные светодиоды. А на каждый светодиод по конденсатору паять — то ещё мучение.
IronHead
Что то неправдоподобное написали вы. У меня такого эффекта не было:
http://www.youtube.com/watch?v=3etFtuy6sP0
А вот тут была кривая прошивка, которая при динамической индикации засвечивала столбец:
http://www.youtube.com/watch?v=Va96GCUEiPE
rotor
Убедится можно так:
И смотрим папку frames
GarryC
Похоже, что тут играются с ступенчатым увеличением интенсивности при включении и затуханием при выключении — не считаю это хорошей идеей.
rotor
Что бы вы не гадали, что да как, выложил скетч который выводит эту надпись. Смотрите сами.
master_luffe
Не будет ли код, написанный на С++11 медленней чем то, что писали раньше? Ардуинка не резиновая ведь.
--Шутка про драйвер на JavaScript--
rotor
С чего бы коду на C++11 быть медленнее? Медленнее может быть только компиляция, да и то вряд ли и вы этого даже не заметите. А исполняемый код ни чем не будет отличаться от кода на чистом C или на классическом C++.
rotor
Даже более того, благодаря
constexpr
и семантике переноса, исполняемый код получается даже более эффективный. Поскольку часть повторяющихся вычислений может быть перенесена на этап компиляции. А семантика переноса позволяет избежать ненужных копирований, заменив их переносом.Tomasina
Работа действительно большая в плане универсальности.
Но не хватает заметки (или просто примера) как использовать ее для вывода бегущих строк — ведь матрицы в 95% используют именно для этого. Дочитано полностью, но фраза "Библиотека не реализует средств для печати текстовых строк на каскаде матриц" все равно непонятна — что мешает определиться с количеством и ориентацией матриц и, уже используя эти данные, выводить текст?
rotor
Спасибо за отзыв.
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 *
.Но как я уже сказал, это отдельная задача, которая должна быть (и возможно, будет) реализована в отдельной библиотеке.