Новогодняя малина — прикручиваем экран HD44780 к Raspberry Pi



    С наступающим!
    Проникшись идеями постов: «Поздравление по гиковски, без написания дров» и «Создание собственных драйверов под Linux» решил поделится ещё одним способом управления экраном на базе контроллера HD44780 с помошью Raspberry Pi.

    Библиотека bcm2835


    Основной задачей LPT порта, демоплат и прочих крутых штук, при управлении экраном, является — дёргать нужными ногами экрана в соответствии с получаемыми от компьютера данными.
    В моём случае нет разделения на комп и управляющюю плату так как у RPI есть прекрасный интерфейс General-purpose input/output (GPIO) которым можно рулить напрямую из программы. Для этого я решил использовать библиотеку bcm2835.

    Подключение экрана



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

    Программа управления


    Для удобной работы с экраном мною была написана простенькая библиотека самых важных на мой взгляд функций работы с экраном. Библиотека довольно сырая и неполная но для текущей задачи подойдёт.
    Для начала её нужно немного настроить:
    файл HD44780.h
    #define HD44780_DB4 RPI_V2_GPIO_P1_11
    #define HD44780_DB5 RPI_V2_GPIO_P1_12
    #define HD44780_DB6 RPI_V2_GPIO_P1_13
    #define HD44780_DB7 RPI_V2_GPIO_P1_15
    #define HD44780_RS RPI_V2_GPIO_P1_03
    #define HD44780_RW RPI_V2_GPIO_P1_05
    #define HD44780_E RPI_V2_GPIO_P1_07
    

    Тут требуется указать соответствия контактов GPIO и LCD, если схема подключения не отличается от приведенной ничего менять не нужно.
    Так-же, возможно, придётся поправить lcd.c:
    #define MAX_DISP_ROWS	2		// The HD44780 supports up to 4 rows
    #define MAX_DISP_COLS	16		// The HD44780 supports up to 40 columns
    

    Требуется указать размеры своего экрана.

    Важно: экран питается от напряжения 5 вольт, а малина работает с логическими уровнями напряжением 3,3в экран отлично понимает данные уровни, а вот малина, если экран попытается ей чтото передать может и не выдержать, ибо «GPIO voltage levels are 3.3 V and are not 5 V tolerant. There is no over-voltage protection on the board» отсюда. Поэтому читать что либо из экрана настоятельно не рекомендуется. Чтобы всё работало по уму нужен преобразователь уровней, а не прямое подключение.

    Работа с программой не слишком отличается от работы с портом из статьи goodic-а тут всё те-же управляющие последовательности так как основывался я на коде из его проекта который основан на проекте от dlinyj который использовал код за авторством Michael McLellan. OpenSource рулит. :)
    последовательности
    Итак, управляющие последовательности, для нашего экрана:

    • \033 = Отправка ESC-последовательности, с которой начинаются команды
    • [A = Переместить курсор на одну строку вверх
    • [B = Переместить курсор на одну строку вниз
    • [C = Сдвинуть курсор на одну позицию вправо
    • [D = Сдвинуть курсор на одну позицию влево
    • [H = Переместить курсор в левый верхний угол — домой (позиция 0,0)
    • [J = Очистить всё, НЕ возвращает курсор домой!
    • [K = Стирает до конца строки, НЕ возвращает курсор домой!
    • [M = Новая карта символов (ДЗ — объяснить зачем!)
    • [Y = Позиция Y (см. FAQ ниже)
    • [X = Позиция X (см. FAQ ниже)
    • [R = CGRAM Выбор ячейки памяти
    • [V = Прокрутка включена
    • [W = Прокрутка вылючена
    • [b = Подсветка включена-выключена (у нас работать не будет).


    Другие полезные команды, работают без префикса \033!
    • \r = Возврат каретки (возвращают курсор в позицию 0 на текущей линии!)
    • \n = Новая линия
    • \t = Табуляция (по умолчанию 3 символа)


    Единственное изменение: добавлена последовательность [i отвечающая за начальную инициализацию дисплея.
    Её нужно передать при первом обращении к экрану.

    Например:
    Инициализируем экран.
    root@raspberrypi:/home/pi/lcd# echo -en "\033[i" | ./lcd

    Выводим текст.
    root@raspberrypi:/home/pi/lcd# echo -en "\033[R0\004\016\037\004\016\037\025\016\033[J\033[HHappy New Year\041*\r\n\000\000\000 RPI  LCD \000\000\000" | ./lcd



    Из минусов данного решения можно заметить необходимость запуска программы из под прав администратора, это можно решить написанием драйвера, но с наскока разобратся как рулить малиной из ядра у меня не вышло.

    Исходники


    Сборка:
    root@raspberrypi:/home/pi/lcd$ gcc -o lcd lcd.c HD44780.c -lrt -lbcm2835
    Чтобы не потерять выкладываю в виде zipjpeg:

    UPD: sources
    UPD2: разобрался с драйвером, устройство /dev/gpiolcd, остальное так-же как и тут
    UPD3: Github

    С наступающим Новым годом!

    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 51
    • +9
      Для экономии пинов и уменьшения количества проводов советую использовать расширитель на i2c шине.
      image
      • +1
        Как точно он называется и где купить?
        • +2
          Тот, что на картинке вроде mcp23008.
          Лично я использую PCF8574 на плате, специально заточненной для LCD
          • +1
            Может кто знает, а есть ли подобные LCD уже изначально спроектированные под управление по SPI/i2c?
            • +1
              Есть дисплеи с уже припаянной платой. См. третью фотку в ссылке на ебае.
              • +1
                И правда, я почему-то сначала подумал что это пример использования.
              • +1
                Есть, у китайцев на DX/ebay видел кучу цветных дисплеев с SPI или I2C.
                • +1
                  И при этом с русской кодовой страницей?
                  • +1
                    Фиг знает, мне еще не довелось пользоваться.
                    Но, подозреваю, что т.к. дисплеи не символьные, то все должно быть в порядке.
                    • +1
                      Да вроде как раз символьные. И в статье, и в комментариях.
                      У китайцев проблема в том, что они практически никогда не указывают полную модель. Обычно пишут просто что-нибудь вроде LCD1602. Что там в верхней кодовой странице — пёс его знает! Скорее всего cn, jp или eu. Попасть случайно на нужную нам кириллицу очень маловероятно!
                      • +1
                        У модели в посте есть внутренняя память на 8 пользовательских символов(вот символ ёлочки тому пример), думаю разбавив ими латинницу можно получить более менее вменяемое отображение.
                        • 0
                          Тема уже пробегала однажды. Вот: habrahabr.ru/post/191988/#comment_6670120
                          В общем — есть индикаторы изначально с кириллицей. СтОят ровно столько же, сколько остальные. Просто нужно чуть поискать (на DX свет клином не сошёлся; а изделие таково, что и в российских магазинах (оффлайн и интернет) продаётся и стоит примерно столько же).

                          (8 символов есть не у «модели в посте» а вообще, у всех моделей на этом контроллере. Просто нужно понимать, что нырять в этот омут — дело неблагодарное. Начиная с того, что эти 8 символов, во-первых, может тупо не хватить. Во-вторых, до загрузки их придётся где-то хранить (хорошо если на другом конце серьёзная машинка. А если это микроконтроллер с килобайтом памяти «итого»? Юзать эти 8 символов конкретно под кириллицу, зная, что есть конкретно кириллические индикаторы — имхо бдсм)
                      • 0
                        Как-то давным-давно, лет 15 назад делал игрушку как раз с таким экранчиком (им тогда факсы комплектовались). Русский удалось сделать, использовав часть спецсимволов и 8 программируемых символов. Пришлось составить специальную таблицу перекодировки, получил даже маленькие и большие русские буквы.
              • +1
                Хм, это идея, к такому и преобразование уровней на паре резисторов можно прикрутить (провода всего то два).
                Но тогда схема будет более сложной к повторению, а одной из целей этого поста было дать схему с минимальным количеством компонентов.
                Ещё можно было использовать микросхемку FTDI в режиме bitbang, тогда получим USB экранчик.
                PS: Самое сложное, для меня, в подобных устройствах — добыть детали и время на разработку софта.
                • +1
                  Уже есть готовые библиотеки для работы с этими расширителями. Например при использовании wiringPi сложность не увеличится, т.к каждый такой дополнительный пин на плате расширения получает свой номер (вроде начиня со 100). Далее с ним работаешь как с обычным.
              • +1
                Большинство современных экранов на HD44780 нормально живет при напряжение 3.3В, нужно только уменьшить сопротивление в цепи управления контрастом до 10-500Ом (самый простой способ), либо подавать на это контакт отрицательное напряжение (с помощью источника или генерацией с контроллера). Проверено на пачке 16x2 LCD экранов с подсветкой которыми забит ebay.
                • +1
                  Есть такое дело, но на моём экране уж очень слабый контраст выходит, хотел его проапгрейдить по этому рецепту но так и не собрался заказать инвертор.
                • +1
                  А не проще взять nano Arduino + LCD с готовым припаянным контроллером на IIC. И управлять всем этим по COM порту с Raspberry Pi?
                  • +1
                    Ну, ардуины у меня нету, да и малина тогда не особо и нужна, сгодится и обычный ПК.
                    Про ардуину уже писали кстати, тут. Думаю особых переделок для нано не потребуется.
                    • +2
                      А зачем МК? RPi же имеет поддержку шины I2C.
                    • +1
                      Писал подобную либу на Питоне, с целью парсить погоду с яндекса и выводить на экранчик, если интересно — могу откопать
                      • +3
                        У меня была Raspberry Pi, и я ее благополучно продал. Т.к. смысла использовать нет. Если говорить про микроконтроллеры начального уровня то лучше использовать Arduino. Ваш пример прекрасно решается с помощью Arduino. Большинство публикация Raspberry Pi следущего характера: а теперь прикрутим датчик такой то, и в консоле увидим такие то данные. То что с успехом решается на Arduino без заморочек, на Raspberry Pi превращается в целое руководство. Получается нагромождение круто решаемых задач, которые на мой взгляд не стоят того. А целевой общей задачи нет. Пытались использовать Raspberry Pi для более серьезных задач. Файл-хранилище, мультимедиа центр, полная ерунда, низкая производительность, некоторые глюки, и за кодек нужно отдельно платить MPEG-2 license key. Короткое свое отношение о Raspberry Pi опубликовал в посте Короткое знакомство с одноплатным компьютером Raspberry Pi. На данный момент пытаюсь реализовать связку Cubietruck + Arduino + датчики. Идея заключается в создание конструктора для Android работы с датчиками. Но код составляется из набора шаблонов и заливается на Arduino автоматически. И нет необходимости в подобной писанине. Стоимость Arduino максимум 300 р. Время профи в случае решения инженерных задач будет весьма дороже Arduino. Поэтому на мой взгляд представленное решение в данной статья является экономически нецелесообразно, за исключением спортивного интереса.
                        • +2
                          Собственно спортивный интерес тут самое главное, мне казалось очевидным что те у кого нет малины не станут покупать её для работы только с экранчиком. Основным плюсом малины, на мой взгляд, является возможность дёргать ногами не особо вдумываясь в нюансы как оно там внутри работает и имея на борту полноценную ОС со всеми её плюшками, это больше универсальная платформа для разного рода опытов, проверки идей, отладки и прочее. Вот например такая задача как прошивка контроллера программатора легко решается с помощью малины и кучки софта. Или например передача показаний датчиков куда нибудь в интернеты и прочее на малине решается несколько проще. Понятное дело что серийное устройство никто на ней собирать не будет, но вот для отладки некоторых вещей она удобнее. В общем на малине можно налячкать тонны одноразового говнокода для проверки идеи не особо заботясь о доступных ресурсах. В конце концов RPI со слов создателя предназначалась в первую очредь для обучения программированию.
                          По поводу Arduino: я к ней оношусь с некоторой долей неприятия чтоли? в общем как отладочная плата она слабовата, мне больше по душе тот-же пинборд от DIHALT-а, а в готовых устройствах ардуина смотрится громоздко.
                          • +1
                            Основным плюсом малины, на мой взгляд, является возможность дёргать ногами не особо вдумываясь в нюансы как оно там внутри работает

                            Про Arduino могу сказать то же самое. Скачиваю библиотеки, а что внутри даже и не смотрю.
                            имея на борту полноценную ОС со всеми её плюшками

                            Практически во всех случаях кроме вывода в консоль, ничего не наблюдал из всех реализуемых богатых возможностях ОС
                            Или например передача показаний датчиков куда нибудь в интернеты и прочее на малине решается несколько проще.

                            Категорически не согласен. Если использовать FEZ Domino или Netuino Plus 2, на net micro framework. Пример: ThingSpeak .net Class
                            Mad Scientist Laboratory Temperature Monitor

                            DIY Weather Station with Arduino, Processing, and ThingSpeak
                            По поводу Arduino: я к ней оношусь с некоторой долей неприятия чтоли?

                            Почему? За решениями Arduino будущее. Количество проданных экземпляров Arduino и Raspberry Pi просто не равнять.

                            • +3
                              Практически во всех случаях кроме вывода в консоль, ничего не наблюдал из всех реализуемых богатых возможностях ОС

                              Вот давайте из последнего: заказали диспетчер звонков в школе с управлением со смартфона + автозагрузка конфигов звонков из указанного места. Это реализуемо на ардруине? Нет. Распбери обошелся 30 баксов + 5 баксов вайфай свисток. Дешевле мне видится только роутер+флешка+хаб+битбенг микросхемка. Да и то, не факт, что дешевле. А городить и отлаживать придется больше.

                              Кажется, вы просто не видите ниши Распбери, хотя она есть и весьма объемна.
                              • 0
                                Дешевле как раз на Arduino. У Вас Wi-Fi Dongle без роутера, а значит дальность не высокая. Используете смартфон? Bluetooth там точно есть. Берем:
                                Arduino UNO — $11.69
                                слот для SD карт(хранение конфигов и логов) — $3.83
                                модуль Bluetooth — $7.66
                                Итого: $23.18
                                Все из готовых модулей, паять не требуется. Ссылки на товары есть.
                                Это сложнее, дороже?
                                Даже если на провода добавим $5, все равно дешевле получается.
                                • 0
                                  Окей, спорить не буду, видимо вы действительно пытаетесь притянуть ардруину чисто из принципа. =)

                                  Допустим сэкономили мы 8 баксов. Скажите, за 8 баксов найдется человек, способный разработать управляющее ПО для Андроида, Айфона, Мака, ПК и Линукса? А если расписание нужно будет поменять удаленно? Я уже молчу, что одной из задач было обновление расписания с удаленного сервера по расписанию (простите за тавтологию), правда в продакшн не пошло.

                                  Предчувствую вопрос. Отвечаю: разработка веб-сервера на Python, умеющего рисовать веб-форму и дергать ножку GPIO заняло 2-2.5 часа, включая тестирование. Сколько займет разработка и поддержка приложений управления ардруиной по блютус для 3-4 платформ? Окей, пусть для 2х платформ. Ладно, для одной платформы. Ну и для самого девайса.
                                  • 0
                                    С этого и начали бы. Raspberry Pi у вас подключен к коммутатору. Добавляем Ehternet Shield за $10. И реализуем веб-сервер. Решаемо вполне.
                                    Окей, спорить не буду, видимо вы действительно пытаетесь притянуть ардруину чисто из принципа. =)

                                    Не правы. Я к тому что подчас достаточно простые задачи решаются довольно простыми методами. Сейчас в ИТ-индустрии стало модно городить проблемы и заумности. Особенно, если это касается Linux. Предвижу заранее гнев.
                                    • +1
                                      Хм. Вопрос про трудоемкость процесса разработки ПО как-то упустили.

                                      Я к тому что подчас достаточно простые задачи решаются довольно простыми методами.


                                      Помоему, все же, вы просто троллите. Одна плата, к которой подключен провод на GPIO, выполняющая скрипт из 50 строк и бутерброд из трех (минимум) шилдов, и слабо-поддерживаемый, трудоемкий в написании код с другой стороны… Я даже не знаю, что сказать.

                                      Впрочем, если вы способны реализовать на ардруине уно веб-сервер с обработкой GET или POST запросов и поддержкой простейшего HTTP-Auth, wget, парсер простейшего языка хранения данных типа JSON или CSV, шедуллер с часами реального времени, синхронизацию этих часов по NTP с интернетом, и все это за 2-3 часа, я лично готов поставить вам памятник.
                                      • 0
                                        Хм. Вопрос про трудоемкость процесса разработки ПО как-то упустили.

                                        Море уже готовых библиотек и кода. Большой сложности написать код нету.
                                        и слабо-поддерживаемый, трудоемкий в написании код с другой стороны…

                                        Не вижу никаких доказательств. С чего вдруг код стал слабо-поддерживаемый, трудоемкий?
                                        Впрочем, если вы способны реализовать на ардруине уно веб-сервер с обработкой GET или POST запросов и поддержкой простейшего HTTP-Auth, wget, парсер простейшего языка хранения данных типа JSON или CSV, шедуллер с часами реального времени, синхронизацию этих часов по NTP с интернетом, и все это за 2-3 часа, я лично готов поставить вам памятник.

                                        Тогда я возьму Netduino Plus 2. Там все это есть, без наличия ОС. Плата с Ethernet портом и слотом SD карт. И программного кода много. Цена: $59.95.
                                        • +1
                                          Тогда я возьму Netduino Plus 2.

                                          Хоч як, аби не так.

                                          Можно тогда уж выдать 60 баксов уборщице Тете Глаше, чтобы она кнопку жала в нужное время, как это сейчас и работает в 99% школ.

                                          Присоединяюсь к комментарию комрада CRImier ниже. Лучше не скажешь.
                                          • 0
                                            Тогда Вас prostosergik прошу сделать пост о своем проекте — Диспетчер звонков в школе с управлением со смартфона + автозагрузка конфигов звонков из указанного места. Я думаю всем будет очень интересно. С предоставлением схем подключения + исходный код. Я же, в свою очередь, демонстрирую решение задачи по своему варианту, ок? Тогда будет возможность по пунктам детально сравнить подходы
                                            • 0
                                              Да не вопрос, напишу. Там все настолько тривиально, что я даже не подумал об этом писать аж целую статью на хабр… Посмотрим, может кому и правда интересно будет.
                                              • +1
                                                Если подключение LCD, вызвало дискуссию. То Ваш проект будет точно интересен многим.
                                              • 0
                                                О, плюсую! Кстати, хочу вот поработать над простым демоном-будильником на Питоне. Взял бы что-нибудь из Вашего решения для старта, если опен-сорс, конечно =)
                                                • 0
                                                  Созванивался с коллегой, который заказчика искал, никто вроде не против выкладывания в опенсорц. Так что статье быть.
                                              • 0
                                                Крайности нести все горазды. Хотя бы напишите один пост. Посмотрим.
                                          • +4
                                            Да блин. Ну решение на одноплатном Линукс-компьютере заведомо проще того, которое основано на платформе Ардуино. Поясняю:

                                            1)Ардуина ограничена одним ЯП.
                                            Это значит, что:
                                            -вырастает стоимость разработки софта — поскольку нет возможности использовать язык проще, типа Питона
                                            -в частности для Ардуино всё не так хорошо с инструментами для дебага, поэтому проблемы ловить намного дольше, чем было бы с тем же Питоном под Распберри
                                            -внезапно может не найтись аналога библиотеки/программы/и т.д. которая сто лет есть под Линуксом. Ну, где там возможность быстренько запилить в одну строчку grep/sed/awk для Wiring? Что, свой велоипед городить? Ага, сейчас, уже бегу.

                                            2) Любые изменения в прошивке требуют физического контакта с платой
                                            -Да, если захочется добавить какую-либо фичу — придётся лезть с кабелем. Если захочется поменять звук звонка — придётся лезть с кабелем. Если захочется поменять фон веб-страницы — лезь с кабелем. Ну, если, конечно, это всё на карточку не выпихнуть — только проблема, в Распберри всё давно на карточке, и трахаться не надо.

                                            3) Отсутствие масштабируемости
                                            Если захочется добавить фичу — придётся докупать шилды, плюс внезапно можно быть в пролёте из-за всяких там конфликтов шилдов по пинам. А ведь ещё может памяти не хватить, если вообще хватило на начальном этапе. Бывает, да? А в Распберри — в худшем случае ещё что-нибудь воткнуть придётся в ЮСБ.

                                            4) Низкоуровневость.
                                            Чем ниже уровень разработки и выше уровень задачи, тем дольше разработка. Для низкоуровневых задач Ардуино подходит отлично. Для высокоуровневых — придётся описывать все высокоуровневые задачи на низком уровне, тратя время либо в допиливании либ, либо в написании своих.

                                            Моё мнение — Ардуино отлично подходит для исполнительных модулей типа моторчиковращателей/лампочкозажигателей/кнопочкосчитывателей по UART, I2C, SPI… А логику лучше переложить на что-нибудь поумнее и в нужный момент просто отдавать команды, так надёжнее. И тут у Распберри внезапно выясняется придаток — парочка GPIO, у которых есть все возможности, котрые нужны для реализации школьного звонка. Захочет — к имеющейся железке приделает школьное радио. Захочет — информационное табло на входе в школу и часики рядом. И время при этом сэкономит, и деньги. А платит всё равно заказчик — так почему бы ему цену не снизить за время непотерянное на Wiring, да ещё можно предложить допилить пару фич за небольшую плату, благо стоимость реализации этих фич внезапно окажется минимальной — масштабируемость-то хорошая.
                                            • 0
                                              Я категорически против Arduino + Ethernet Shield, потому что Ethernet Shield — это полноценный MIPS с линуксом внутри, так зачем тогда ардуино?
                                              Если уж делать TCP/IP на AVR, так тогда уж честно, а не так вот.
                                              • 0
                                                Подтягивайтесь в обсуждение. habrahabr.ru/post/207138/
                                                • +1
                                                  Ну вообще говоря, я не сторонник деланья всего на разберях :)

                                                  Просто если уж нужна сеть, вероятно, стоит брать процессор, который сразу её умеет, а не лепить к AVRу полноценный SoC с линуксом внутрях.
                              • +2
                                Ахренительно, я прямо счастлив, что дело живёт и радует глаз!!!.. Мои респекты и уважухи! За шрифт ёлочки отдельное спасибо!!! Вот моё гик-спасибо!!!


                                Спасибо и лес ёлок!!!

                                echo -en "\033[R0\004\016\037\004\016\037\025\016\033[J\033[HHappy New Year\041*\r\n\000\000 Thank  You \000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" > /dev/lptlcd
                                


                                Как рассылать и получать сообщения описано в группе.

                                Единственный вопрос: а почему не модуль ядра?
                                • +1
                                  но с наскока разобратся как рулить малиной из ядра у меня не вышло

                                  В общем я ещё копаю эту тему, если разберусь можно будет ваш драйвер поправить и использовать. ^_^
                                  • +1
                                    Забавно, что мы с DIHALT прежде, чем я запостил свою статью обсуждали, как это всё перенести под малинку.

                                    Надо посмотреть модули ядра, которые работают с GPIO (погуглить примеры) и заменить вывод в порт на вывод в GPIO в функции

                                     void expanderWrite(unsigned char _data)
                                    


                                    Всё. Элементарно Ватсон :))))
                                    • +1
                                      Готово. Добавил в конец поста линк.
                                      • 0
                                        Круто, мой респект!
                                • +3
                                  Для того, чтобы чтение с индикатора гарантированно не произошло (чтобы не сжечь RPI), нужно занулить вход RW. Читать с индикатора нечего, вообще-то. Если хочется использовать SPI, самое простое — подключить индикатор через микросхему 74HC(T)595. Это сдвиговый регистр, он легко подключается к SPI.
                                  • +1
                                    А есть ли возможность прикрутить к распбери какой-то дешевый несенсорный экран?
                                    Я искал и не нашел ничего по теме.
                                  • 0
                                    Большое спасибо за статью!!!
                                    Очень помогла при подключении MT-16S2H-2FLA к Raspberry pi 2

                                    Хотел бы только добавить 2 вещи!
                                    1. Занеимением резистора подключил ножку №3 дисплея к GND контаку на RPI и экран завелся!
                                    2. Посветка на моем дисплее включается только от 5V. Очень хочу научиться ей мигать. Думаю поставить реле, что ли. Или транзистор?

                                    image

                                    Учусь выводить текст на русском :))

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