Библиотека DMD для STM32 + AVR с поддержкой Unicode шрифтов

Тема в разделе "Глядите, что я сделал", создана пользователем b707, 21 май 2019.

  1. b707

    b707 Гуру

    Добрый день!
    Предлагаю Вашему вниманию расширенную редакцию библиотеки DMD.h Решил выложить в разделе модули, потому что на готовый проект это вроде не тянет.

    Что это и для чего
    Библиотека DMD используется для работы с одноцветными LED матрицами P10 32х16 фирмы Freetronics. Матрицы можно соединять последовательно, получая длинные строки или большие панно: Матрицы широко используются для разных вывесок, баннеров, бегущих строк
    [​IMG]
    В стандартной библиотеке заявлена только поддержка контроллеров АВР, поэтому первоначально главной задачей я считал портировать библиотеку для работы на широко известной плате "блюпилл" с контроллером STM32F103.Отсюда и название библиотеки на Гитхабе: DMD_STM32
    Однако по ходу работы выяснилось. что эта задача давно решена и существует даже несколько библиотек DMD для STM32 разной степени законченности.

    Зато в ходе обсуждения с другими участниками всплыла проблема фонтов для DMD матриц. Оригинальная библиотека DMD поддерживает только фонты своего внутреннего формата, причем только 8-,битные ASCII символы. Для вывода букв национальных алфавитов энтузиасты нарисовали несколько фонтов, в том числе и кириллицу. но вообще выбор шрифтов очень узкий.

    Для устранения этих затруднений в предлагаемой версии библиотеки добавлена поддержка фонтов в распространенном формате Adafruit GFX. Формат выбран по двум причинам: во-первых, много уже готовых фонтов. Но главное - в этот формат можно почти одним движением сконвертить любой TTF шрифт c помощью фирменной утилиты fontconvert от Adafruit. Конвертация TTF фонтов открывает широкие возможности - фонтов в интернете сотни тысяч. для всех возможных национальных алфавитов. причем очень многие фонты бесплатны. Добавление новых функций привело к обратному портированию библиотеки на контроллеры АВР :) (пока только Атмега328)

    Из других отличий от стандартной библиотеки - на СТМ32 можно работать с двуми наборами матриц одновременно. В следующей версии планируется добавить вертикальную бегущую строку (см видео ниже)

    Примеры работы:

    Вывод надписи сконвертированным TTF фонтом



    Вертикальная строка:



    Две одновременные бегущие строки (только СТМ32)




    Код библиотеки на Гитхабе: https://github.com/board707/DMD_STM32
    Библиотека пока слабо документирована, синтаксис использования смотрите в примерах - они все работают.. И задавайте вопросы. Буду рад любым мнениям , замечаниям и предложениям
     
    Un_ka, issaom, Daniil и 4 другим нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Эту ошибку я исправил :) Проект достойный раздела.
     
    DIYMan нравится это.
  3. b707

    b707 Гуру

    Обновление библиотеки - версия v0.3.2 (для СТМ32)
    (код на Гитхабе, ссылка в первом сообщении)

    Поправлена ошибка задания частоты шины SPI, добавлен вывод через DMA(пока синхронный, асинхронный планируется)

    Главное внешнее изменение - скорость вывода на матрицы выросла примерно в 10-12 раз, в режиме бегущей строки полностью исчезли все "притормаживания" текста. Судя по таймингам вывода, библиотека должна без проблем работать с 16 матрицами на канал без заметного замедления другого кода программы.
     
    issaom, Daniil и ИгорьК нравится это.
  4. b707

    b707 Гуру

    Обновление - версия v0.4.1 (для СТМ32)
    (ссылка на гит в первом сообщении)

    Основные изменения:

    - вывод данных на матрицы через DMA в асинхронном режиме, то есть почти без загрузки микроконтроллера
    - проведена работа по устранению мерцаний и паразитной засветки пикселей, для чего увеличена частота ШИМ регулировки яркости матриц
    - все настройки таймеров "убраны" внутрь библиотеки, пользователю не нужно ничего настраивать
    - восстановлена совместимость с АВР Атмега328(надеюсь :)

    Изменения повлекли за собой некоторые изменения в интерфейсе. Для СТМ32 при начале работы с матрицами обязательна функция dmd.init(), вызываемая в setup(). Яркость теперь регулируется от 0 до 255. Подробнее см. примеры.

    Важно: Пины n_OE теперь нужно выбирать только из числа тактируемых Timer3 - то есть PB0 PB1 PB5.
     
  5. b707

    b707 Гуру

    Библиотека нуждается в бета-тестерах :) В принципе, по таймингам на осциллографе последние версии выглядят очень неплохо. Теоретически :) на массовой плате blue pill STM32F103C8T6 библиотека должна работать с 30- 40 матрицами на каждом канале. К сожалению, у меня нет достаточного числа матриц, чтобы проверить это вживую. Так что если кто-то захочет сделать свой проект на моей библиотеке - обращайтесь, обещаю авторскую поддержку :)

    === технические детали, можно не читать ===
    Каждое сканирование матриц состоит из двух стадий - подготовки данных и передачи. На последней версии 0.4.1 подготовка занимает примерно 15 мкс (+ 3 мкс на каждую следующую панель), передача по SPI - примерно 30 мкс каждая панель (при частоте тактирования SPI 8МГц).
    При использовании асинхронного DMA вторая стадия (передача данных) происходит в фоновом режиме, не нагружая контроллер и оставляя его свободным для других задач. Таким образом, при подключении 30 матриц центральный контроллер будет занят около 100 мкс - при сканировании раз в 1мс это всего 10% процессорного времени.
    =================================

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

    Если у кого-то есть предложения - готов выслушать. Если нужно добавить в библиотеку двухцветные и полноцветные матрицы - готов заняться, если кто-то предоставит такие панели :)
     
  6. b707

    b707 Гуру

    Новости проекта

    Судя по тестам и отзывам пользователей версия 0.4 получилась реально быстрой.

    Юзер vtronicsautomation с Гитхаба написал мне, что запустил работу с 32 матрицами (16 на первом канале SPI и 16 на втором).
    А lean74 с форума ардуино.ру смог адресовать 42 матрицы на одном канале.

    Думаю, это далеко не предел, библиотека сможет работать и с большими цепочками панелей. К сожалению,чтобы проверить это практически - нужно иметь десятки и даже сотни матриц. Поэтому я обращаюсь ко всем, кто работает с подобными панелями - монтажникам, разработчикам, продавцам. Давайте протестируем библиотеку на ваших матрицах :) Подключим 60, 80, а то и 100 матриц к одному контроллеру - потянет ли?
     
    Un_ka, Daniil и ИгорьК нравится это.
  7. b707

    b707 Гуру

    DetSimen нравится это.
  8. MAXIM1982

    MAXIM1982 Нуб

    Здравствуйте! Подскажите, почему шрифты с высотой символа больше 16, которые были созданы для библиотеки dmd2.h не отображаются в dmd_stm32
     
  9. b707

    b707 Гуру

    а чем вы создаете шрифты для dmd2 и в каком формате?
     
  10. MAXIM1982

    MAXIM1982 Нуб

    Честно сказать там не полноценные шрифты, только цифры. Мне не требовались буквы. Рисовал вручную.
     
  11. MAXIM1982

    MAXIM1982 Нуб

    Arial_black_16.h например переделывал
     
  12. b707

    b707 Гуру

    может не так переделаи? Если бы правильно переделывали. то хотя бы часть высотой 16 должна была показываться
     
  13. MAXIM1982

    MAXIM1982 Нуб

    Нет, он же при использовании в dmd2 и ардуино отображается правильно. Просто, я думал, что если перенести этот шрифт в dmd_stm32 то проблем не будет, но...
     
  14. MAXIM1982

    MAXIM1982 Нуб

    А в библиотеке нет ограничений по высоте шрифта? Просто мой шрифт с высотой 16 отображается, а другие с большей высотой символа нет
     
  15. b707

    b707 Гуру

    а разве формат шрифтов в dmd2 такой же? Я честно никогда не сравнивал.
    До переделки Arial_black_16.h в DMD_STM32 работал?
     
  16. b707

    b707 Гуру

    нет
     
  17. MAXIM1982

    MAXIM1982 Нуб

    Да.
     
  18. MAXIM1982

    MAXIM1982 Нуб

    Dmd и dmd2 там одинаковые форматы
     
  19. MAXIM1982

    MAXIM1982 Нуб

    Просто я скопировал три шрифта из библиотек dmd2 в dmd_stm32 и получается, что шрифт высотой 16 работает, а выше нет
     
  20. b707

    b707 Гуру

    Можете мне прислать на ded@cur-ex.ru архив с Вашим шрифтом и простеньким проверочным скетчем, в котором было бы видно, как вы используете фонт и как он не работает
    Я вечером посмотрю