21 декабря 2013

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

Настройка Linux


С наступающим!
Проникшись идеями постов: «Поздравление по гиковски, без написания дров» и «Создание собственных драйверов под 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

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

Теги:happy new yearGPIOraspberryHD44780
Хабы: Настройка Linux
+26
38,9k 160
Комментарии 51
Лучшие публикации за сутки