Описание LCD Keypad Shield
LCD Keypad Shield – оригинальный дополнительный модуль, организующий работу с ЖК индикаторами, совместимыми с HD44780 интерфейсом, и пятикнопочной клавиатурой по шине SPI или I2C.


Модуль основан на микросхеме MCP23S17 или MCP23017 (16-разрядный расширитель портов ввода/вывода с SPI или I2C интерфейсом, соответственно).
Комплектация
Модуль LCD Keypad Shield поставляется либо в собраном виде (в вариантах для шин SPI или I2C), либо без монтажа штыревых компонентов (также в вариантах для шин SPI или I2C). К модулю прилагается вилка PLS-16.
ЖК-дисплей в комплект поставки не входит!
LCD Keypad Shield на шину SPI (с микросхемой MCP23S17).
LCD Keypad Shield на шину I2C (с микросхемой MCP23017).


LCD Keypad Shield DIY (без монтажа штыревых компонентов) на шину SPI (с микросхемами MCP23S17).
LCD Keypad Shield DIY (без монтажа штыревых компонентов) на шину I2C (с микросхемами MCP23S17).

ЖК индикатор 16x2 WH1602B-YYK-CTK c запаянными "низкими" (4мм) штыревыми разъемами - специально для LCD Keypad Shield.

Технические характеристики
Основные технические характеристики LCD Keypad Shield:
- интерфейс с ЖК индикатором: HD44780 совместимый, 4-битный, 16-pin;
- доступные программно выводы интерфейса HD44780: RS, RW, E, DB4-DB7, подсветка;
- интерфейс с платой Arduino: SPI или I2C (в зависимости от выбранной модификации модуля);
- 5 кнопок, опрашиваемых программно по шине SPI или I2C, кнопка сброса;
- разъемы для ЖК индикатора и внешних кнопок позволяют разнести плату Arduino и ЖК индикатор с кнопками;
- модулю задается трехбитный адрес на шине (с помощью перемычек), что позволяет размещать на одной шине до 8 устройств с аналогичными микросхемами;
- возможность выбора с помощью перемычки номера соответствующего выхода микроконтроллера Arduino (digital pin 8, 9 или 10) для сигнала CS шины SPI;
- в модуле применены "проходные" разъемы, позволяющие состыковывать несколько модулей без сдвига относительно платы Arduino;
Перед началом работы с дополнительным модулем Expander Shield рекомендуем ознакомиться с его принципиальной электрической схемой.
принципиальная схема по лицензии Creative Commons Attribution-ShareAlike 2.5
Подготовка модуля к работе
На выводы модуля могут быть одеты транспортировочные фиксаторы, которые необходимо снять перед началом работы.
Выбор адреса модуля на шине
Модуль основан на микросхеме MCP23S17/MCP23017, для которой необходимо выбрать младшие три бита адреса на шине SPI/I2C. Биты выбираются с помощью перемычек на разъеме Address притягиванием битов 0, 1, 2 к "земле" (Gnd) или +5В (5V).
Адрес каждой микросхемы должен быть уникальным, и на одной шине можно разместить до 8 микросхем.

Таким образом, возможно, к примеру, подключение к плате Arduino восьми модулей LCD Keypad Shield, или четырех модулей LCD Keypad Shield и двух Expander Shield. Если применять I2C версии модулей, то вся конструкция будет задействовать всего 2 вывода платы Arduino!
При подключении нескольких модулей LCD Keypad Shield сами ЖК-дисплеи могут подключаються, например, с помощью шлейфов от дисковода, и угловых вилок PLS-16R.
При подключении нескольких модулей следует обратить внимание на то, что подсветка потребляет довольно большой ток - порядка 100-150 мА.

Управление подтяжкой шины I2C
Для I2C модификации модуля с помощью перемычек в левой части разъема XS включаются или отключаются резисторы, подтягивающие шину к +5В. Как правило, подтягивающие резисторы должны быть подключены если на шине I2C только одно устройство. Если устройств несколько, то резисторы подключаются только у одного из устройств.
Ниже представлено состояние перемычек при включенных подтягивающих резисторах и при отключенных . Также, для отключения подтягивающих резисторов можно просто снять перемычки.

Выбор номера вывода для управления сигналом CS шины SPI
Для SPI модификации модуля необходимо выбрать вывод микроконтроллера Freeduino/Arduino, используемый в качестве сигнала CS. Обычно используется вывод 10, что соответствует крайнему левому положению перемычки на разъеме CS. Переставляя перемычку на одно из двух других положений, возможен выбор 9 и 8 вывода соответственно.

Настройка контрастности дисплея
Для настройки контрастности дисплея используется подстроечный резистор R3. При неправильно настроенной контрастности на дисплее может быть совсем не видно символов, или видно очень плохо.

Библиотека MCP23xxx
Для упрощения работы с этим, и рядом других модулей, разработана библиотека MCP23xxx, предоставляющая простой интерфейс к функционалу микросхем серии MCP23xxx. Библиотека доступна для свободного скачивания: http://www.freeduino.ru/arduino/files/MCP23xxx.zip Библиотека совместима с ПО Arduino версии 1.0.5 (также предполагается совместимость и с более поздними версиями).
Фактически, это набор из двух библиотек: MCP23xxx и LiquidCrystal_MCP23x17.
Более подробно установка библиотек описана в разделе подключение библиотек. Структура каталогов папки libraries после установки должна стать такой:
/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx
В библиотеке MCP23xxx реализованы шаблоны классов, организующие работу с расширителями портов MCP23017, MCP23S17, MCP23008 и MCP23S08. Библиотека LiquidCrystal_MCP23x17 - это модифицированная стандартная библиотека LiquidCrystal, поддерживающая русский язык, и работающая через расширитель портов.
К библиотеке прилагаются примеры, поясняющие работу с ней. Также доступна для скачивания предыдущая версия библиотеки: http://www.freeduino.ru/arduino/files/MCP23x17.zip
Рассмотрим пример "Hello World" для I2C модификации модуля. В нем показано не только как инициализировать модуль и выводить на него данные, но и приведен пример опроса одной из кнопок.
//#include <SPI.h>
//Для I2C версии подключаем Wire.h:
#include <Wire.h>
//подключаем библиотеку
#include <MCP23xxx.h>
#include <LiquidCrystal_MCP23x17.h>
////Для SPI версии создаем объект класса CMCP23S17:
//CMCP23S17 MCP;
//Для I2C версии создаем объект класса CMCP23017:
CMCP23017 MCP;
//Объект для ЖК
LiquidCrystal_MCP23x17 lcd;
void setup() {
// //Для SPI версии конфигурируем шину SPI и объект MCP номером линии CS (10) и адресом (0)
// SPI.begin();
// MCP.init(10, 0);
//Для I2C версии конфигурируем шину I2C и объект MCP адресом (0)
Wire.begin(); //TWBR = 12; // <- так можно сделать 400kHz I2C
MCP.init(0);
//настраиваем объект LCD для работы через указанный объект MCP
lcd.init(MCP);
//...и включаем подсветку
lcd.Backlight(1);
//...остальной код одинаков и для оригинальной LiquidCrystal и для LiquidCrystal_MCP23x17
// настраиваем число столбцов и строк:
lcd.begin(16, 2);
// выводим сообщение.
lcd.print("hello, world!");
// кнопка Enter подключена к 12 выводу микросхемы MCP
MCP.pinMode(12, INPUT);
}
void loop() {
// устанавливем курсор
lcd.setCursor(0, 1);
// выводим время в секундах, начиная со старта:
lcd.print(millis()/1000);
// если нажата кнопка Enter, выводим сообщение
if (MCP.digitalRead(12)==0)
lcd.print(" Enter pressed");
// иначе, выводим пробелы, чтобы стереть сообщение
else
lcd.print(" ");
}