Клавиатура (keypad) - отличная возможность дать пользователю взаимодействовать с вашим проектом. Вы можете использовать их для навигации по меню, ввода паролей, управления играми и роботами.
В этом уроке рассмотрим, как настроить клавиатуру на Arduino . Сначала узнаем, как Arduino обнаруживает нажатия клавиш, а затем, как найти распиновку любой клавиатуры. В качестве простого примера посмотрим, как выводить нажатия клавиш на мониторе порта и на ЖК-дисплее. Наконец, узнаем, как активировать реле 5 В, когда пароль введен правильно.
В этой статье будем использовать матричную мембранную клавиатуру 4X4 (также есть код и схемы соединений для матричных клавиатур 3X4). Мембранные клавиатуры тонкие и имеют клейкую подложку, так что вы можете прикрепить их к большинству плоских поверхностей. Вы также можете приобрести телефонные клавиатуры, которые имеют более толстые кнопки, если вам нравится этот стиль больше. Даже клавиатуры от старых разобранных телефонов будут работать с Arduino.
Кнопки на клавиатуре расположены в строках и столбцах. Клавиатура 3X4 имеет 4 строки и 3 столбца, а клавиатура 4X4 имеет 4 строки и 4 столбца:
Под каждым ключом находится мембранный переключатель. Каждый переключатель в ряду соединен с другими переключателями в ряду с помощью токопроводящего слоя. Каждый переключатель в столбце подключен одинаково - одна сторона переключателя соединена со всеми другими переключателями в этом столбце с помощью проводящей трассы. Каждая строка и столбец выводятся на один контакт, всего 8 контактов на клавиатуре 4X4:
Нажатие кнопки замыкает переключатель между столбцом и строкой, позволяя току протекать между контактом столбца и контактом строки.
Схема для клавиатуры 4X4 показывает, как соединяются строки и столбцы:
Arduino определяет, какая кнопка нажата, определяя вывод строки и столбца, который подключен к кнопке.
Это происходит в четыре этапа:
1. Во-первых, когда ни одна из кнопок не нажата, все выводы столбца удерживаются на HIGH (1) уровне, а все выводы строки - в LOW (0):
2. Когда кнопка нажата, вывод столбца становится LOW (0) уровнем, поскольку HIGH (1) ток из столбца течет на вывод LOW (0) строки:
3. Теперь Arduino знает, в каком столбце находится кнопка и ему остается найти строку, в которой находится кнопка. Он делает это, переключая каждый из выводов строки в HIGH уровень и одновременно читая все контакты столбца, чтобы определить, какой вывод столбца возвращает HIGH:
4. Когда вывод столбца снова становится HIGH, Arduino определяет вывод строки, связанный с кнопкой:
Из диаграммы выше видно, что комбинация строки 2 и столбца 2 может означать только то, что нажата кнопка с цифрой 5.
Расположение выводов для большинства мембранных клавиатур будет выглядеть следующим образом:
Следуйте схемам ниже, чтобы подключить клавиатуру к Arduino Uno, в зависимости от того, какая у вас клавиатура 3X4 или 4X4:
Для базовой демонстрации того, как настроить клавиатуру, попробуем вывести каждое нажатие клавиши на последовательном мониторе порта.
Чтобы все это добро у нас заработало нам понадобится установить библиотеку Keypad от Mark Stanley и Alexander Brevig. Эта библиотека отвечает за настройку выводов и опрос различных столбцов и строк. Чтобы установить библиотеку клавиатуры, выберите «Управление библиотеками» и выполните поиск «keypad». Нажмите на библиотеку, затем нажмите установить.
После установки библиотеки клавиатур вы можете загрузить этот код в Arduino, если вы используете клавиатуру 4X4:
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[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 customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
}
Или этот код если вы используете клавиатуру 3X4:
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 3;
char hexaKeys[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 customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
}
Строки 3 и 4 в приведенном выше коде устанавливают количество строк и столбцов на клавиатуре.
Строки 6-11 определяют, какие символы печатаются при нажатии определенной кнопки на клавиатуре. Символы расположены так же, как они отображаются на клавиатуре. Если ваша клавиатура имеет другую раскладку, вы можете определить, какие символы будут печататься при нажатии кнопки. Например, скажем, у вашей клавиатуры есть столбец букв слева, а не справа. Вы просто изменили бы это на это:
char hexaKeys [ROWS] [COLS] = {
{'A', '1', '2', '3'},
{'B', '4', '5', '6'},
{'C' , '7', '8', '9'},
{'D', '*', '0', '#'}
};
После загрузки кода откройте последовательный монитор. Когда вы нажимаете клавишу, значение будет напечатано:
Теперь посмотрим, как выводить нажатия клавиш на ЖК-дисплее. Клавиатуры 4X4 используют 8 контактов, а клавиатуры 3X4 используют 7 контактов. Это занимает много пинов, поэтому мы будем использовать ЖК-дисплей с поддержкой I2C. В этом случае для подключения к Arduino потребуется всего 4 провода.
Чтобы использовать ЖК-дисплей с поддержкой I2C на Arduino, необходимо установить библиотеку LiquidCrystal I2C от Marco Schwartz. Эта библиотека хороша тем, что включает в себя большинство функций, доступных в стандартной библиотеке LiquidCrystal. Чтобы установить его, загрузите ZIP-файл ниже, затем перейдите в Sketch> Включить библиотеку> Добавить ZIP-библиотеку:
Библиотека Wire необходима для добавления поддержки связи I2C. Он поставляется в комплекте с Arduino IDE, поэтому его не нужно устанавливать. Но если по какой-либо причине он не установлен в вашей системе, перейдите в Управление библиотеками и найдите «wire», чтобы установить его.
После установки библиотек подключите контакты заземления и Vcc на ЖК-дисплее к Arduino, затем подключите выводы SDA и SCL на ЖК-дисплее в соответствии с таблицей ниже для различных плат Arduino:
Затем подключите клавиатуру к Arduino. Это должно выглядеть примерно так (для Arduino Uno):
Как только все подключится, загрузите этот код в Arduino:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[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 customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x21, 16, 2);
void setup(){
lcd.backlight();
lcd.init();
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(customKey);
}
}
Вам необходимо добавить адрес I2C вашего ЖК-дисплея в строке 20:
LiquidCrystal_I2C lcd (0x21, 16, 2);
I2C-адрес моего ЖК-дисплея - 0x21, но ваш, может быть другим. Адрес I2C вашего ЖК-дисплея должен быть указан в техническом описании , но если нет, вы можете найти его, запустив этот скетч I2C_Scanner.
Одним из наиболее полезных приложений клавиатуры является ее использование для ввода пароля. Вы можете установить пароль и заставить Arduino активировать реле или другой модуль, если пароль правильный. Следующий код активирует реле 5 В, если пароль введен правильно:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#define Password_Length 8
int signalPin = 12;
char Data[Password_Length];
char Master[Password_Length] = "123A456";
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[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 customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x21, 16, 2);
void setup(){
lcd.init();
lcd.backlight();
pinMode(signalPin, OUTPUT);
}
void loop(){
lcd.setCursor(0,0);
lcd.print("Enter Password:");
customKey = customKeypad.getKey();
if (customKey){
Data[data_count] = customKey;
lcd.setCursor(data_count,1);
lcd.print(Data[data_count]);
data_count++;
}
if(data_count == Password_Length-1){
lcd.clear();
if(!strcmp(Data, Master)){
lcd.print("Correct");
digitalWrite(signalPin, HIGH);
delay(5000);
digitalWrite(signalPin, LOW);
}
else{
lcd.print("Incorrect");
delay(1000);
}
lcd.clear();
clearData();
}
}
void clearData(){
while(data_count !=0){
Data[data_count--] = 0;
}
return;
}
Вы можете изменить пароль в строке 10, заменив текст 123A456 своим собственным паролем:
char Master [Password_Length] = «123A456»;
Длина пароля должна быть установлена в строке 5:
#define Password_Length 8
Пароль в приведенном выше примере имеет длину всего 7 символов, но длина пароля на самом деле больше, чем 7, поскольку в конце строки добавлен нулевой символ. Например, если ваш пароль длиной 5 символов, вы должны ввести 6 для длины пароля.
Выходной контакт, который активирует реле, определяется в строке 7:
int signalPin = 12;
Схема подключения к Arduino выглядит так:
Собственно, вот и все. Нетрудно настроить клавиатуру вообще. С небольшими пробами и ошибками вы сможете изменить приведенный выше код для работы с большинством проектов, для которых вы хотите использовать клавиатуру. Но если у вас возникнут проблемы, просто дайте знать в комментариях. Постараемся помочь.