- PVSM.RU - https://www.pvsm.ru -

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

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

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

Библиотека bcm2835

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

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

Новогодняя малина — прикручиваем экран HD44780 к Raspberry Pi
Тут не должно быть ничего сложного. Обратате внимание что у меня малина второй ревизии и распиновка разъёма немного отличается от первой.
Посмотреть распиновку разъёма на обе версии можно например тут [4].

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

Для удобной работы с экраном мною была написана простенькая библиотека самых важных на мой взгляд функций работы с экраном. Библиотека довольно сырая и неполная но для текущей задачи подойдёт.
Для начала её нужно немного настроить:
файл 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» отсюда [5]. Поэтому читать что либо из экрана настоятельно не рекомендуется. Чтобы всё работало по уму нужен преобразователь уровней, а не прямое подключение.

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

последовательности

Итак, управляющие последовательности, для нашего экрана:

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

Другие полезные команды, работают без префикса 33!

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

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

Например:
Инициализируем экран.

root@raspberrypi:/home/pi/lcd# echo -en "33[i" | ./lcd

Выводим текст.

root@raspberrypi:/home/pi/lcd# echo -en "33[R0041637041637251633[J33[HHappy New Year41*rn000000 RPI  LCD 000000" | ./lcd

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

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

Исходники

Сборка:

root@raspberrypi:/home/pi/lcd$ gcc -o lcd lcd.c HD44780.c -lrt -lbcm2835

Чтобы не потерять выкладываю в виде zipjpeg:
Новогодняя малина — прикручиваем экран HD44780 к Raspberry Pi

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

Автор: Hoshi

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/51283

Ссылки в тексте:

[1] «Поздравление по гиковски, без написания дров»: http://habrahabr.ru/post/206692/

[2] «Создание собственных драйверов под Linux»: http://habrahabr.ru/post/206148/

[3] bcm2835: http://www.airspayce.com/mikem/bcm2835/

[4] тут: http://www.hobbytronics.co.uk/raspberry-pi-gpio-pinout

[5] отсюда: http://elinux.org/RPi_Low-level_peripherals

[6] goodic: http://habrahabr.ru/users/goodic/

[7] dlinyj: http://habrahabr.ru/users/dlinyj/

[8] Источник: http://habrahabr.ru/post/206782/