Arduino, модуль Nokia 5110 LCD и кириллица



    Понадобилось мне, для небольшого проекта на ардуино, выводить кое-какую информацию, естественно на экран, а не в консоль. Купил парочку LCD модулей а-ля Nokia 5110 с разрешением 84 х 48 пикселей. Библиотеку решил использовать от Adafruit, точнее две Adafruit-PCD8544-Nokia-5110-LCD-library и Adafruit-GFX-Library. Если кто с ними ещё не знаком – позволяют выводить не экран текст (шесть строк по 14 символов), отображать заранее подготовленные изображения, рисовать (линии, прямоугольники, круги и т.д.), ну и рисовать попиксельно. Скетч pcdtest отработал нормально, и я приступил к написанию своего велосипеда проекта. Тут то и начались приключения…

    Оказалось, что в шрифте нет русских символов, а я так хотел. По первой же ссылке в гугле нашёл единомышленников, в комментарии #35 некий Droni поделился сделанным им редактором шрифтов и готовым шрифтом. На поверку, редактор оказался кривым – не отображал последний (256) символ, да и сам шрифт не доведён до ума – мало того, что в кодировке cp866, так ещё и не доделанный – в псевдографике пропущен символ (ошибка пришла из оригинала шрифта от adafruit), не хватает символов «Ё» и «ё». Сначала я пытался доработать шрифт в редакторе Droni, но когда обнаружил, что не отображается 256 символ – моё терпение лопнуло и я решил написать свой редактор с блекджеком и.... Редактор и шрифт в кодировке cp1251. Краткая инструкция: у редактора два рабочих поля – в левом редактируем выбранный символ (клацаньем лкм меняется цвет пикселя), в правом отображаются все символы шрифта, разделены красной линией на ASCII (с 0 по 127) и национальные (со 128 по 255), выбранный символ обведён синей рамкой, снизу отображается индекс выбранного символа в десятичной и шестнадцатеричной системах. Всё просто — открываем готовый шрифт, смотрим, что вам в нём не нравится и хочется изменить, редактируем и сохраняем. Обратите внимание – шрифты по идее 5х7 пикселей, по факту 5х8, нижний ряд пикселей используется, но только в таких символах как «Д», «Ц», «Щ», а по сути, он разделитель между строками. На экране каждый символ 6х8, то есть между символами используется интервал в один пиксель.

    Далее я обнаружил неожиданное поведение Wiring. Кодировка самого редактора utf-8, но если в файле preferences установить preproc.substitute_unicode=false, то при компилировании происходит перекодирование в системную кодировку, т.е. в cp1251. Получается, отключив «замену unicode» мы включаем конвертацию кодировок. Проще говоря – можно писать прямо в IDE на кириллице и после загрузки скетча в плату увидеть нормальный русский текст на экране.

    Ещё мне понадобилось выводить на экран пару иконок. Adafruit предлагают использовать конвертер Img2Code, но рисовать в GIMP попиксельно мне как-то не очень понравилось, искать бесплатный редактор для пиксель-арта было лень и я решил в дополнении к редактору шрифтов сделать ещё и редактор иконок. Редактор получился печальным, я пробовал рисовать небольшие иконки, поэтому было вполне удобно, но рисовать полноразмерную картинку (84х48) пожалуй, будет совсем не комфортно.

    Скетч демонстрирующий вывод на экран кириллицы (фото в начале статьи) и иконки (за основу взята картинка из этой статьи). Естественно скетч надо использовать с готовым шрифтом и правильными настройками Wiring.
    Скриншоты редакторов



    В заключении – редакторы написаны на Python 2, ни каких сторонних библиотек не требуется, т.к. интерфейс на Tkinter, ну и полагаю редакторы кроссплатформенные. Редакторы предназначены для зрячих – я работаю на нетбуке с экраном в 10”, поэтому элементы интерфейса весьма мелкие. За код мне честно очень стыдно, так что лучше его не смотреть.

    P.S.: Ирония судьбы – в своём проекте я в итоге отказался от кириллицы и иконок.
    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 12

      +2
      Есть старый трюк для избавления от простыней шестнадцатиричных кодов в исходниках — прилинковать двоичный ресурс непосредственно в выходной бинарник:

      balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/

      $ objcopy -I binary -O elf32-avr -B avr blob.bin blob.o --rename-section .data=.progmem
      


      Здесь мы требуем:
      1. -I binary На вход берем двоичный файл
      2. -O elf32-avr Выдаем объектный файл для архитектуры AVR На 32 здесь можно не смотреть, по факту, получается вот такое: Atmel AVR 8-bit, version 1 (SYSV), not stripped
      3. -B avr Бинарная архитектура целевого файла — AVR
      4. blob.bin Входной двоичный файл
      5. blob.o Выходной объектный файл, который будет создан
      6. --rename-section .data=.progmem Важный момент — указание поместить эти двоичные данные в правильную секцию — программную память контроллера

      Доступ из исходника:
      extern unsigned char _binary_blob_bin_start; // Объявили начало нашего бинарного массива
      

        +1
        Вообще тот же GIMP может экспортировать картинку в С-шный массив и Adafruit-GFX-Library умеет работать с этими массивами из коробки.
          +1
          А можно ссылку с примером?
            0
            Вечером сделаю скриншоты, но вообще все просто:
            1) делается экспорт в header, я обычно копирую в общий .h со всеми иконками(мне так больше нравится).

            2) указатель подсовывается в drawXBitmap()

            Реализация простая:
            drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
            {
            int16_t i, j, byteWidth = (w + 7) / 8;

            for(j=0; j<h; j++)
            {
            for(i=0; i<w; i++ )
            {
            if((bitmap + j * byteWidth + i / 8) & (1 << (i % 8)))
            {
            drawPixel(x+i, y+j, color);
            }
            }
            }
            }

            Недостаток в том, что реально точка хранится в байте, для монохромного дисплея это много.
            Но объявив все это как const мы пишем это во флеш, которого как правило море.
            Это для ARM, у AVR свои прагмы для компилятора и спец функции для чтения.
              0
              Про различие авр и армов в курсе, я более про гимп спрашиваю. Как получить сразу сишный файл?

              Был глуп, посмотрел экспорт, всё просто…
                0
                А в каком вообще виде используется проект?
                У меня картинки прекрасно принимаются по сети (в предыдущем варианте по USB).
                В данный момент монохромную картинку прожёвывает php и выдаёт ардуине.
                  0
                  В смысле проект, в котором я использовал картинки из гимпа и либу от адафрут?
                  Это наручные часы, никакой сети там нет.

                  Вообще это не очень сложно принять по сети и в таком же виде(как гимп) сложить это в архив.

                  Камера ваша прикольная, только кота почему-то не видно :(
                    0
                    Дрыхнет, видимо.
                    Через час-другой домой приду — придёт валяться на столе :)
            0
            Неужели до сих пор стоит такой вопрос?

            Года три назад, в самом начале ковыряния ардуины, делал что называется «для себя» (пример тут), по обрывкам чужого кода с англоязычных сайтов, зачастую методом тыка.

            Зато работает одновременно как с латиницей, так и с кириллицей, без редактирования preferences. При этом принимает кириллицу как забитую в скетч, так и принятую через LAN-модуль.
              0
              Текст QR-кода на потолке улыбнул, зачет!
              0
              Недавно потребовалось отредактировать шрифт для микроконтроллера, поиск в интернете результат дал, но не совсем нужный, про функцию сохранения картинок в C-формате в GIMP не слышал (надеюсь попробовать). Поэтому набросал на коленке мелкий редактор — загружаем массив байтов (у меня уже был ), каждый символ показывется в виде квадратиков. Нажимаем на квадратик, инвертируем цвет (черный-белый). затем сохраняем все обратно в текстовый файл. Есть функция из шрифта 8x8 сделать 16x16 путем растягивания (правда требуется дорисовать некоторые пиксели, как работает знаю только я). Задачу по работе выполнил с помощью нее и бросил полусделанную, шрифты могу редактировать, сглаживать углы. Если интересно: mcu_font_editor.rar (200К)
                0
                Здравствуйте, автор. Дочитал до последней строки и знаю, что вы всё закинули. Но можете, пожалуйста, помочь ленивому школьнику с этим делом. Есть эта библа, с дополнением для ssd1306. В preference.txt я изменил нужное true на нужное false и заменил массив в glcdfont.h из стандартного на тот, что в вашем файле. Когда попытался вывести слово «Часы», получил 8 крякозябр, что, наверное, свидетельствует о том что редактор таки конвертирует utf-8 в ascii. Что с этим делать? БОЛЬШОЕ СПАСИБО ЗА ЛЮБОЙ ОТВЕТ!

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

                Самое читаемое