Glcd font creator не сохраняет файлы

Обновлено: 06.07.2024

Написание русскоязычного текста на графических дисплеях с контролером ks0108 или его аналогами все еще представляет существенные трудности. Библиотека openGLCD, которую рекомендуют официальные сайты Arduino, в оригинальной комплектации последней на данный момент версии не содержит никаких кириллических шрифтов, кроме шрифта cp437font8x8. На практике он малопригоден, потому что в русскоязычной части поддерживает кодировку Win-1251. Следовательно, чтобы выводить символы таким шрифтом, их нужно либо вставлять в текст восьмеричными или шестнадцатеричными кодами (и при этом остаются неясности со строчной буквой «я», как указывает в комментарии сам создатель шрифта), либо все равно писать отдельную функцию перекодировки, как это сделал arduinec для библиотеки Adafruit-GFX.

Кроме всего прочего, cp437font8x8 крупноват для экранчиков 128х64 точки. Оптимальным размером шрифта для вспомогательных надписей на таком дисплее остается System5x7. Мы здесь сосредоточимся на русификации именно системного шрифта, хотя читатель может по этому образцу самостоятельно русифицировать и любой другой шрифт (особенно, если у него экран побольше).

А в чем проблема?

В процессе этого преобразования каждый символ, как и в любой программе на любом языке программирования, представляется непосредственно в виде его кода, то есть порядкового номера в таблице шрифта, из которой программа извлекает графическое начертание соответствующего символа. В файле шрифта System5x7.h библиотеки openGLCD количество символов представлено переменной font_Char_Count типа uint8_t, то есть не может превышать величины одного байта. Поэтому кириллические символы, которые в UTF-8 занимают два байта, не могут быть переданы контроллеру обычным образом.

Заметим, что это было не всегда так. Версии Arduino 1.0.x (и, по слухам, 1.6.0) усекали двухбайтовый код до однобайтового, банально отбрасывая старший байт (который для кириллицы, как следует из таблицы UTF-8 по ссылке выше, равен либо 0xD0, либо 0xD1). Потому для доработки шрифта в этих версиях среды годится старая библиотека GLCD v3, в которой массив шрифта просто дополнялся символами кириллических букв так, чтобы их позиции совпадали с младшим байтом кодировки UTF-8 (байты с 0x80 по 0xBF). Более подробно такая модернизация описана в статье автора «Работа с текстом на графическом дисплее». Повторяю — для нее нужна одна из версий Arduino IDE 1.0.x в совокупности с библиотекой GLCD v3, а не их более современные варианты.

В новых версиях Arduino IDE стало все сложнее. Библиотека решительно отказывается понимать двухбайтовые номера символов, выводя вместо них пустое место, потому простой переделкой шрифта тут не обойдешься. Приходится дополнить его функцией перекодировки двухбайтовых символов в однобайтовые.

Решение

Автор не стал лезть в недра библиотечных функций, а написал для openGLCD надстройку в виде функции outstr(), которая перебирает все элементы входной строки, пропуская их через оператор выбора Switch. Он вылавливает из строки кириллические символы и заменяет их однобайтовыми кодами, соответствующими модернизированному файлу шрифта System5x7R.h.

Например, для заглавной русской буквы «Ф» строка замены будет такой:


Здесь 0xA4 — младший байт кодировки буквы «Ф» в UTF-8 (см. ссылку выше). В соответствии с этой кодировкой составлен новый файл шрифта System5x7R.h. В принципе при таком подходе в шрифте можно применять любую кодировку русских символов и любых других глифов, которые вздумается вставить в шрифт. Лишь бы их общее количество не превышало 128 штук: от начала таблицы до символа 0x7F (127 — последний символ стандартной таблицы ASCII) целесообразно оставить шрифт в неприкосновенности.

Правда, пару вольностей с таблицей ASCII я себе разрешил. Дело в том, что в оригинальном шрифте System5x7.h значок градуса вынесен в последнюю строку таблицы, занимая символ 0x80, который у нас уже относится к кириллице. Чтобы не нарушать порядок построения кириллической таблицы в соответствии с UTF-8, эта строка выброшена из файла. А значок градуса пристроен вместо символа ASCII «

» (номер 0x7E), который в шрифте все равно не использовался по назначению. Зато такая замена позволяет вводить значок градуса в тексте скетча прямо с клавиатуры в виде символа «

Еще одна вольность связана с тем, что автор на дух не переносит перечеркнутый ноль — архаику времен АЦПУ и монохромных текстовых дисплеев. Потому ноль в модернизированном шрифте заменен на глиф буквы «О». Те, кто придерживается пуристических принципов, могут просто удалить в файле шрифта System5x7R.h эту вставку (старый глиф перечеркнутого нуля там оставлен закомментированным, его код 0x30).

В модернизированной библиотеке openGLCD, которую вы можете скачать по ссылке в конце статьи, внесено еще одно исправление — изменен порядок подключения выводов для дисплеев с контроллером ks0108. Почему автором библиотеки выбран такой порядок (см. таблицу по ссылке на официальном сайте Arduino), неизвестно. В модернизированном варианте подключение дисплея (для примера выбран популярный MT-12864J) осуществляется согласно вот такой схеме:

image

Переменный резистор R1 здесь подключается согласно рекомендации производителя, а резистор R2 служит для ограничения тока подсветки, если она подключена не к напряжению 5 В, а прямо ко входному источнику питания (вывод Vin Arduino) с более высоким напряжением.

Пример вывода на дисплей MT-12864J русского алфавита вперемешку с латинским, а также цифр и значка градуса, представлен на фото:

image

Текст скетча для этого примера:

В следующей публикации мы попытаемся разобраться с русификацией строчных дисплеев. Как вы увидите, с ними все одновременно и проще и сложнее.

Эта программа позволит вам создать массив символов юникода в виде набора байт, где нарисован каждый символ юникода точками 1/0 (картинка символа).

Далее этот массив можно включать в свои исходники, например на С.

В результате ваше устройство может принимать например из интернета контент на UTF8 и вы сможете не зная на каком языке написан контент спокойно распечатать его например на термопринтере или вывести на ЖК экран и т.д.

Хочу выразить огромную благодарность разработчикам этой программы ибо они сделали великое дело.

Как подготовить массив для исходников на с

Import an Existing System Font

фотка 1

Выбираем фонт

Для нас лучше Courier New , т.к. это моноширинный фонт. Размер мы выберем 10. Потом объясню почему.

фотка 2

Далее указываем допустим , что хотим все символы включая Иврит к примеру. Это 0x05FF (1535) последний символ.

фотка 3

Далее программа думает, обрабатывает символы и выдает в результате 8*16 размер символа (вот почему мы указали размер шрифта 10).

То есть все символы прекрасно вписались в матрицу точек 8*16.

Далее остается сделать только экспорт :

Export to TFT and new GLCD (new library)

Все очевидно (коды символов подписаны).

фотка 4

Но есть только один ляп у разработчиков программы : то , что выше кода символа 32 (Code for char num 32) НАДО УДАЛИТЬ и забить байтами 16*32 шт. (лучше наверное нулевыми).

И в результате все получится на Ура!

Примечание : const uint8_t - в Atollic True Studio так лучше объявлять массив.

А вот так может печататься на термоленте:

фотка 5

Примечание : делайте исходники (сами файлы *.c,*.h) в UTF8 и тогда можно смело писать на разных иероглифах.

Делайте сайта на UTF8

Вот пример содержания страницы любого сайта , если он сделан на UTF8. В примере используется редактор notepad++.

" в этих шрифтах нарисован "пробел" шириной 1 пиксель. Если использовать "обычный" пробел в команде dmd.drawString, например, то его ширина будет 5 пикселей вне зависимости от чего бы то ни было. Также, между любыми двумя символами рисуется пробел в 1 пиксель - можно не ставить пробелы у знаков препинания.

Эти шрифты сходу можно вставлять в демку от Freetronics DMD:
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

если взять библиотеку DMD-STM32 - с этими матрицами можно изпользовать шрифты формата Adafruit - то есть практически любой размер на любом национальном языке.

В качестве платы управления я предпочитаю использовать STM32

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

mykaida аватар

Хреновая библиотека ИМХО.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Хреновая библиотека ИМХО.

которая? И почему?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

mykaida аватар

А это чего за херня?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

mykaida аватар

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Порядок записи бит и Байт для символов двухбайтовой высоты (16 пикселей) для библиотеки Freetronics DMD Снизу вверх, слева направо. Сперва верхние 8 пикселей (Байт), затем - нижние. Ширина символа - 5 пикселей. Объем - 10 Байт. (Настройки -> Преобразование -> Подготовка -> Сканирование -> Свой алгоритм)
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Снизу вверх, слева направо. Сперва верхние 8 пикселей (Байт), затем - нижние. Ширина символа - 5 пикселей. Объем - 10 Байт. Интересно, нафига букву размером 5х7 точек описывать массивом 5х16 ? Оперативную память некуда девать? Буква, которая легко помещается в 5 байт - в итоге займет 10. На картинке это хорошо видно.
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

DMD умеет в шрифты переменной высоты?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

DMD умеет в шрифты переменной высоты?

Вы бы почитали ссылки, что я вам даю - все проблемы. что вы описываете в "бложике" - давно решены. Люди собирают панно из десятков матриц и, конечно же, выводят туда текст не только высотой 16 пикселей.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

шрифт высотой 96 пикс


  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я не сомневаюсь, что космические корабли бороздят просторы мирового театра. Ссылка, что вы предоставили ведет на библиотеку для STM32. Вывод статичной иконки 16x16 в крайнем левом положении, при необходимости. На оставшемся месте текст кириллицей шрифтами трех размеров. В зависимости от длины текста с учетом размера шрифта: 1. Статическое отображение - текст влезает полностью 2. Скроллинг <-> влево-право туда-обратно - текст немного длиннее панелей 3. Вертикальный скроллинг - текст сильно длиннее панелей Контроллер управляющий панелью будет заниматься только приемом текста по i2c и выводом его на панель. Конкретный способ генерации шрифтов переменной высоты?
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Конкретный способ генерации шрифтов переменной высоты?

я вас ни за что не агитирую :), хотя библиотека поддерживает не только СТМ32. Хотите изобретать велосипед - пожалуйста, это же всегда интересно.

Просто вы, вроде бы, приглашали всех к дискуссии - вот я и указал вам на неэффективность выбранного метода описания шрифтов. Если вам реально интересно, как это улучшить - пссмотрите описание формата шрифтов Адафруит. Там для описании букв используется только прямоугольник, в котором реально есть закрашенные пиксели, без необходимости описывать обширные пустые области.

раз уж вы взялись изобретать свое - там пусть оно будет немного лучше уже готового. А проектов вывода кирилицы на матрицы P10 в интернете довольно.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я не сомневаюсь, что космические корабли бороздят просторы мирового театра. Ссылка, что вы предоставили ведет на библиотеку для STM32. Вывод статичной иконки 16x16 в крайнем левом положении, при необходимости. На оставшемся месте текст кириллицей шрифтами трех размеров. В зависимости от длины текста с учетом размера шрифта: 1. Статическое отображение - текст влезает полностью 2. Скроллинг <-> влево-право туда-обратно - текст немного длиннее панелей 3. Вертикальный скроллинг - текст сильно длиннее панелей Контроллер управляющий панелью будет заниматься только приемом текста по i2c и выводом его на панель. Конкретный способ генерации шрифтов переменной высоты?

Вам просто сообщают, что вы стучитесь в открытую дверь. Поделка на фото - моя. И там не STM32, а вовсе даже esp8266 (с вебмордой и управлением по вайвай). И в качестве библиотеки использован стандартный DMD2 для атмег. Кучу поделок я делал на 168 и на 328 атмегах. С тем же самым DMD2. Так вот, с памятью проблемы бывали. На 168 постоянно, но и на 328 приходилось ужимать шрифты по максимуму.

И таки да, шрифты на DMD переменного размера (зависит от буквы).

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чувствую себя пользователем библиотеки Freetronics DMD. Моей проблемой был не дефицит памяти, не стремление к изящным техническим решениям, не страсть к изобретательству, но отсутствие и сложность изготовления шрифтов. Я рад что человечество уже решило эту проблему и с удовольствием воспользуюсь результатами чужих трудов. Пошел смотреть вашу библиотеку работающую в том числе на Arduino Uno на Atmega 328. Port of Freetronic DMD library for STM32Duino - DMD_STM32 with Unicode fonts support Скачал библиотеку Adafruit GFX ради её fontconvert Накатил Ubuntu на виртуалку, ибо fontconvert - линуксовый софт. В комплекте идет длинная инструкция как завести под Windows. Ищу ttf шрифты в составе дистрибутива и копирую в папку к fontconvert

Открываю получившиеся файлы и руками копирую массивы в один файл.

Что таки я ощутил:

1. Бегущая строка будто плавнее относительно Freetronics DMD
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Какие настройки в программе "LCD Image Converter " нужно сделать чтобы создать свой шрифт?

Я сделал свой шрифт по вашей инструкции но матрица выводит иероглифы

ссылки на мой шрифт

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Какие настройки в программе "LCD Image Converter " нужно сделать чтобы создать свой шрифт?

Я сделал свой шрифт по вашей инструкции но матрица выводит иероглифы

ссылки на мой шрифт

Если хотите, чтобы вам помогли - пишите подробнее

- какую библиотеку ДМД используете, какие матрицы, какая управляющая плата

- пытаетесь выводить на матрицу латиницу или национальные алфавиты?

- приведите код, работающий с матрицей

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Раз уж вы тут про фонты, вставлю свои 5 копеек.

Просто и удобно. Можно загружать системные фонты, можно рисовать свои. Лично я рисую свои - системные не отображаются в полной мере на всю высоту табло. На рисование фонта обычно трачу не больше часа - навострился.

1. Иногда при экспорте не правильно выставляет высоту фонта в пикселях (и фонт не показывается нормально), надо всегда проверять итоговой фонт.h.

2. Если в описании символа есть какие то знаки (не буквы и цифры), то не делает экспорт в h. Какие точно символы, мне лень проверять, поэтому я всегда эти символы не подписываю, а потом подписываю уже в файле h. В принципе их можно вообще не подписывать, но я люблю порядок и что бы в файле фонт.h я всегда мог найти нужный символ. Точно знаю, что мешают экспорту /,\, (,), - но это не весь список, остальные мне стало лениво вычислять. Просто не подписываю то, что обвел красным


И таки да, как вы можете видеть, ширина фонтов переменная. Все известные мне ДМД эти фонты употребляют вообще без проблем.

MT-12864J-rus

О том, как подключать ЖК-матрицу 128х64 точек MT-12864J и использовать ее для вывода изображений рассказывается в статье « Работа с ЖК-матрицей 128х64 ». Здесь мы подробнее остановимся на некоторых нюансах практического применения ЖК-матриц на основе контроллера KS-0108, а также рассмотрим вывод текста с помощью готовых шрифтов из библиотеки GLCD v3 и вопросы их модернизации для вывода кириллических символов.

Подключение MT-12864J

К сожалению, контроллер ks0108 имеет параллельный восьмибитовый интерфейс, и с учетом управляющих выводов, придется занять аж 13 функциональных контактов платы Arduino Uno. Число соединений можно сократить, если подключить ЖК-модуль через сдвиговый регистр или, что еще проще, дешифратор двоичного кода. В первом случае число линий данных сократится с восьми до одной плюс линия импульсов сдвига, во втором — до трех. Но в обоих случаях о стандартной библиотеке придется забыть, создавать свои схемы подключения и писать свои процедуры вывода.

Потому мы используем стандартный способ, но внесем в него некоторые изменения. Использовать именно те выводы Arduino, что предусмотрены библиотекой GLCD по умолчанию (см. таблицу в указанной статье или в описании библиотеки, где матрице MT-12864J соответствует вариант «Pinout A»), при таком их количестве не только неудобно, но часто просто невозможно. Не забудем, что ведь мы еще подключаем к контроллеру всякие другие устройства по стандартным коммуникационным портам, и стоит постараться не занимать их выводы по максимуму.

Модернизированная с учетом этого обстоятельства схема подключения к Arduino Uno приведена на рисунке ниже. Как видите, у нас оставлены свободными контакты D1 и D2 (RX и TX последовательного порта) и контакты А4-A5, участвующие в обмене через порт I²C. Одновременная работа со стандартным подключением SD-карты, требующим выводов интерфейса SPI (11, 12, 13, и, с некоторыми оговорками, 10) здесь уже оказывается невозможной.

glsdA

Обратим также внимание на резисторы R1 и R2, о которых почему-то авторы статей о графических матрицах часто забывают упомянуть. Переменный или подстроечный резистор R1 служит для регулировки контрастности индикатора. На схеме он подключен так, как рекомендуется в документации фирмы МЭЛТ, однако может подключаться и по схеме потенциометра: одним концом к «земле», другим к питанию 5 В, а средним выводом к контакту Vo индикатора. Номинал его выбирается в пределах 10-20 кОм, и в конечном продукте R1 можно заменить на постоянный резистор подобранного номинала.

Резистор R2 — токоограничивающий для LED-подсветки. В принципе его можно не устанавливать вовсе (и в документации он не упоминается), поэтому на схеме он обозначен пунктиром. Согласно документации МЭЛТ, ток подсветки тогда составит около 64 мА. Установить его следует в двух случаях: если вы хотите уменьшить ток (и, соответственно, пожертвовать яркостью подсветки) или если подсветка питается от отдельного источника с повышенным напряжением. Последний вариант обычно реализуется при смешанном питании, когда при подключении к сетевому источнику подсветка запитывается от нестабилизированного выхода адаптера питания 7-9 В, а при переключении на батарейку отключается вовсе — потребление контроллера модуля при выключенной подсветке составляет всего 4 мА (на подробностях реализации этого способа мы здесь останавливаться не будем). При указанном напряжении (7-9 В) резистор R2 должен погасить лишние 2-4 В, соответственно, его номинал должен составлять от 39 до 62 Ом.

Отмечу, что на свету при отсутствии подсветки дисплей MT-12864J выглядит даже лучше — больше контраст и углы обзора, а сама подсветка настолько тусклая, что при посторонней засветке экрана только снижает контраст, ухудшая различимость символов. То есть фактически она требуется только при эксплуатации экрана в темноте. Зато, вопреки ожиданиям, качество дисплея в отсутствии подсветки оказалось вполне на высоте.

Русификация модуля MT-12864J

Если еще не догадались, то мысленно поверните байтовый массив на 90 градусов влево, и вы увидите букву «Р», образованную единицами. Хитрость дополнения имеющейся таблицы состоит только в том, чтобы русские буквы соответствовали их кодам, получающимся при компиляции текстового файла с программой — вводить текст в программе через номера кодов не слишком удобно, приятнее писать его прямо по-русски.

В том же архиве имеется файл тестовой программы-примера Proba_LCD.ino, который выводит подряд символы русского алфавита и цифр, значок градуса и в нижней строке — наименование дисплея «MT-12864J»:

Из текста примера понятно, как обращаться с текстом при выводе. Текстовая зона с данным шрифтом получается 21 символ на 8 строк. При выводе строки длиннее 21 символа, ее конец автоматически перейдет на другую строку . Для принудительного перевода строки используйте функцию println. Чтобы правильно позиционировать вывод текста, следует иметь в виду, что библиотечная функция CursorToXY рассчитана на графический экран 128  64 точки. По этой причине при выводе текста указывать положение курсора удобно так, как показано в примере, с учетом того, что символ занимает 6 точек по ширине, а строка — 8 точек по высоте. Так как позиции в строке и сами строки нумеруются с нуля, то вывод символа в предпоследнюю (20-ю, т. е. номер 19) позицию пятой (т. е. номер 4) строки предваряем оператором CursorToXY(19*6,4*8).

Результат выполнения тестовой программы см. на фото (при выключенной подсветке — на снимке она была бы практически не видна).

Читайте также: