Внимание! Статья ориентирована преимущественно на новичков!
Во многих проектах появляется необходимость создания возможности ввода данных пользователем. Если вам нужно реализовать большое количество кнопок(относительно), то подключать их по-отдельности становится и долго, и нерационально. Для этой цели лучше выбрать какую-нибудь клавиатуру, но как и к любому выбору, к нему нужно подходить осознано. Какие же бывают виды клавиатур и как с ними взаимодействовать?
Глобально, все модули данного типа можно поделить на две большие категории: матричные и аналоговые.
Матричные клавиатуры
Самый простой, дешёвый и популярный вид клавиатур. Он относительно прост в изготовлении и заполняет собой большую часть рынка модулей ардуино. Выгледит чаще всего следующим образом:


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

Чтобы понять какая кнопка была нажата, нужно подавать сигнал на первые четыре контакта модуля и смотреть какой сигнал возвращается со второй. Но не стоит пугаться того, что вам придется писать алгоритмы обработки для восьми пинов вручную — в этом нам поможет готовая библиотека «keypad.h», благодаря которой нам не придется изобретать велосипед.
Подключение к плате
Подключение собственно модуля
В этой статье я воспользуюсь следующей схемой подключения:

У Вас наверное возникает вопрос: «Почему я решил использовать пины со второго по девятый, пропустив нулевой и первый?» — дело в том, что некоторые модули, используют их в качестве каналов RX и TX для получение и передачи данных соответственно. К примеру, блютуз модуль. По-этому с учётом возможного дополнения проекта другими модулями, было решено оставить данные пины подключения свободными.
Написание скетча
Для начала, для того, чтобы получить возможность использовать библиотеку для подключения клавиатур в коде, нужно установить её на ваше устройство. Это можно сделать следующим образом: в самой Arduino IDE нажимаем Скетч -> Подключить библиотеку -> Управлять библиотеками… либо используем комбинацию гарячих клавиш «Ctrl + Shift + I». В поиске вбиваем «keypad.h»(без скобочек) и нажимаем «Установка».
После установки приступаем к написанию скетча:
#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}; //к каким выводам подключаем управление столбцами //передаем все эти данные библиотеке: 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);//выводим нажатый символ в монитор порта } }
Плюсы и минусы
Минусы
- Слишком много пинов нужно подключить для работы. Это довольна крупная проблема, если вы создаёте не калькулятор или кодовый замок, а более масштабный проект, в котором еще нужно задействовать огромное количество различных модулей — возможно им просто не хватит пинов.
- Слишком низкое качество выполнения модуля: никто вам не гарантирует постоянный стабильный сигнал. Оригинальные клавитуры выполнены не на очень высоком уровне, а если вы вообще сделали заказ на Aliexpress, то скорее всего, вам предстоит исправлять косяки китайских инженеров паяльником, чтобы добится стабильной работы.
- Используется дополнительная библиотека, которая также будет занимать память микроконтроллера, которой у него и так не очень много. Если вы пишите большой проект с множеством функций и вычислений и вам каждый байт на счету нужно считывать данные с клавиатуры вручную либо использовать аналоговую клавиатуру.
Плюсы
- Низкая цена
- Легко найти в продаже
Аналоговые клавиатуры
Принцип работы
В аналоговых клавиатурах для изменения уровня напряжения используются резисторы, а сигнал выходит по одному каналу, который подключается в, собственно, аналоговый пин на плате. Как всё устроено можно понять взглянув на следующую схему:

Подключение к плате
Подключение выполняется очень просто, но может изменятся в зависимости от конкретной клавиатуры. В этой статье я буду рассматривать пример использование этой китайской аналоговой клавиатуры с али.
Итак: аналоговый выход клавиатуры соединяем с любым аналоговым пином на плате, контакт VCC на плате соединяем с 3.3V(не смотрите на надпись на самой клавиатуре, которая гласит о 5V — это ошибка), а GND на плате с GND на модуле. Вы можете воспользоватся следующей схемой:

Написания скетча
Здесь не нужно использовать сторонние библиотеки, т.к. всё предельно просто и понятно. Вот собственно и сам код, который считывает нажатую кнопку и выводит её номер, от 1 до 16(слева на право, с верху в низ) либо 0 если ничего не нажато, в монитор порта.
unsigned const short int KEYPAD_PIN = 0;//аналоговый порт для клавиатуры void setup() { Serial.begin(9600); analogReadResolution(10);//все аналоговые значение будут в диапазоне 0...1023 } void loop() { Serial.println(getPressedKeypadButton());//выводим номер нажатой кнопки в монитор порта } short int getPressedKeypadButton(){//считывает нажатия keypad`a //возвращает значение от 1 до 16 в зависимости нажатой кнопки или 0 если ничего не нажато const int OCCURACY = 5;//ошибка в точности определения значений int sensorValue = analogRead(KEYPAD_PIN);//читаем значение с датчика int keys[] = {1016, 937, 860, 794, 683, 641, 604, 571, 509, 485, 464, 444, 407, 328, 275, 236};//массив примерных значений для клавиш(0-15, где 0=1, 1=2 и т.д.) if(sensorValue > -OCCURACY && sensorValue < OCCURACY){return 0;}//если ничего не нажато, то сразу возвращаем 0 for(short int i = 0; i < 16; i++){//проверяем в цыкле с каким по номеру элементом массива совпадает значение с датчика if(sensorValue > (keys[i] - OCCURACY) && sensorValue < (keys[i] + OCCURACY)){ return i+1;//возвращаем на один больше, т.к. при проверке у нас 0 считается первой кнопкой, но для удобства 0 будет отсутсвием сигнала } } }
Плюсы и минусы
Плюсы
- Очень простое подключение
- Занимает лишь один пин
- Экономит память, которую вы не тратите под библиотеку
- Обеспечивает стабильную работу(при условии, если вы не будете нажимать более одной кнопки одновременно)
Минусы
- Стоит дороже матричных клавиатур
- Скорее всего единственным способом покупки будет заказывать с Китая и доставка займёт какое-то время
Итоги
Лично я рекомендую использовать именно аналоговые клавиатуры, так как они чаще-всего более качественные и подключать их проще-простого. Главное обращать внимание на таблицу значений нажатых кнопок, которую предоставляет производитель или же, если таковой нет, можно сделать эти замеры самостоятельно, выводя значения из аналогового порта в монитор порта, чтобы потом использовать их в коде. Но выбор, всегда остается за Вами: использовать стандартный дешёвый вариант либо переплатить ради значительных плюсов в некоторых ситуациях.
На этом у меня всё. Оставляйте свои вопросы в комментариях, пишите своё мнение и встретимся на просторах Хабра!
ссылка на оригинал статьи https://habr.com/ru/post/460409/
Добавить комментарий