Пользователь
0,0
рейтинг
21 декабря 2013 в 11:31

Администрирование → Новогодняя малина — прикручиваем экран 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

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

Владимир @Hoshi
карма
49,7
рейтинг 0,0

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

Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (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

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

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