Библиотека для управления светодиодными матрицами
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 15/03/2016 - 00:16
Всем добрый день!
Хочу представить библиотеку для управления светодиодными матрицами 8x8 на чипах MAX7219 и MAX7221. https://github.com/valmat/LedMatrix
Заметка о библиотеке на Гиктаймс: https://geektimes.ru/post/272588/
Русскоязычное Readme: https://github.com/valmat/LedMatrix/blob/master/README.RU.md
Буду рад, если она вам пригодится. Так же надеюсь получить обратную связь. Возможно, какие-то предложения по улучшению.
Посмотрел краем глаза. Большая работа проделана. Снимаю шляпу!
работа действительно большая в плане универсальности.
Но не хватает заметки (или просто примера) как использовать ее для вывода бегущих строк - ведь матрицы в 95% используют именно для этого. Дочитано полностью, но фраза "Библиотека не реализует средств для печати текстовых строк на каскаде матриц" все равно непонятна - что мешает определиться с количеством и ориентацией матриц и, уже используя эти данные, выводить текст?
И название для библиотеки слишком уж типовое.
а) возможен вариант, что такое название библы уже кем-то использовано и будет конфликт библиотек
б) по такому названию очень сложно потом отыскать именно эту среди десятков однотипных.
Спасибо за отзывы.
Но не хватает заметки (или просто примера) как использовать ее для вывода бегущих строк - ведь матрицы в 95% используют именно для этого. Дочитано полностью, но фраза "Библиотека не реализует средств для печати текстовых строк на каскаде матриц" все равно непонятна - что мешает определиться с количеством и ориентацией матриц и, уже используя эти данные, выводить текст?
LedMatrix создан как библиотека общего назначения. То есть она не делает ни каких предположений о конфигурации пользовательского монтажа, а допускает любую конфигурацию в рамках аппаратных ограничений.
Поэтому включение методов управления конкретной конфигурацией было бы нарушением целостности. Это архитектурно не правильно включать в библиотеку общего назначения реализацию конкретной конфигурации.
Например, матрицы могут быть скомпонованы в две строки или четыре. Или в горизонтальный блок. Или вообще для игры в тетрис.
Я согласен, что в большинстве случаев, библиотека будет использоваться (ну я надеюсь, что будет) для управления однострочной горизонтальной компоновкой. Правильное решение -- это сделать отдельную библиотеку поверх этой.
У меня есть такие планы.
На самом деле, даже сейчас это совсем не сложная задача. Вот два примера:
https://github.com/valmat/LedMatrix/blob/master/examples/MultiShift/Mult...
https://github.com/valmat/LedMatrix/blob/master/examples/HelloHabr/Hello...
Если кратко, то нужно с помощью метода `void setCol(const Col &col, buint8_t value);` установить соответствующие столбцы.
Сейчас нет интерфейса для конвертации строки в набор символов с автоматической установкой и в матрицу. Т.е. что бы работать с чем то вроде `const char *`/`const wchar_t *`.
Но как я уже сказал, это отдельная задача, которая должна быть (и возможно, будет) реализована в отдельной библиотеке.
И название для библиотеки слишком уж типовое.
а) возможен вариант, что такое название библы уже кем-то использовано и будет конфликт библиотек
б) по такому названию очень сложно потом отыскать именно эту среди десятков однотипных.
Я думал на счет использования namespace. К сожалению, в Arduino сообществе существует какая то странная традиция не использовать пространства имен. Я не решился пойти против нее. Как вы считаете, уместно ли ввести пространство имен?
По поводу названия. Ну не знаю. С названием как то не заморачивался, но в ваших словах есть смысл.
Уважаемый автор библиотеки!, собрал куб на 6 матрицах с использованием библиотеки "ледконтролл" для рисования эффектов без программирования. Вы вроде её как исходную использовали. Всё работает нормально, но краем глаза видно мерцание при смене кадров. Связываю это с тем, что "поточечно" библиотека отрисовывает медленно. Подскажите, Ваша будет работать быстрее? Пробывал на ранних вариантах аппаратный SPI - мерцание такое же.
Лекс, насчёт LedControl всё понятно: в ней используется своя spiTransfer(), в котором делается shiftOut(), внутре которой сплошные digitalWrite(). А с хардварным SPI ты работал руками или библиотечке какой-то поверил?
Лекс, насчёт LedControl всё понятно: в ней используется своя spiTransfer(), в котором делается shiftOut(), внутре которой сплошные digitalWrite(). А с хардварным SPI ты работал руками или библиотечке какой-то поверил?
Лекс, насчёт LedControl всё понятно: в ней используется своя spiTransfer(), в котором делается shiftOut(), внутре которой сплошные digitalWrite(). А с хардварным SPI ты работал руками или библиотечке какой-то поверил?
Не, у меня нет таких способностей, проверял этой же библиотекой, только на других выводах платы (где сейчас SD карта висит). Просто аналогичный куб 555 на WS2812b с "почти таким же скетчем" без мерцаний сколь угодно быстро (пока глаз не перестаёт различать кадры по отдельности), а здесь жестко-медленно. Опять же думалось, что есть библиотека без "дигитал..." внутри.
Не, у меня нет таких способностей, проверял этой же библиотекой, только на других выводах платы (где сейчас SD карта висит).
Вобщем, библиотеке без разницы, какие пины ей передают - всё равно будет digitalWrite(). SLKH выше привёл вариант - спытай.
Лекс, насчёт LedControl всё понятно: в ней используется своя spiTransfer(), в котором делается shiftOut(), внутре которой сплошные digitalWrite(). А с хардварным SPI ты работал руками или библиотечке какой-то поверил?
Не, у меня нет таких способностей, проверял этой же библиотекой, только на других выводах платы (где сейчас SD карта висит). Просто аналогичный куб 555 на WS2812b с "почти таким же скетчем" без мерцаний сколь угодно быстро (пока глаз не перестаёт различать кадры по отдельности), а здесь жестко-медленно. Опять же думалось, что есть библиотека без "дигитал..." внутри.
Попробую разобраться с ней.
Почитал быстренько, ума не хватает, обе библиотеки (для SD тоже) используют одни и те же выводы, 11,12,13.
17:45 Попробую разобраться с ней.
Слишком "быстренько". Почитайте пообстоятельнее, тогда хватит.
CS-ы разные назначай всем, кто на SPI сидит, библиотеки потом сами разберутся (теоретически).
http://www.gaw.ru/html.cgi/txt/interface/spi
Навскидку нашёл такой материал, но матрицы явно по другой схеме включены.
По ходу такая. То есть получается SD по одной, матрицы по другой. А так можно?
Очень уж на вскидку. Последняя картинка только показывает что читают 3 модуля одновременно, а вот ответить может только третий. Два других отвечают следующему. Это очень специфическая схема включения. По матрицам информация гонится до конца, да линия активации где?
Это твоя схема. SPI #0 - Max-ы, SPI #1 - SD и т.п.
Очень уж на вскидку. Последняя картинка только показывает что читают 3 модуля одновременно, а вот ответить может только третий. Два других отвечают следующему. Это очень специфическая схема включения. По матрицам информация гонится до конца, да линия активации где?
Ну вот такие у меня модули с входами-выходами. Да, возврата от крайнего модуля нет. Три "сигнальных" входят и выходят, а на карте 4. Вот и получается хитрая комбинация - "параллельно-последовательному каскаду" (CS или SS на отдельный пин для матриц и карты).
Вот и получается хитрая комбинация - "параллельно-последовательному каскаду" (CS или SS на отдельный пин для матриц и карты).
Load, он же CS. Остальные модули по цепочке к первому присоединить, полагаю.
Согласно мануалу данные гонятся в 16 бит - 4 адрес и 8 дата. Так что не в подряд, а адресно. Вот команды на активацию нет. Данные сразу вываливаются на выход в выбранном разряде, зато можно менять в любом порядке. Каскадировать можно.
Согласно мануалу данные гонятся в 16 бит - 4 адрес и 8 дата. Так что не в подряд, а адресно. Вот команды на активацию нет. Данные сразу вываливаются на выход в выбранном разряде, зато можно менять в любом порядке.
Прозвонил контакты тестером, похоже такая схема должна быть. Или нет? И как карту ставить? Параллельно к CLK, MOSI, MISO и отдельно SS?
Да такая. На микросхеме MISO это 24 нога DOUT. MOSI -1, CS - нет у 7219 - она по положительному фронту CS работает LOAD называется 12.
То есть так можно собрать-переподключить, поменять в скетче номера соответствующих (для матриц) выводов и куб хотя бы сможет работать? А потом менять библиотеку .
Или работать не будет, так как "ледконтролл" не поддерживает аппаратный SPI?, и сразу надо менять библиотеку.
Не лазил в ледконтрол, но правил другие библиотеки на предмет общения с железом. В часности к аппаратному i2c добавлял программный для общения с несколькими АЦП MCP3421 c одним адресом. Обычно в библиотеках аппаратный вывод сосредоточен в виде нескольких функций в приватной секции. Даже если ледконтрол не заточен под аппратный SPI не вижу никаких препятствий его туда допилить.
Не лазил в ледконтрол, но правил другие библиотеки на предмет общения с железом. В часности к аппаратному i2c добавлял программный для общения с несколькими АЦП MCP3421 c одним адресом. Обычно в библиотеках аппаратный вывод сосредоточен в виде нескольких функций в приватной секции. Даже если ледконтрол не заточен под аппратный SPI не вижу никаких препятствий его туда допилить.
Что то я совсем дремучий... Есть в "природе" библиотеки работающие с матрицами по аппаратному SPI (автор библиотеки данной темы), есть встроенные в "ИДЕ"библиотеки "SPI" и "SD". Но совместимы они между собой в работе по схеме (последней)? Или искать может быть бесполезно.
Что то я совсем дремучий ... есть встроенные в "ИДЕ"библиотеки "SPI" и "SD". Но совместимы они между собой
Что Вам мешает открыть их текст и посмотреть? Вы бы легко обнаружили в тексте SD такую кончтрукцию
и поняли бы, что она (SD) работает с SPI не сама по себе, а через штатную библиотеку SPI.
Точно также (не работают с SPI сами по себе, а используют штатную библиотеку) подавляющее большинство библиотек для различных SPI устройств.
:) Намёк понял - рыться в библиотеках, есть ли там ссылка на SPI... Но такая только библиотека из 7 сообщения. Но заработают ли они вместе с SD?, по такой схеме.
Должны заработать. С CS там, вроде правильно обращаются:
Даже, можно, думаю её подфиксить и цикл с трансфером байта заменить на SPI.transfer(buffer, size)
Есть мнение, что строку №5 лучше перенести с секцию инициализации)))
Не стоит. "Трансферы" из других библиотек могут перестраивать режимы, так что, как я понял из анализа ряда исходников, установка своих SPISettings перед трансфером - вполне обычный приём. Не сильно экономно, конечно, постоянно это делать, но такова жись.
Ну или придётся все исходники прожекта перековырять и "оптимизировать" на предмет однократной настройки SPI.
"Трансферы" из других библиотек могут перестраивать режимы,
Дело даже не в этом. Если в приложени используется несколько устройств и не дай Бог что-то используется из прерывания, то пара "скобок" BeginTransaction - EndTransaction предохраняет от вклинивания одного в другое. Пока не отработает EndTransaction новая BeginTransaction не сунется.
Есть мнение, что строку №5 лучше перенести с секцию инициализации)))
Тогда уж строку 10 надо перенести "на".
Дело даже не в этом. Если в приложени используется несколько устройств и не дай Бог что-то используется из прерывания, то пара "скобок" BeginTransaction - EndTransaction предохраняет от вклинивания одного в другое. Пока не отработает EndTransaction новая BeginTransaction не сунется.
А, не... я только про SPISettings писал. Других осмысленных оптимизаций в том фрагменте не вижу.
А, не... я только про SPISettings писал. Других осмысленных оптимизаций в том фрагменте не вижу.
Ну, тогда я вообще не вижу оптимизации. BeginTransaction по-любому инициализирует SPI - без вариантов.
То есть можно скачивать, ставить и разбираться чем отличается от оригинальной в плане написания функций в скетче моём.
То есть можно скачивать, ставить и разбираться чем отличается от оригинальной в плане написания функций в скетче моём.
Вы как-то неуверенно, дрожащими руками ... не бойтесь Вы ничего!!! Ставьте, пробуйте, смотрите. Только так научитесь. Что значит "можно скачивать"? Вам кто-то запрещал? Вы разрешения спрашиваете? Вы не нуждаетесь ни в чьём разрешении!!! Делайте, наступайте на грабли, прикладывайтё лёд к шишке и делайте по-другому. Только так Вы будете совершенстоваться.
То есть можно скачивать, ставить и разбираться чем отличается от оригинальной в плане написания функций в скетче моём.
Вы как-то неуверенно, дрожащими руками ... не бойтесь Вы ничего!!! Ставьте, пробуйте, смотрите. Только так научитесь. Что значит "можно скачивать"? Вам кто-то запрещал? Вы разрешения спрашиваете? Вы не нуждаетесь ни в чьём разрешении!!! Делайте, наступайте на грабли, прикладывайтё лёд к шишке и делайте по-другому. Только так Вы будете совершенстоваться.
Ну вот попробовал через IDE и zip архив. В папке с библиотеками есть, а в меню нет. Мешает "старая LedControl"?
Не знаю. Я никогда не ставил библиотек через какие-то архивы и никогда не смотрел какие там библиотеки в меню у IDE (даже не знаю где они там, слышал, что есть). Всегда руками копирую в фолдер libraries, руками вставляю #include и никогда на этот счёт не парюсь.
Не знаю. Я никогда не ставил библиотек через какие-то архивы и никогда не смотрел какие там библиотеки в меню у IDE (даже не знаю где они там, слышал, что есть). Всегда руками копирую в фолдер libraries, руками вставляю #include и никогда на этот счёт не парюсь.
Распаковал архив, папку с новой библиотекой вставил вместо старой в "либрарис", библиотека опозналась с таким же именем. Попробовал проверить свой скетч - выскочила ошибка в строке инициализации матриц.
59 строка в моём скетче.
Ну, читайте чо за ошибка и решайте проблемы. Чего Вы с каждым сраным сообщением компилятора сюда-то бежите. Работайте.
Ёлки - моталки, должна же быть преемственность, раз имя тоже.
должна
Кому это она так задолжала?
Нет такого требования. Каждый пишет как хочет. Дисплей пример. Библиотек полно с одними и теми же именем. А даже инициализация разная, не говоря об прочих готолайн.
Нет такого требования. Каждый пишет как хочет. Дисплей пример. Библиотек полно с одними и теми же именем. А даже инициализация разная, не говоря об прочих готолайн.
Не ожидал такого. Это теперь каждый раз одну сносить, другую ставить, что б изменить что то в разных версиях скетча.
Да и разбираться придётся не 5 минут с примерами (если они там есть)... раз так делают.
А вы пользовались не разбираясь? Силён бродяга! Кепочку снимаю. Я прежде чем библиотеку подключить обязательно просматриваю все обьявленные методы. Вдруг есть что то чего нет в примерах,а мне очень надо?
А вы пользовались не разбираясь? Силён бродяга! Кепочку снимаю. Я прежде чем библиотеку подключить обязательно просматриваю все обьявленные методы. Вдруг есть что то чего нет в примерах,а мне очень надо?
Почему не разбираясь. Про "ледконтрол" читал год или больше назад, доходчивых статей за функции библиотеки хватает - всё ясно, просто и по русски. В данном поделии как раз не хватало функции считывания состояния светодиода куба, но обошёлся и без неё (в ущерб ресурсам платы).
Разбираться под настроение надо - в этом наверно затык.
Сравнил примеры в библиотеках - одинаковы (в инициализации 4 аргумента). Сравнил cpp. у двух библиотек, в "спишной" вроде 2 против 4 у исходной аргумента. Не для моих это средних умов. Но на досуге можно поэкспериментировать.