Приветствую Вас, Гость! Регистрация RSS

Воскресенье, 28.05.2017
Главная » Статьи » Cтатьи

Arduino Mega2560. Библиотека UTFT. Вывод кирилицы



ВВЕДЕНИЕ

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

ЧТО ТАКОЕ И С ЧЕМ ЕГО ЕДЯТ!

Наблюдая за тем, как мой друг увлеченно работает с «Ардуино», сам решил освоиться с данными девайсами. Посмотрев разнообразие модулей, и перечень микроконтроллеров, которыми «заряжены» ардуино-боарды, удивился тем, что на них стоят Atmel-камни. Меня честно порадовало Arduino Mega2560 и особенно Arduino Due c микроконтроллером ATSAM… . Кстати, на руках оба девайса.
Так дошло получилось, что это первый TFT-экран с которым я начал работать. Размер небольшой – всего 480х320 3.2 дюйма + отсутствует сенсор, и конечно по сравнению с экранами на контроллере SSD1963 (4.3’, 5.0’, 7.0’) - он маленький. Использовать библиотеку UTFT не составило сложности, и потратив некоторое время по набиванию кода в среде arduino-IDE 1.6.0, я разобрался с основными механизмами по выводу графики и текста на экран. Понравился тот факт, что среда поддерживает С++, и что самое замечательное – библиотека UTFT (и остальные ее производные), написаны на С++. Это дает всю гибкость программирования.
Собственно что качается радиотехнической части дисплея, то он не сенсорный, имеет 16-разрядную шину данных и линии управления.

 

 


Так же на борту имеется слот для подключения флэш-карточки. Угол обзора довольно приличный - на 50-60 изображение не мутнеет.
Вобщем кратко обрисовал небольшое вступление и теперь перейдем к основному вопросу - как вывести кирилицу на экран используя библиотеку UTFT. Основная плата процессора при осуществлении доработки библиотеки - Arduino Mega2560.

РЕШЕНИЕ ЗАДАЧИ

Основная идея заключается в следующем:

1. Добавить в файл DefaultFonts.c (каталог UTFT) таблицу с символами и кирилическими буквами - имя массива BigFontRus (можно любое название).

2. Написать два массива в файле реализации UTFT.cpp: первый массив содержит символы и кирилические буквы, второй массив содержит десятичные числа, по которым собственно и будет извлекаться символ из таблицы символов BigFontRus.

3. Добавить функцию tftChar, в которой будет реализован основной механизм определения символа и буквы кирилицы с последующим выводом его на экран TFT.

Теперь по порядку разъясню что к чему. По каждому пункту буду расписывать более подробно насколько сам освоил данный материал. И так:

По пункту 1. имеем - вывод символом осуществляется соответственно из файла DefaultFonts.c, но можно и другой файл создать, например RusFont.c и поместить туда таблицу символов и букв - в любом случае необходимо в программе указать шрифт, а откуда он берется не имеет значение. Ну и есть нюанс - символы, т.е. байты символом в массиве расположены несколько по иному - символ разделен попалам и половинки развернуты. На рисунке видно о чем речь (размер символа 16х16):



Так что рисовать шрифты в таком виде обернется большой рутиной. Необходим софт, который позволит конвертировать "правильный символ" в перевернутый. Лично такую утилиту не видел, но при должном понимании ее можно сваять самому.

По пункту 2. имеем - два массива соответственно с символами и байтами. Код этих массивов имеет вид:



С символами все понятно. Что же за цифры во втором массиве и почему начинаются с 32 по 135? Ответ: в таблице символов указано смещение 0х20 и оно как раз 32. Соответственно символы начинаются с 32-й позиции. Но это не проблема, можно поменять смещение на 0х00 и переписать массив байтов начиная с 0 по 103. Решил не переделывать :). Как используются данные массивы разъясню ниже.

По пункту 3. имеем - собственно так сказать СЕРДЦЕ всего содеянного с библиотекой UTFT. В методе tftChar осуществляется механизм определения символа и вывод символа из таблицы на экран посредством штатного метода printChar. Реализация метода tftChar имеет вид:



Такую реализацию я уже делал в несколько простом исполнении в статье доработка библиотеки lcd.h среды CodeVisionAVR 3.12. Собственно эту идею я использовал и здесь, и в библиотеке LCD5110_Graph, но о ней будет другая статья. И так по порядку - метод tftChar принимает три параметра:

- Символ (с). Это тот самый кирилический символ, который необходимо вывести.
- х координату вывода символа.
- y координату вывода символа.

Вся работа выолняется в цикле While, условием выполнения которого является несовпадение поступившего символа с с элементом массива character_rus - таким образом осуществляется поиск символа в массиве. Соотвественно при работе цикла происходит инкремент счетчика s. Счетчик позволяет перемещаться по элементам двух массивов. Выглядит это таким образом - пока символ с не совпадает с символом из массива, цикл работает, счетчик s инкрементируется до тех пор, как только символ найдется и далее по счетчику находим байт, и отправляем его в метод printChar. Если символ не нашли, то соответственно счетчик достигает максимального значения, при котором цикл завершается и условие if не выполняется. С помощью счетчика i умножив на ширину символа мы задаем шаг вывода символов, т.к. ширина 16 пикселов, то соответственно через 16 и должны выводить, иначе будет визуальный дефект "слипших символов". И если вы вдруг решите сделать свой шрифт, скажем размером 32х32, то в таблице символов (DefaultFonts.c) необходимо задать размер символа во избежании проблем с выводом. И еще один момент - условие if помагает избавиться от отображения мусора, который меня долгое время мучил и я не понимал почему так происходит. Оператор if меня избавил от этой напасти!
Думаю покумекав можно разобраться что к чему ;)

Проверить символы (с выбраным шрифтом соответственно в основном скетче среды) в файле DefaultFonts.c можно таким образом:



Параметром являются числа, которыми являются позиции символов в таблице. Это числа от 32 по 135 при задании шрифта BigFontRus. И вообще, таким образом можно проверять любые таблицы с символами.

РЕШЕНИЕ ЕЩЕ ОДНОЙ ЗАДАЧИ. ВЫВОД СТРОК

Теперь самое интересное - как выводить строки при помощи указателя и собственно параметром метода? Для начала какие методы нужно дописать в классе UTFT в файле UTFT.h. Методы имеют вид:



Первый метод позволяет выводить строки из указателя, т.е. так -

char *dht ="Влажность,%";
//и далее собственно
g.textRus(dht, 0, 19);

Второй метод позволяет выводить строки с указанием в параметре, т.е. так -

g.textRus("Напряжение,В", 0, 19);

Третий метод позволяет выводить символы из массива символов, которые предварительно прописаны в основном скетче программного проекта, т.е. так -

char dht[] ={'В','л','а','ж' ,'н','о','с','т','ь', ',','%'};
//и далее собственно
g.textRus(dht, sizeof(dht), 0, 19);

sizeof(dht) - указываем размерность массива (параметр length). Этот метод можно вообще удалить, но я не стал, оставил для каких либо нужд. Вообще этот метод я реализовал решив, что другого способа вывода кирилицы не найдется, т.к. через указатель долгое время не получалось осуществить вывод - вместе с символами отображался "мусор". Поэтому очаявшись хотел поставить на указателях крест, применив данный метод, даже утилитку сваял в среде Visual Studio 2008 C# для создания массива символов:



Ну и конечно собственно методы вывода строк, о которых я писал выше имеют такой вид:



Метод void UTFT::textRus(char *st, int x, int y) принимает указатель на строку и все действо происходит в цикле, и пока не "попадется" символ нуль-терминатора каждый символ по инкременту указателя *st будет передаваться в метод tftChar. По окончанию цикла обнуляем счетчик i.

С методом void UTFT::textRus(String st, int x, int y) я особо не заморачивался и взял готовую реализацию из библиотеки.

ЗАКЛЮЧЕНИЕ

На доработку библиотеки по выводу кирилицы я потратил где-то две недели, и когда мне все-таки удалось реализовать все "по-человечьи", я осознал, что мог это сделать за пару дней :) "...мысля приходит опосля..."

ФОТОМАТЕРИАЛ

Так выглядит физическая часть доработки. Качество фото конечно не лучшее.

ФАЙЛЫ

Доработанная библиотека и проект здесь

 

Категория: Cтатьи | Добавил: Автор (10.08.2015)
Просмотров: 5063 | Комментарии: 5 | Рейтинг: 0.0/0
Всего комментариев: 5
1  
Добрый день!Прошу подсказать в приложенном файле отсутствует <UTFT_Control.h>, так же ругается textRus. Заранее благодарен.

0
2  
Главный файл проекта подправил, <UTFT_Control.h> убрал, textRus должен работать. Если еще возникнут проблемы, пишите в личку
http://vk.com/kanakovivan

3  
А что это на 3-м фото за оконный режим? он есть в UTFT? в примере его нет. ил ручная разработка?

0
4  
Это сделано ручками. Можно написать библиотеку компонентов - кнопки, флажки, текстовые поля для ввода и т.д. Можно диалоговые сообщения делать. С данным дисплеем это будет не целесообразно, а вот с сенсорным дисплеем дюймов на 7 на контроллере SSD1963 будет само то.

5  
я понимаю, что можно, но мне не понятно как сделать обработку событий для элементов. Рою как оно в системе виндовс работает но пока главного не получается найти _ как сделать чтобы события обрабатывались мгновенно, а обработчики событий в элементах в которых может быть тяжелый относительно код работали в обычном режиме

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]