Arduino Shield: назначение, подключение, программирование на примере LCD Keypad shield
Arduino Shields – платы расширения для ардуино.
Плата расширения Arduino – это законченное устройство, предназначенное для выполнения определенных функций и подключаемое к основному контроллеру с помощью стандартных разъемов. Такие платы, совершенно логично называемые "платами расширения", служат для выполнения самых разнообразных задач и могут существенно упростить жизнь "ардуинщика".
Плата расширения или Arduino shield?
Давайте сперва разберемся в терминах. Плата расширения Ардуино – это законченное устройство, предназначенное для выполнения определенных функций и подключаемое к основному контроллеру с помощью стандартных разъемов. Другое популярное название платы расширения – англоязычное Arduino shield или просто "шилд". На плате расширения установлены все необходимые электронные компоненты, а взаимодействие с микроконтроллером и другими элементами основной платы происходят через стандартные пины ардуино. Чаще всего питание на шилд тоже подается с основной платы arduino, хотя во многих случаях есть возможность запитки с других источников. В любом шилде остаются несколько свободных пинов, которые вы можете использовать по своему усмотрению, подключив к ним любые другие компоненты.
Англоязычное слово Shield переводится как щит, экран, ширма. В нашем контексте его следует понимать как нечто, покрывающее плату контроллера, создающего дополнительный слой устройства, ширму, за которой скрываются различные элементы.
Подключение к Arduino на примере шилда LCD Keypad Shield
Подключение шилда очень простое – нужно попасть ножками в соответствующие разъемы платы ардуино и аккуратно совместить их. Ничего дополнительно подсоединять или припаивать не надо. Нужно помнить и учитывать тот факт, что часть пинов зарезервированы для управления дисплеем и кнопками и не может быть использована для других нужд! Для удобства подключения дополнительного оборудования на плате выведены дополнительные разъемы 5В и GND к каждой контактной площадке аналоговых пинов. Это, безусловно, упрощает работу с датчиками. Также можно подключать цифровые устройства через свободные пины 0-3 и 11-13. Подключив шилд, мы можем работать с экраном и кнопками на нем так же, как с отдельными устройствами, учитывая только номера пинов, к которым припаяны соответствующие контакты.
| Контакт дисплея LCD 1602 | Описание | Контакт на LCD Shield |
| Пины LCD экрана | ||
| GND | Земля | |
| VDD | Питание 5В | |
| Contrast | Управление контрастом | Потенциометр |
| RS | Команды/Данные | 8 |
| R/W | Чтение/Запись | |
| Enable | Включение (активирование) | 9 |
| DB0 | Не используется | |
| DB1 | Не используется | |
| DB2 | Не используется | |
| DB3 | Не используется | |
| DB4 | Дата 1 | 4 |
| DB5 | Дата 2 | 5 |
| DB6 | Дата 3 | 6 |
| DB7 | Дата 4 | 7 |
| Back LED + | Включение подсветки | 10 |
| Back LED – | Питание подсветки | |
| Пины для кнопок | ||
| Кнопка UP | Управляющая кнопка | A0 |
| Кнопка DOWN | Управляющая кнопка | A0 |
| Кнопка LEFT | Управляющая кнопка | A0 |
| Кнопка RIGHT | Управляющая кнопка | A0 |
| Кнопка SELECT | Управляющая кнопка | A0 |
| Reset | Перезагрузка платы | Reset |
| ICSP | ICSP для перепрошивки встроенного микроконтроллера HD44780U | |
| UART | Контакты для UART соединения | 0, 1 |
Cкетч для работы с экраном и кнопками меню LCD Keypad shield
В данном примере мы определяем текущую нажатую кнопку и выводим ее название на экран. Обратите внимание, что для удобства мы выделили операцию определения кнопки в отдельную функцию. Также в скетче мы выделили отдельный метод для вывода текста на экран. В ней мы показываем сообщение (параметр message) и очищаем его через секунду. Нужно помнить, что в течение этой секунды нажатия кнопок не обрабатываются
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define BTN_UP 1
#define BTN_DOWN 2
#define BTN_LEFT 3
#define BTN_RIGHT 4
#define BTN_SELECT 5
#define BTN_NONE 10
int detectButton() {
int keyAnalog = analogRead(A0);
if (keyAnalog < 100) {
// Значение меньше 100 – нажата кнопка right
return BTN_RIGHT;
} else if (keyAnalog < 200) {
// Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP
return BTN_UP;
} else if (keyAnalog < 400) {
// Значение больше 200, но меньше 400 – нажата кнопка DOWN
return BTN_DOWN;
} else if (keyAnalog < 600) {
// Значение больше 400, но меньше 600 – нажата кнопка LEFT
return BTN_LEFT;
} else if (keyAnalog < 800) {
// Значение больше 600, но меньше 800 – нажата кнопка SELECT
return BTN_SELECT;
} else {
// Все остальные значения (до 1023) будут означать, что нажатий не было
return BTN_NONE;
}
}
void clearLine(int line){
lcd.setCursor(0, 1);
lcd.print(" ");
}
void printDisplay(String message){
Serial.println(message);
lcd.setCursor(0, 1);
lcd.print(message);
delay(1000);
clearLine(1);
}
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print("Arduino Master");
delay(3000);
lcd.setCursor(0, 0);
lcd.print("Arduino Master");
}
void loop() {
int button = detectButton();
switch (button) {
case BTN_UP:
printDisplay("UP");
break;
case BTN_DOWN:
printDisplay("DOWN");
break;
case BTN_LEFT:
printDisplay("LEFT");
break;
case BTN_RIGHT:
printDisplay("RIGHT");
break;
case BTN_SELECT:
printDisplay("SELECT");
break;
default:
//printDisplay("Press any key");
break;
}
}
