19.04.2009

LCD для Arduino

Ранее я уже расписывал, как подключить семисегментный дисплей к Arduino.

Семисегментный LED-дисплей прежде всего хорош тем, что имеет достаточно простую и надежную конструкцию, а при опытно подобранном токе через сегменты, легко читаем и с нескольких метров, и в кромешной темноте ;)

Дальше начинаются минусы: высокий ток потребления, необходимость схемы мультиплексирования разрядов, ограниченный набор синтезируемых символов. Все эти недостатки можно обойти в той или иной степени, с использованием экзотических (читаем: дорогих) компонентов.

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

Для экспериментов возьмем WinStar WH1602B-YYH-CTK:







Как видите, на самом деле - это модуль, состоящий из совместимого с Hitachi HD44780U контроллера, ЖКИ-матрицы и светодиодной подсветки.

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

Главное - не забыть, что на него подается три питания: одним питается контроллер со всей логикой (обязательно), вторым - LED-подсветка (опционально), а третьим - сам LCD-дисплей, и последнее напряжение надо уметь регулировать.

Для начала, вооружимся datasheet-ом и соберем типовую схему:



Мне для этого потребовался фрагмент вилки PLS на 16 контактов, чтобы дисплей легко стыковался с беспаечной макетной платой:



Таким образом, взять в руки паяльник придется - по крайней мере, один раз:



Дальше надо выбрать ширину параллельного интерфейса: 8 или 4 бит. Дело, конечно, не в скорости обмена, а в количестве цифровых входов Arduino, которые будут потеряны после подключения дисплея. Если выбрать 8-битный режим, то потребуется 11 выходов: к 8-битной шине данных добавляются линии RS, R/W и E(nable).

4-битная шина, соответственно, займет 7 выходов (если цифровых выходов все-таки не хватает, можно использовать и аналоговые, после переключения их в соответствующий режим), передача байта происходит в два цикла по линиям DB7-DB4, сначала старший ниббл, потом младший.

Хорошая новость состоит в том, что все эти тонкости нам не особенно важны: в основном, благодаря библиотеке LiquidCrystal (входит в Arduino IDE). Вот простой способ соединить Arduino и LCD-дисплей без паяльника:



В качестве тестового скетча можно использовать HelloWorld.pde из LiquidCrystal:

#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup()
{
// Print a message to the LCD.
lcd.print("hello, world!");
}

void loop()
{
}

Самая главная строка - это конструктор объекта lcd. Параметрами надо указать, к каким цифровым выходам Adruino подключены соответствующие выводы дисплея. Основное тело loop() пустое, поскольку инициализация и вывод текста в дисплей целиком происходит в setup(). Для нас это означает, что sketch отработает один раз после нажатия на reset, сразу после включения питания или же сразу после загрузки sketch-а в Arduino.

Итак, все готово, можно включать. Если дисплей пуст, обратите внимание на VO (питание сегментов, пин 3). Я взял потенциометр 20К, включил его между GND и 5V, а среднюю точку подключил к VO. Немного повращав отверткой ползунок, я легко добился читаемости символов:



Светодиодная подсветка "сидит" на двух последних пинах дисплейной колодки: 15 и 16 (анод и катод). Подключать ее вовсе не обязательно, но, при желании можно также воспользоваться типовой схемой:



Я использовал R = 34 Ом, яркость была средняя...

Подводя итог: LCD к Arduino можно подключить довольно быстро: есть библиотека для работы, хоть и максимально упрощенная (читать из дисплея, а также загружать знакогенератор она не умеет). Если верить документации, ток потребления дисплея = 1,2 мА, а LED-подсветки @ 4,2 В = 130 мА.

Встречаются модификации с разным цветом и типом подсветки (или вообще без нее), другим количеством рядов (1,2,4), другим количеством знакомест в ряду (8,16). Если все равно не хватает, надо подумать о графическом дисплее, но про это - как-нибудь в другой раз ;)

15 комментариев:

  1. Автору респект, т.к. накупил я тут партию подобных дисплеев, а вот подключить руки не дошли... А Arduino тоже есть, так что можно теперь поиграться да и использовать в поделках с мегой, это же тоже самое почти что и Arduino, кстати Arduino можно использовать таким образом как и программатор. Точнее писать код под Arduino, а использовать не в нем... Есть так же графический дисплей Nokia6610, подключал к Arduino Nano, сэмпэл заработал но много непонятного...

    ОтветитьУдалить
  2. Кстати как по поводу русских букв? Тут только английские а русские по таблице не попадают

    ОтветитьУдалить
  3. По поводу русских букв: никакой кодировки вообще нет.

    Английские буквы на месте, а дальше добавлены недостающие русские, т.е. буква "Ш" или "Г" - есть, а вот отдельных кодов для русских "А" или "С" нет - надо использовать их латинские аналоги.

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

    Готовлю статью про то, как получить возможность выводить по-русски на эти дисплеи в Arduino.

    ОтветитьУдалить
  4. А вот еще идея - подсветку подключить к ШИМ-выходу (ну может через ключ, чтоб гарантированно порт не пожечь), тогда можно будет плавно регулировать яркость, да еще и фотодиод задействовать, тогда подсветка будет автоматическая :-)

    ОтветитьУдалить
  5. Добрый день.
    У меня есть желание сделать инфо панель на LCD HD44780.
    Но так как я в программирование не силен может кто поможет или укажет в каком направлении рыть.
    Задача такая.От кнопки " по минусу" приходит сигнал и на панели высвечивается сообщение (Открытые двери,вода,масло,и.т.п...) в письменном виде. Может кто знает пример для наглядности типа - нажал кнопку вышло сообщение на LCD
    Буду очень признателен.

    ОтветитьУдалить
  6. Ещё МЭЛТ делает хорошие дисплеи, также совместимые с max7219

    ОтветитьУдалить
  7. То есть, s/max7219/HD44780 конечно же

    ОтветитьУдалить
  8. Сегодня наконец получил по почте CraftDuino и LCD дисплей.
    Подключил все как указано здесь: robocraft.ru/page/faq/#q15 (правда вместо потенциометра использовал обычный резистр на 20, 10 и 4.7 кОм). По Вашей схеме не понятно как подключать.

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

    LiquidCrystal Library - Hello World
    This sketch prints "Hello World!" to the LCD
    and shows the time.
    The circuit:
    * LCD RS pin to digital pin 12
    * LCD Enable pin to digital pin 11
    * LCD D4 pin to digital pin 5
    * LCD D5 pin to digital pin 4
    * LCD D6 pin to digital pin 3
    * LCD D7 pin to digital pin 2
    * 10K resistor:
    * ends to +5V and ground
    * wiper to LCD VO pin (pin 3)



    В итоге дисплей вообще пустой.

    Можно ли как то проверить дисплей, работает ли он вообще? Что посоветуете делать?

    ОтветитьУдалить
  9. Советую все-таки поискать потенциометр.

    Я в свои посылки с дисплеями его всегда вкладываю - поверьте, не просто так ;)

    ОтветитьУдалить
  10. Добрый день! Подскажите, пожалуйста как подружить с вашей библиотекой такой дисплей
    http://www.banggood.com/IIC-I2C-1602-Blue-Backlight-LCD-Display-Module-For-Arduino-p-950726.html?lang=en-GB ?

    ОтветитьУдалить
    Ответы
    1. Никак, она не поддерживает I2C. Только возьмите на заметку, что если у этого дисплея нет русского знакогенератора, то русифицировать его не получится. Об этом почему-то часто забывают любители китайских интернет-магазинов.

      Удалить
  11. Здравствуйте! глупый вопрос... если я подключу дисплей - смогу ли я подключать другие устройства? к примеру ргб светодиод, фоторезистор и две кнопки? или ард уно не хватит для этого?

    ОтветитьУдалить
    Ответы
    1. Почему же, очень даже сможете. На Arduino Uno больше половины пинов останется свободными - к ним и подключайте.

      Удалить
    2. спасибо за ответ! а если такой экран? http://ru.aliexpress.com/item/Free-shipping-2-4-inch-TFT-touch-LCD-Module-LCD-Screen-Module-For-Arduino-UNO-R3/2030189096.html?spm=2114.03020208.3.21.KA00Cn&ws_ab_test=searchweb201556_3_79_78_77_92_91_80,searchweb201644_5,searchweb201560_9

      Удалить
    3. Не советую Aliexpress... разве что только продавец проверенный. Если "такой экран", то "Использует цифровые Контакты 5-13 и аналогового 0-3. Это означает, что вы можете использовать Цифровые контакты 2, 3 и аналогового 4 и 5. Контактный 12 доступен, если не с помощью MicroSD".

      Так что контактов на UNO останется впритык, фоторезистор и две кнопки влезут, а вот для RGB-светодиода надо отказаться от MicroSD.

      Удалить