Arduino для начинающих. Урок 10. Подключение матричной клавиатуры и интересные схемы
Продолжаем серию уроков «Arduino для начинающих«. Сегодня подключаем матричную клавиатуру к плате Arduino, а также рассматриваем интересные схемы с ней. Сделать такую клавиатуру можно и самому из кнопок и печатной платы. В статье видео-инструкция, листинги программ, схемы подключения и необходимые компоненты.
Большая часть текста содержит объяснение программного кода, его можно скачать здесь либо посмотреть видео под статьей.
Сделать такую клавиатуру можно и самому. Для этого понадобится печатная плата, 12 или 16 обычных кнопок и соединительные провода. Я же буду использовать готовую.
Для чего нужна матричная клавиатура?
Для примера возьмем обычную кнопку. Как вы знаете, это простейшее электромеханическое устройство. Чтобы подключить ее к плате, нужно использовать стягивающий резистор, а также задействовать по одному контакту питания и «земли». Нажатием такой кнопки можно выполнить определенное действие, например можно управлять светодиодом, различными приводами, механизмами и так далее. А что, если нам необходимо подключить несколько кнопок? Тогда придется задействовать больше контактов и большее число проводов, да и без макетной платы уже не обойтись, плюс еще резисторы придется использовать в большем количестве.
Для этого и придумали такую клавиатуру, чтобы упростить подключение большего числа кнопок. Такие устройства встречаются везде — в клавиатурах компьютеров, калькуляторах и так далее.
Схема подключения матричной клавиатуры к Arduino
Подключать ее к плате следует 8 выводами, каждый из них считывает значения с определенных строк и столбцов. Подключать их следует к выводам на панели Digital. Я подключу, например, к выводам от 2 до 9 включительно. Нулевой и первый трогать не желательно, поскольку они предназначены для UART интерфейса (например, для подключения блютуз-модуля). Рациональнее оставить их свободными.
Так выглядит самая простая схема с использованием клавиатуры. Для более удобной работы с ней была написана библиотека Кейпад. Скачать ее, а также другие скетчи можно здесь.
После того, как вы установили в библиотеку, можно зайти в Ардуино IDE (программа с сайта Arduino) и посмотреть примеры скетчей.
Возьмем самый простой скетч для ознакомления. Он позволяет считывать значение с клавиатуры при нажатии определенной клавиши и выводить их в порт. В данном случае это монитор порта на компьютере.
#include <Keypad.h> // подключаем нашу библиотеку
const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры
char hexaKeys[ROWS][COLS] = {
{'1','4','7','*'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
{'2','5','8','0'},
{'3','6','9','#'},
{'A','B','C','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {9, 8, 7, 6}; //к каким выводам подключаем управление столбцами
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
}
Скетч очень простой. Стоит отметить первые строчки кода. Сначала подключаем библиотеку, затем указываем сколько строк и столбцов у клавиатуры, а потом нужно правильно расположить названия клавиш, чтобы было удобнее работать.
Если это сделать неправильно, то, например, при нажатии цифры 4, в порт выйдет цифра 6 или любой другой символ. Это можно определить опытным путем и расположить символы, как они расположены на клавиатуре.
Далее нужно указать к каким выводам на плате подключаем управление строками и столбцами.
В функции void setup указываем скорость последовательного соединения с монитором порта 9600 бод. Функция нужна только для подачи питания на модули. В функции Void Loop прописываем условие. Переменная Char используется для хранения только одного символа, например, 1, А или 5, что подходит к ситуации. Если нажатие зафиксировано, то происходит вывод символа в монитор порта с помощью функции Serial Print. В скобках нужно указывать, какую переменную выводим в порт. Если все сделано верно, в мониторе порта получим символ, на который нажимали. Не забудьте в мониторе порта внизу справа указать скорость передачи данных такую же, как в скетче.
Схема с дисплеем и матричной клавиатурой
Давайте выведем данные на дисплей.
Я использую дисплей, сопряженный с модулем I2C, который упрощает подключение. Для работы с дисплеем с шиной I2C необходимо установить еще одну библиотеку. Скачать ее можно здесь.
Далее нужно указать размерность дисплея. Используемый в примере дисплей вмещает по 16 символов в каждой из 2-ух строк, это я и указываю. В функции Void Setup нужно подать питание на дисплей и включить подсветку. Делается это с помощью двух функций: lcd.begin и lcd.backlight.
#include <Keypad.h>// подключаем нашу библиотеку
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры
char hexaKeys[ROWS][COLS] = {
{'S','4','7','*'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
{'O','5','8','0'},
{'S','6','9','#'},
{'I','B','C','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {9, 8, 7, 6}; //к каким выводам подключаем управление столбцами
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
lcd.begin(); // Инициализируем экран
lcd.backlight();
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
lcd.setCursor(1,4); //устанавливаем курсор
lcd.print(customKey);
}
}
В функции Voil Loop нужно в самом условии прописать строчку lcd.print для вывода данных на дисплей. И еще нужно предварительно установить положение курсора. В скобках идут 2 цифры: первая — это номер символа, а вторая — номер строки. Нужно помнить, что у этого дисплея отсчет строк и столбцов начинается не с единицы, а с нуля. То есть здесь имеются строчки под номерами 0 и 1, а не 1 и 2, как может показаться сначала. Затем загрузим код в плату и посмотрим, что будет.
Так как дисплей работает по интерфейсу I2C, подключаем к аналоговым выводам. Выходы SDA и SCL соответственно подключаем к А4 и А5, а остальные два — это уже питание и «земля».
Как видим, нажимая на любой символ, видим его отображение на дисплее.
Можно заметить, если вводить символы дальше, то каждый предыдущий будет стираться, а на его месте появляться новый. Поэтому, если вы хотите вводить символы подряд, то просто удалите строчку, где указано положение курсора.
Чтобы стереть строчку, вспомним калькулятор. Когда нужно было удалить значение, мы нажимали на кнопку сброса. Нажмем на такую кнопку в плате и можем заново набирать символы.
Подключение клавиатуры к Arduino и управляющее действие
Последняя схема в уроке — выполнение заданного действия при нажатии определенной клавиши. Это основная цель подключения матричной клавиатуры к Arduino. По этой теме будут две отдельные статьи и видео, описывающие более сложные и интересные схемы. А сейчас знакомимся с этим модулем и запоминаем построение кода с его использованием.
Попробуем при нажатии определенной клавиши включать или выключать светодиод. Добавляем его в схему.
Я буду использовать макетную плату и резистор (желательно использовать от 150 до 220 Ом). Двумя перемычками замкну схему, подключив их к пинам питания и земли на плате Ардуино.
Схема будет работать так: при нажатии на 1 включается светодиод, при нажатии на 2 — выключается.
Светодиод в примере подключен к пину 8 на плате Ардуино.
#include <Keypad.h>
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns
char keys[ROWS][COLS] = { // Define the Keymap
{'1','4','7','*'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
{'2','5','8','0'},
{'3','6','9','#'},
{'A','B','C','D'}
};
byte rowPins[ROWS] = { 5, 4, 3, 2 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 9, 8, 7 ,6}; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );// Create the Keypad
#define ledpin 8
void setup()
{
pinMode(ledpin,OUTPUT);
Serial.begin(9600);
}
void loop()
{
char key = kpd.getKey();
if(key) // Check for a valid key.
{
switch (key)
{
case '1':
digitalWrite(ledpin, HIGH);
break;
case '2':
digitalWrite(ledpin, LOW);
break;
}
}
}
Давайте разберем скетч.
Возьмем первый скетч урока и просто его дополним. В начале с помощью полезной функции Define присвоим название подключенному к пину 8 светодиоду ledpin. В функции Void setup указываем сигнал со светодиода как выход.
Если бы не библиотека Кейпад для клавиатуры, пришлось бы прописывать то же самое для 8 пинов, с которыми связана клавиатура. В функции void loop условие. Нажатие определенной клавиши «приравнивается» к значению переменной key. Оператор Switch сравнивает значения переменной key и «дает» определенные команды в зависимости от этого значения. Состоит он из двух вспомогательных операторов Case и Break. Проще говоря, если будет найдено значение переменной, равное 1 , то будет выполняться действие. Оператор break служит командой выхода из оператора Case.
Соответственно при нажатии на 1 будет выполняться максимальная подача напряжения на светодиод и он будет гореть. При нажатии на 2 он гореть не будет. Это указывается в функции Digitat write, где в скобках задается название переменной и «указание» ей. Можно таким образом написать определенные команды для каждой кнопки и управлять большим количеством светодиодов или создать команду для включения всех светодиодов сразу.
Смотрите также:
Учебный курс «Arduino для начинающих»: главная страница.
Посты по урокам:
- Первый урок: Светодиод.
- Второй урок: Кнопка.
- Третий урок: Потенциометр.
- Четвертый урок: Сервопривод.
- Пятый урок: Трехцветный светодиод.
- Шестой урок: Пьезоэлемент.
- Седьмой урок: Фоторезистор.
- Восьмой урок: Датчик движения (PIR) на Arduino. Автоматическая отправка E-mail.
- Девятый урок: Подключение датчика температуры и влажности DHT.
Все посты сайта «Занимательная робототехника» по тегу Arduino.
YouTube канал Занимательной робототехники и YouTube канал ArturosTV, где публикуются видео-уроки.
Не знаете, где купить Arduino? Все используемые в уроке комплектующие входят в большинство готовых комплектов Arduino, их также можно приобрести по отдельности. Подробная инструкция по выбору здесь. Низкие цены, спецпредложения и бесплатная доставка на сайтах AliExpress и DealExtreme. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазин Амперка. Низкие цены и быструю доставку предлагает интернет-магазин ROBstore. Смотри также список магазинов.
Валерий
13.05.2017
Здравствуйте! Я начинающий по Arduino. Arduino Uno. Подключил клавиатуру, Информацию отображается на 8-разрядном семисегментном светодидном индикаторе, Установлены библиотеки LedControl и Keypad1 . Выводится переменная customKey. Вместо символов отображается код ASCII . 1 соотв 49, 2-50 , А-65 и т.д .
евгений
10.01.2018
Прошу прощения, а вы свои выложенные скетчи сами проверяете на работоспособность ? Попробовал запустить второй скетч, может у меня конечно софт старый, но он сразу не пошел, пришлось допиливать по анологии с других . Так еще и ошибка явная
#include
LiquidCrystal_I2C lcd(0x27, 16, 2); двух строчный индикатор!
lcd.setCursor(1,4); //устанавливаем курсор
Откуда 4 строка ?
Артур
10.01.2018
Добрый день, там 4 символ и 1 строка
Unknown
16.11.2018
Добрый день, вообще, эта строчка кода выдаст нам символ на второй строке и 5 символе, так как счет начинается с нуля.
Владимир
11.02.2018
зачем публиковать нерабочий код??второй код не пашет
saul
28.06.2018
Здравствуйте, я только начинаю осваивать IDE. Возник вопрос: как с помощью данной клавиатуры вбить многозначное число, котрое можно в дальнейшем использовать? например в качестве уставки для регулирования температуры. Заранее спасибо!
ЗЫ: Кстати эта статья лучшее, что я нашёл по теме подключения клавиатуры.
saul
28.06.2018
И как можно указывать несколько разных значений? Например для 2 ух уставок?
Глеб
31.01.2023
Можно использовать цикл, чтобы считывать нажатие каждой клавиши и добавлять ее значение к строке, которая будет хранить введенное число. Когда пользователь нажмет клавишу «Enter», эту строку можно преобразовать в число с помощью функции atoi() или strtol() и использовать для установки уставки температуры.
Можно считывать первую уставку, сохранять ее в переменную, а затем считывать вторую уставку и сохранять в другую переменную. Эти значения можно затем использовать для установки двух разных уставок.
Пример скетча;
(оде используется библиотека Keypad, чтобы обрабатывать нажатия клавиш матричной клавиатуры. Когда пользователь нажимает клавишу «A», начинается считывание первой уставки, и когда он нажимает клавишу «#», считывание прекращается. После этого строка, хранящая уставку, преобразуется в число )
#include
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{‘1′,’2′,’3′,’A’},
{‘4′,’5′,’6′,’B’},
{‘7′,’8′,’9′,’C’},
{‘*’,’0′,’#’,’D’}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey();
if (key == ‘A’) {
Serial.println(«Setting threshold 1»);
String threshold1 = «»;
while (true) {
char key = keypad.getKey();
if (key) {
threshold1 += key;
Serial.print(key);
}
if (key == ‘#’) {
break;
}
}
int threshold1Value = threshold1.toInt();
// use threshold1Value for setting threshold 1
}
if (key == ‘B’) {
Serial.println(«Setting threshold 2»);
String threshold2 = «»;
while (true) {
char key = keypad.getKey();
if (key) {
threshold2 += key;
Serial.print(key);
}
if (key == ‘#’) {
break;
}
}
int threshold2Value = threshold2.toInt();
// use threshold2Value for setting threshold 2
}
}
Глеб
31.01.2023
Чтобы использовать введенные числа как уставки, можно использовать переменные. Например:
#include
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int setpoint1;
int setpoint2;
void setup() {
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key >= ‘0’ && key <= '9') {
if (!setpoint1) {
setpoint1 = (setpoint1 * 10) + (key — '0');
}
else if (!setpoint2) {
setpoint2 = (setpoint2 * 10) + (key — '0');
}
}
else if (key == '#') {
setpoint1 = 0;
setpoint2 = 0;
}
Serial.print("setpoint1: ");
Serial.println(setpoint1);
Serial.print("setpoint2: ");
Serial.println(setpoint2);
}
}
Здесь для хранения уставок используются 2 переменные: setpoint1 и setpoint2. Каждый раз, когда пользователь вводит цифру с клавиатуры, она добавляется к переменной. Когда ввод завершен, уставки можно использовать в дальнейшем для управления температурой
Екатерина
27.01.2023
есть приборчик на 4, 7 сегментных индикаторах и сдвиговом регистре ch595 по spi выводятся цифры , может кто сталкивался с таким что бы вместо этих индикаторов по тому же spi туже информацию затолкать в мк и вывести на индикатор 1602 ?
Михаил
27.01.2023
Да, можно использовать тот же протокол связи SPI для вывода информации на ЖК-дисплей 1602 вместо 4, 7-сегментных индикаторов. Процесс будет состоять из нескольких шагов:
Подключите ЖК-дисплей 1602 к тем же контактам на плате Arduino, которые в настоящее время подключены к 4, 7-сегментным индикаторам.
Вам потребуется установить ЖК-библиотеку, позволяющую управлять дисплеем с помощью платы Arduino. Наиболее популярной библиотекой для этого является библиотека LiquidCrystal.
Затем вам нужно будет изменить код, который вы используете для вывода информации на 4, 7-сегментные индикаторы, чтобы он вместо этого отправлял информацию на ЖК-дисплей 1602.
Возможно, вам придется настроить расположение контактов, если вы используете другую библиотеку ЖК-дисплеев.
Стоит отметить, что для ЖК-дисплея потребуется больше памяти и вычислительной мощности, чем для 4-, 7-сегментных индикаторов, поэтому вам может потребоваться внести некоторые коррективы в код и проводку, чтобы обеспечить правильную работу дисплея. Кроме того, вам придется учитывать различное расположение контактов для ЖК-дисплея, в большинстве случаев для этого требуется минимум 6 контактов, тогда как для 4, 7-сегментного индикатора требуется только 2 контакта.
Важно проверить спецификацию конкретного ЖК-дисплея и чипа драйвера, вы должны убедиться, что распиновка и протокол связи совместимы с вашим микроконтроллером.
Николай
27.01.2023
можете использовать матричную клавиатуру для ввода числовых значений в Arduino при помощи библиотеки Keypad. Библиотека Keypad позволяет определять нажатия клавиш на матричной клавиатуре и преобразовывать их в символы или цифры. Вы можете использовать цикл while для ожидания ввода цифр и сохранять их в переменную, которую вы можете использовать для регулирования температуры.
можете использовать код ниже как основу для своего проекта и настроить его под свои потребности.
#include
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{‘1′,’2′,’3’},
{‘4′,’5′,’6’},
{‘7′,’8′,’9’},
{‘*’,’0′,’#’}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey();
if (key) {
Serial.println(key);
}
}