Led Matrix P10 - шрифты
- Войдите на сайт для отправки комментариев
Вс, 26/04/2020 - 16:18
Разбираюсь с монохромными (одноцветными) светодиодными модулями P10 (Led Matrix P10, табло P10, HUB12).
На данном этапе для управления панелью использую клон Arduino Nano на Atmega328.
С вашего позволения буду вести тут бложик по теме.
Участие уважаемого сообщества категорически приветствуется.
Задача: вывод на табло читаемого текста на русском и английском языках
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~†рстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопСделанные в Riuson.com LCD Image Converter и отформатированные скриптом шрифты с кириллицей готовые к использованию с Freetronics DMD
Font_mid.h
https://yadi.sk/d/4MlRRIvGHNK8OQ
#include <SPI.h> #include <DMD.h> #include <TimerOne.h> #include "Font_Arial_mini.h" #include "Font_Arial_mid.h" #include "Font_Arial_BIG.h" #include "SystemFont5x7.h" #define DISPLAYS_ACROSS 2 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); void ScanDMD() { dmd.scanDisplayBySPI(); } void setup(void) { Timer1.initialize(3000); Timer1.attachInterrupt(ScanDMD); dmd.clearScreen(true); dmd.selectFont(Font_Arial_BIG); const char *MSG1 = "Вася,иди~в~лес!"; dmd.drawString(0, 0, MSG1, strlen(MSG1), GRAPHICS_NORMAL); } void loop(void) { }если взять библиотеку DMD-STM32 - с этими матрицами можно изпользовать шрифты формата Adafruit - то есть практически любой размер на любом национальном языке.
В качестве платы управления я предпочитаю использовать STM32
подробнее
http://arduino.ru/forum/proekty/dmdstm32-versiya-biblioteki-dmd-dlya-stm32duino
Хреновая библиотека ИМХО...
Хреновая библиотека ИМХО...
которая? И почему?
А это чего за херня?
Шестнадцатеричное представление:
for (var x = 0; x < image.width; x++) { for (var y = (image.height/2) - 1; y >= 0; y--) { image.addPoint(x, y); } } for (var x = 0; x < image.width; x++) { for (var y = image.height - 1; y >= (image.height/2); y--) { image.addPoint(x, y); } }DMD умеет в шрифты переменной высоты?
DMD умеет в шрифты переменной высоты?
конечно.
Вы бы почитали ссылки, что я вам даю - все проблемы. что вы описываете в "бложике" - давно решены. Люди собирают панно из десятков матриц и, конечно же, выводят туда текст не только высотой 16 пикселей...
шрифт высотой 96 пикс
я вас ни за что не агитирую :), хотя библиотека поддерживает не только СТМ32. Хотите изобретать велосипед - пожалуйста, это же всегда интересно.
Просто вы, вроде бы, приглашали всех к дискуссии - вот я и указал вам на неэффективность выбранного метода описания шрифтов. Если вам реально интересно, как это улучшить - пссмотрите описание формата шрифтов Адафруит. Там для описании букв используется только прямоугольник, в котором реально есть закрашенные пиксели, без необходимости описывать обширные пустые области.
раз уж вы взялись изобретать свое - там пусть оно будет немного лучше уже готового. А проектов вывода кирилицы на матрицы P10 в интернете довольно.
Вам просто сообщают, что вы стучитесь в открытую дверь. Поделка на фото - моя. И там не STM32, а вовсе даже esp8266 (с вебмордой и управлением по вайвай). И в качестве библиотеки использован стандартный DMD2 для атмег. Кучу поделок я делал на 168 и на 328 атмегах. С тем же самым DMD2. Так вот, с памятью проблемы бывали. На 168 постоянно, но и на 328 приходилось ужимать шрифты по максимуму.
И таки да, шрифты на DMD переменного размера (зависит от буквы).
Открываю получившиеся файлы и руками копирую массивы в один файл.
Готово.
#include <DMD_STM32.h> #include <TimerOne.h> #include "gfx_fonts/UbuntuMedium9pt8b.h" #define DISPLAYS_ACROSS 2 #define DISPLAYS_DOWN 1 #define DMD_PIN_A 6 #define DMD_PIN_B 7 #define DMD_PIN_OE 9 #define DMD_PIN_SCLK 8 SPIClass dmd_spi; DMD dmd(DMD_PIN_A, DMD_PIN_B, DMD_PIN_OE, DMD_PIN_SCLK, DISPLAYS_ACROSS, DISPLAYS_DOWN, dmd_spi); DMD_GFX_Font UbuntuMedium((uint8_t*)&UbuntuMedium9pt8b,(uint8_t*)&UbuntuMedium9pt8brus, 0x80, 12); const unsigned char m[] = "Какое слово скажешь, такое в ответ и услышишь."; char k[50]; int utf8_rus(char* dest, const unsigned char* src) { uint8_t i, j; for ( i =0, j =0; src[i]; i++) { if ((src[i] == 0xD0 )&& src[i+1]) { dest[j++] = src[++i] - 0x10;} else if ((src[i] == 0xD1 )&& src[i+1]) {dest[j++] = src[++i] + 0x30; } else dest[j++] = src[i]; } dest[j] ='\0'; return j; } void ScanDMD() { dmd.scanDisplayBySPI(); } void setup(void) { Timer1.initialize(3000); Timer1.attachInterrupt(ScanDMD); dmd.clearScreen(true); dmd.selectFont(&UbuntuMedium); utf8_rus(k,m); } void loop(void) { dmd.drawMarquee(k, strlen(k), (32*DISPLAYS_ACROSS)-1, 0); long prev_step = millis(); while(1) { if ((millis() - prev_step) > 30 ) { dmd.stepMarquee(-1, 0); prev_step=millis(); } } }Что таки я ощутил:
Какие настройки в программе "LCD Image Converter" нужно сделать чтобы создать свой шрифт?
Я сделал свой шрифт по вашей инструкции но матрица выводит иероглифы
ссылки на мой шрифт
https://drive.google.com/file/d/1qIMrwBiZu0FKHHbEB2j6z7HPwag4wKjX/view?u...
Какие настройки в программе "LCD Image Converter" нужно сделать чтобы создать свой шрифт?
Я сделал свой шрифт по вашей инструкции но матрица выводит иероглифы
ссылки на мой шрифт
https://drive.google.com/file/d/1qIMrwBiZu0FKHHbEB2j6z7HPwag4wKjX/view?u...
Если хотите, чтобы вам помогли - пишите подробнее
- какую библиотеку ДМД используете, какие матрицы, какая управляющая плата
- пытаетесь выводить на матрицу латиницу или национальные алфавиты?
- приведите код, работающий с матрицей
Раз уж вы тут про фонты, вставлю свои 5 копеек.
Лично я пользуюсь вот этой программой (требует яву) https://yadi.sk/d/XTrYnWbaODXy2w
Просто и удобно. Можно загружать системные фонты, можно рисовать свои. Лично я рисую свои - системные не отображаются в полной мере на всю высоту табло. На рисование фонта обычно трачу не больше часа - навострился.
Известные баги:
1. Иногда при экспорте не правильно выставляет высоту фонта в пикселях (и фонт не показывается нормально), надо всегда проверять итоговой фонт.h.
2. Если в описании символа есть какие то знаки (не буквы и цифры), то не делает экспорт в h. Какие точно символы, мне лень проверять, поэтому я всегда эти символы не подписываю, а потом подписываю уже в файле h. В принципе их можно вообще не подписывать, но я люблю порядок и что бы в файле фонт.h я всегда мог найти нужный символ. Точно знаю, что мешают экспорту /,\, (,), {,} - но это не весь список, остальные мне стало лениво вычислять. Просто не подписываю то, что обвел красным
И таки да, как вы можете видеть, ширина фонтов переменная. Все известные мне ДМД эти фонты употребляют вообще без проблем.
- Использую обычную DMD библиотеку, матрица P10(1R) HUB12 , Arduino Nano (ATmega328P)
- использую латиницу и кирилицу{ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~†рстуфхцчшщьєю
яАБВГДЕЖЗІИЇЙКЛМНОПРСТУФХЦЧШЩЬЄЮЯабвгдежзіиїйклмноп }
- Еще появляется такая ошибка при cмене кодировки в Sublime Text 3
- Файл source https://drive.google.com/file/d/187gBvxnArY5JPtJXb-7KhsrkZ119vsR6/view?usp=sharing
- код демка з DMD =>
#include <SPI.h> //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise) #include <DMD.h> // #include <TimerOne.h> // #include "SystemFont5x7.h" #include "Font_mid.h" #include "Font_ua2158.h" //Fire up the DMD library as dmd #define DISPLAYS_ACROSS 4 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); /*-------------------------------------------------------------------------------------- Interrupt handler for Timer1 (TimerOne) driven DMD refresh scanning, this gets called at the period set in Timer1.initialize(); --------------------------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*-------------------------------------------------------------------------------------- setup Called by the Arduino architecture before the main loop begins --------------------------------------------------------------------------------------*/ void setup(void) { //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display Timer1.initialize( 3000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker. Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() //clear/init the DMD pixels held in RAM dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on) Serial.begin(115200); } /*-------------------------------------------------------------------------------------- loop Arduino architecture main loop --------------------------------------------------------------------------------------*/ void loop(void) { dmd.clearScreen( true ); dmd.selectFont(Font_ua2158); // Français, Österreich, Magyarország const char *MSG = "Заїзд комерційного транспорту"; dmd.drawMarquee(MSG,strlen(MSG),(32*DISPLAYS_ACROSS)-1,0); long start=millis(); long timer=start; while(1){ if ((timer+30) < millis()) { dmd.stepMarquee(-1,0); timer=millis(); } } }скачайте вот этот рус-украинский фонт
https://github.com/board707/DMD_STM32/blob/master/st_fonts/UkrRusSystemFont5x7.h
попробуйте вывести надпись этим фонтом - какой результат?
На матрицу выводит следующие слова:
Слово "Заїзд" выводит на Матрицу => "ЗаЗзд"
а
слово "комерційного" => комерціЖного"
На матрицу выводит следующие слова:
Слово "Заїзд" выводит на Матрицу => "ЗаЗзд"
а
слово "комерційного" => комерціЖного"
это которым фонтом? из моей ссылки?
а когда выводили надпись вашим фонтом. что получалось?
Пробовал вот ети с вашей ссылки:
- UkrRusArial14.h
- UkrRusSystemFont5x7.h
вот что происходит с моим цифра "1"
для начала сравните местоположения символа "1" в своем и моих фонтах, похоже что у вас рисуется массив байт из какого-то произвольного места в памяти. Если ошибки в коде символа нет - тогда значит ваш фонт имеет неверный формат
Заснял процесс на видео
https://youtu.be/MvK-GDpVIjM
Если Sublime Text 3 не может избавиться от Unicode - используйте блокнот. В блокноте сохраните файл в ANSI. Но Sublime справится, если в настройках Riuson.com LCD Image Converter заменить юникодную штриховку на Нолики и Единички.
Не путайте библиотеку Freetronics DMD (https://github.com/freetronics/DMD) о которой говорю я и библиотеку DMD_STM32 (https://github.com/board707/DMD_STM32) о которой говорит b707.
Шрифты для них разные. DMD_STM32 требует дополнительных операций в коде скетча для отображения кириллицы.
DMD_STM32 поддерживает и фонты от Freetronics DMD тоже
Здравствуйте можете мне помочь хочу сделать национальный шрифти на p10 led попробовал как на видео но не получилось даже сделал один в один как написано тоже не работал.
какой нации?
какой нации?
Иврит?) А вообще - какая разница то?))
Армянский
Какого рода помощь вам нужна? Я не знаю армянского, но если там буквенное письмо, аналогично русскому или английскому - не вижу препятствий, почему не сделать шрифт.
В феврале с одним программистом из Алжира пытались прикрутить к матрицам арабский - вот это сложно :)
!"#$%&'()*+,-./0123456789:;<=>?\x0040ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~†рстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопրցւփքօֆևՐՑՒՓՔՕՖհձղճմյնշոչպջռսվտաբգդեզէըթժիլխծկՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿ
Вот всё собрал в месте
Я хотел с программой lcd image Converter сделать но не получилось на экране показывает какие то иероглифы
с lcd image Converter помочь не смогу, я делал фонты по методам, описанным в #18 и 21
Можно и так мне все равно просто надо чтобы работало
Я хотел с этим программой попробовать, скачал но не открылся у меня.
Можешь показать ка надо сделать остальное я сам буду делать, чтобе не украсть у тебя больше время.
К сожалению, тут очень много нюансов, которые долго обьяснять и, главное, я сам их не очень помню.
GLCD Font Creator cкачивать тут
Там же вроде есть краткое описание, как пользоваться. Рисуете буквы по точкам и сохраняете как С-массив. Это получается фонт в формате Adafruit GFX, который можно выводить на матрицу библиотеками типа RGB_Matrix_Panel или DMD_STM32.
Другой вариант - это взять готовый фонт формата TTF (такие фонты тысячами лежат в интернете практически на любые языки) и сконвертировать его в матричный утилитой font-convert от Adafruit. Про использование TTF фонтов почитайте тут, в конце страницы там есть и про создание своих фонтов
Я пользовался обоими вариантами. но это было давно. Будут вопросы - спрашивайте, постараюсь вспомнить.
Просто у меня Ардуино нано а DMD_STM32 выдает ошибку что с нано не работает
старая версия DMD_STM32 поддерживала и Нано тоже
https://github.com/board707/DMD_STM32/tree/old-V1
Спасибо
Заснял процесс на видео
https://youtu.be/MvK-GDpVIjM
Если Sublime Text 3 не может избавиться от Unicode - используйте блокнот. В блокноте сохраните файл в ANSI. Но Sublime справится, если в настройках Riuson.com LCD Image Converter заменить юникодную штриховку на Нолики и Единички.
В общем не осилил (((
Собрал матрицу 96x96 (18 модулей P10) с контроллером ESP32 и библиотекой DMD32
Готовые шрифты типа Font_BOLD идут без проблем. Но нужно один шрифт высотой 40-42. Делал все по видео и на этапе алгоритмов просто выпал из реальности )))
В результате получил огромный файл C (3Мб), который питоновский скрипт не берет ни в каких кодировках.
Программа GLCD_FontCreator отлично генерит шрифты, но понятно что без русской части
Собрал матрицу 96x96 (18 модулей P10) с контроллером ESP32 и библиотекой DMD32
Готовые шрифты типа Font_BOLD идут без проблем. Но нужно один шрифт высотой 40-42.
Программа GLCD_FontCreator отлично генерит шрифты, но понятно что без русской части
а в шрифте Font_BOLD есть русская часть? Библиотека DMD32 умеет работать с национальными кодировками?
а в шрифте Font_BOLD есть русская часть? Библиотека DMD32 умеет работать с национальными кодировками?
Да. Все отлично работает
что-то не вижу в каталоге библиотеки на гитхабе такого фонта