Подключение LCD дисплея к Raspberry Pi

  • Автор
Кто бы мог подумать еще в 2010 году, что такое явление как "Raspberry Pi" обретет тысячи поклонников по всему миру.
Не смог пройти мимо и я. Сегодня я покажу на примере как подключать и использовать LCD (хотя аббревиатура уже включает в себя слово "дисплей" далее я будут все равно его использовать) совместно с Raspberry Pi.



Скажу сразу: статья ориентирована на тех, кто не первый раз сталкивается с Raspberry.

Пример подключения LCD дисплея к Raspberry Pi


На борту Raspberry Pi имеет особый разъем типа GPIO. К нему-то мы и подключим дисплей.

Выбор LCD дисплея

Для наших целей подойдет любой жидкокристаллический знакосинтезирующий (символьный) дисплей на базе микроконтроллера Hitachi HD44780U или его аналогов. LCD дисплеи бывают 8x2, 16x2, 4x20 и т.д. - строк на количество знаков. Их выпускает куча разных фирм - Winstar, МЭЛТ и другие.Для сборки прототипа я приобрел дисплей Winstar WH0802A-YYH-CT. Теперь нужно определиться с порядком соединения пинов на разъеме IDC с пинами на GPIO, плюс разобраться как мы подключим питание к нашему дисплею.Оказывается все просто! В документации находим таблицу с распиновкой порта LCD дисплея для 4-х битного режима и дополняем ее следующим образом: 139160759652f23f2c8371a.jpgГде GND - это "минус", а +5V - "плюс" питания, которое мы берем все из того же GPIO разъема. Подписи GPIO - соответствуют ... ну вы сами догадались)Данный дисплей имеет подсветку. Для ее включения достаточно подключить LEDA к +5V, а LEDK - к GND. !ВНИМАНИЕ! Для использования LCD дисплея в данной схеме ваш источник питания, который вы подключаете к Raspberry Pi, должен быть рассчитан на потребляемый ток, как минимум, 2А.!ВНИМАНИЕ!
Выбор и использование библиотек для работы с LCD дисплеем
Для работы с LCD дисплеем нам нужно написать программу. Делать это я буду на языке Си. Но для компиляции листинга нам потребуется загрузить набор библиотек. Мой выбор пал на пакет библиотек wiringPi, который был использован в статье. Сам пакет предназначен не только для подключения LCD дисплея.Процесс установки пакета описан на сайте. Листинг "mylcd.c" с текстом программы я привожу ниже (по стандарту С99).

#include <stdio.h>  //стандартная библиотека ввода-вывода
#include <wiringPi.h> //библиотека из пакета wiringPi
#include <lcd.h> //библиотека из пакета wiringPi

int main (void)
{
printf ("Raspberry Pi LCD test\n") ;
//Инициализация порта GPIO
if(wiringPiSetup ()==-1)
{
printf ("GPIO Setup failed!\n") ;
}

int fd;
printf ("Start LCD initialization...\n") ;
//Инициализация LCD
fd = lcdInit (2,8,4, 11,10, 1,0,2,3,0,0,0,0);

if(fd==-1)
{
printf ("Initialization failed\n") ;
}
else
{
printf ("GO!\n");

//Очистка дислпея
lcdClear(fd);

//Перевод каретки на первую позицию первой строки
lcdPosition (fd,0,0);

//Вывод форматированного текста
lcdPrintf(fd, "Hello Pi");

//Перевод каретки на вторую строку и вывод текста
lcdPosition (fd,0,1);
lcdPrintf(fd, " World!");
}
return 0;
}


В листинге нас особо интересует следующие функции:
1. wiringPiSetup() - функция для инициализации порта GPIO2.
lcdInit(int rows, int cols, int bits, int rs, int strb, int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) - функция для инициализации LCD дисплея, где:* int rows - число строк дисплея (у нас 2)* int cols - число знаков в строке (у нас 8)* int rs - маппинг порта wiringPi на управляющий регистр дисплея RS (у нас 11)* int strb - маппинг порта wiringPi разрешающий регистр дисплея E (у нас 10)* int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7 - маппинг портов wiringPi на шину данных дисплея3.
lcdPrintf(int handle, char *message, …) - в качестве int handle передаем указатель на дисплей, * message - указываем в кавычках текст для вывода
139160766452f23f70d65d9.jpg
Теперь чуть подробнее про маппинг. В wiringPi используется понятие мапинга (привязки) физических пинов порта GPIO к "виртуальным" пинам - wiringPi. Таблица с маппингом приведена выше. Сопоставив ее с таблицей 1 мы и получим комбинацию fd = lcdInit (2,8,4, 11,10, 1,0,2,3,0,0,0,0);Пины int d4, int d5, int d6, int d7 в 4-х битном режиме не используются! Итак, мы сохранили листинг с программой в файле "mylcd.c" в директории /home/pi/wiringPi/ (которая создается автоматически после установки пакета).Далее для компиляции кода набираем в консоли:gcc -Wall -o mylcd wiringPi/mylcd.c -lwiringPi -lwiringPiDev Если не вывелось никаких "ворнингов" и "эрроров" - значит повезло программа написана верно!Для запуска программы набираем в консоли:sudo ./mylcd Получаем диагностические сообщения, которые мы сами и выводим:Raspberry Pi LCD testStart LCD initialization...GO! 139160771952f23fa723f02.jpg Смотрим на результат: 139160787652f240445df45.jpg

О том как подключить 4х строчный дисплей к Raspberry Pi читайте в моей оригинальной версии полной статьи, которая размещена в моем блоге:http://shabpoint.blogspot.ru/2013/09/lcd-raspberry-pi.html

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

Gasinskiy12
Привет! Спасибо за статью! Когда в прошлый раз пытался настроить дисплей, то читал твой блог, но у меня все равно так ничего и не получилось. Только подсветка и все, а никакой информации так и не смог вывести. Сейчас смотрю в блоге статья обновилась и стала еще интересней. Ну что ж еще буду пробовать ;-)
kirov1875
Привет! Тут есть два важных момента: программный и электронный.

Первое:
еще без подключения LCD нужно поставить все расширения (WiringPi), о которых шла речь в статье. Нужно добиться нормальной компиляции и выполнения вашей программы из листинга - чтобы в консоли выводились все диагностические сообщения об успешном выполнении.

Второе:
нужно внимательно еще раз проверить подключения проводников от GPIO к LCD, не перепутали ли вы распиновку и т.д. Проверить нумерацию и назначение выводов у вашего LCD по даташиту (документации на дисплей).

И уже после этого надо переходить к подключению экрана и опять запускать вашу программу.
И все получится!
Gasinskiy12
Это все понятно. Сам стараюсь все так и делать.

Программа работает без всяких "ворнингов" и "эрроров") Подключение несколько раз проверил, распиновку не перепутал и с даташитом сверил. Так что ни программных ошибок я не допустил, ни аппаратных, но дисплей все равно не работает.

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

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

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

Может есть еще какие-то идеи?

Друг купил Ардуинку, на следующей неделе поеду в общагу и попробуем к ней дисплей подключить, да и у него вроде такой же есть, его попробую к Raspberry Pi подключить.
Gasinskiy12
Подключил в 8-битном режиме. Уже лучше. Оказалось, что те прямоугольники, это еще не символ. Информацию видно, но только под углом. Надо потенциометр подсоединить чтоб яркость отрегулировать. И еще вместо некоторых символов отображаются другие символы, ну это уже видимо я биты перепутал. Надо перепроверить подсоединение проводников по которым данные передаются. Наверное дело в этом.
kirov1875
Насчет 8ми битного режима:
1. вы что подключили все 8 проводов шины данных? В моей статье коммутация по 4ем проводам.

2. для 8ми битного режима надо в программе соответствующим образом инициализировать порт GPIO

Ваши мерцания и квадраты говорят о том, что вы сделали неправильно по пункту 1 или 2.
Gasinskiy12
Да все 8 проводов, инициализировал соответствующим образом, так как написано на сайте библиотеки WiringPi, а именно тут: https://projects.drogon.net/raspberry-pi/wiringpi/lcd-library/ .
kirov1875
Ну 8ми битный режим это дополнительно 4ре причины перепутать подключения проводов))

А можете куда-нибудь выложить фото своего прототипа?
Gasinskiy12
Да я уже разобрал тот прототип, что был на макетной плате.
denfox12
В листинге пропали инклуды. Админам на заметку - исправить этот баг. Все что пишется в треугольных скобках воспринимается как тег HTML и не отображается.

Автор, пожалуйста, укажи что инклудится в листинге. Спасибо.
Gasinskiy12
Я кстати, тоже заметил, что библиотек нет, а включены такие библиотеки:
<stdio.h> //стандартная библиотека ввода-вывода
<wiringPi.h> //Arduino-подобная библиотека wiringPi
#include <lcd.h> //дополнительная библиотека из пакета wiringPi, для использования дисплея.
kirov1875
Привет!
Огромное спасибо за, то что заметили отсутствие библиотек!
Статью исправил!
Artemka1811
Спасибо за статью. А как подключить дисплей цветной ? от симеса например
kirov1875
От мобильного телефона? Укажите модель)
Artemka1811
Simens C65 к примеру? Так как он наиболее распостронен
Artemka1811
Пытался подклбчить, но пока что то не получается. Может есть идеи? Цветной TT дисплей подключить?
pilligirm28
Не знаете как запустить для MPD, что нужно прописывть чтобы проигрывало?
И показывало время?

Для написания комментариев необходимо зарегистрироваться