Привет!! Сегодня речь пойдет о том как прикрутить к arduino вот такую вот клаву:
Итак что понадобится:- любая arduina (мини, микро, надо, гига)рџ�Ђ- библиотека для работы с клавой (можете найти в инете, или скачать под моим видео на ютубу ссылка на него чуть ниже)- сама клавиатура 4х3 ну можно и 4х4- Светодиод, серва, LCD, ну или то что есть под рукой.Купил значит на алише вот тут: http://ali.ski/VeHkytсей девайс за 40 рублей (наши рАссийские магазины в край охерели цены ломить), нашел в интернете готовую библиотеку под нее и понеслась!Включил короче ее вот так:
И давай выяснять, как ее можно использовать и как она работает. Все кто имел дело с ардуино наверняка подключали тактовую кнопку. Принцип работы основан на чтении состояния пина (HIGH или LOW) и по изменению состояния происходит какое-то событие. Клава вместе с библиотекой и вот таким массивом:(Массив для клавы 4х3)Работает так:1) Подключаем библиотеку2) Определение строк и столбцов3) Сосздание массива (см. Выше)4) Назначение пинов для строк и столбов5) Обьявление класса для клавы6) Обьявление локальной переменной типа char7) Запись значения нажатой кнопки в переменную8) Назначение событий для каждой кнопки9) Ну и собстно событие для данной кнопкиА теперь подробно:1) Подключается библиотека (ну это дажу гуманитарии знают как)2) Определение строк и столбцовconst byte ROWS = 4; // 4 строки const byte COLS = 3; // 3 столбца 3) Массив смотрите выше4) Назначение пинов для строк и столбцов. Слева на право по шлейфу клавы — сначало первыми идут строки, затем столбцы.byte rowPins[ROWS] = {8, 7, 6, 5}; //Подключение пинов строк byte colPins[COLS] = {4, 3, 2}; // Подключение пинов столбцов 5) Обьявляем класс6-7) В лупе обьявляем переменную типа char, и сразу же ей передаем значение нажатой кнопки.char Key = Keypres.getKey(); 8-9) Назначение события для каждой кнопки. Ну нажал я допустим кнопку 1. Основная переменная которая работает с клавой у меня char, и значения она хранит не цифры, а символы. Но это не беда! Операторам if или switch с ней работать просто. Я выбрал if.Как только условие if совпало со значением кнопки, у меня загорается светодиод.Более подробно тут:https://youtu.be/cfzE2QLOgBwВроде ничего сложного. Итого у меня клава заняла 7 цифровых пинов. Для проектов сойдет более чем. Кстати чтоб не париться за наличием малого числа свободных программируемых пинов есть сдвиговые регистры — занимают примерно 4 пина. А есть такая штука, как PCF8574Tдак она садится на шину I2C к которой можно присобачить овердохера девайсов, дает 8 новых вход/выход пинов. Ну для аналоговой части есть мультиплексоры.В будующих постах обо всем поговорим.
16
Самыми распространенными являются 16 кнопочные клавиатуры 4×4. Принцип их работы достаточно прост, Arduino поочередно подает логическую единицу на каждый 4 столбцов, в этот момент 4 входа Arduino считывают значения, и только на один вход подается высокий уровень. Это довольно просто, если знать возможности управления портами вывода в Arduino, а так же портами входа/ввода.
Для программирования можно использовать специализированную библиотеку Keypad, но в этой статье мы не будем её использовать для большего понимания работы с матричной клавиатуры.
Подключаем клавиатуру в любые порты ввода/вывода.
На красные порты будем подавать сигналы, а с синих будем их принимать. Зачастую на синие провода подводят подтягивающие резисторы, но мы их подключим внутри микроконтроллера Arduino.
В программе будем вычислять нажатую кнопку и записывать её в Serial порт.В данном методе есть один значительный недостаток: контроллер уже не может выполнять других задач стандартными методами. Эта проблем решается подключением матричной клавиатуры с использованием прерываний.
int PinOut[4] {5, 4, 3, 2}; // пины выходы int PinIn[4] {9, 8, 7, 6}; // пины входа int val = 0; const char value[4][4] { {'1', '4', '7', '*'}, {'2', '5', '8', '0' }, {'3', '6', '9', '#'}, {'A', 'B', 'C', 'D'} }; // двойной массив, обозначающий кнопку int b = 0; // переменная, куда кладется число из массива(номер кнопки) void setup() { pinMode (2, OUTPUT); // инициализируем порты на выход (подают нули на столбцы) pinMode (3, OUTPUT); pinMode (4, OUTPUT); pinMode (5, OUTPUT); pinMode (6, INPUT); // инициализируем порты на вход с подтяжкой к плюсу (принимают нули на строках) digitalWrite(6, HIGH); pinMode (7, INPUT); digitalWrite(7, HIGH); pinMode (8, INPUT); digitalWrite(8, HIGH); pinMode (9, INPUT); digitalWrite(9, HIGH); Serial.begin(9600); // открываем Serial порт } void matrix () // создаем функцию для чтения кнопок { for (int i = 1; i <= 4; i++) // цикл, передающий 0 по всем столбцам { digitalWrite(PinOut[i - 1], LOW); // если i меньше 4 , то отправляем 0 на ножку for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам { if (digitalRead(PinIn[j - 1]) == LOW) // если один из указанных портов входа равен 0, то.. { Serial.println( value[i - 1][j - 1]); // то b равно значению из двойного массива delay(175); } } digitalWrite(PinOut[i - 1], HIGH); // подаём обратно высокий уровень } } void loop() { matrix(); // используем функцию опроса матричной клавиатуры }
С использованием библиотеки считывание данных с цифровой клавиатуры упрощается.
#include <keypst byte="" rows="4;" const="" cols="3;" char="" keys="" rowpins="" colpins="" keypad="" makekeymap="" void="" setup="" serial.begin="" loop="" key="keypad.getKey();" if="" no_key="" serial.println="">
</pre>Привет, жители Хабра! Сегодня я решил сделать полный гайд по клавиатурам для Arduino.Внимание! Статья ориентирована преимущественно на новичков! Во многих проектах появляется необходимость создания возможности ввода данных пользователем. Если вам нужно реализовать большое количество кнопок(относительно), то подключать их по-отдельности становится и долго, и нерационально. Для этой цели лучше выбрать какую-нибудь клавиатуру, но как и к любому выбору, к нему нужно подходить осознано. Какие же бывают виды клавиатур и как с ними взаимодействовать? Глобально, все модули данного типа можно поделить на две большие категории: матричные и аналоговые.
Матричные клавиатуры
Самый простой, дешёвый и популярный вид клавиатур. Он относительно прост в изготовлении и заполняет собой большую часть рынка модулей ардуино. Выглядит чаще всего следующим образом:
Принцип работы
Понять как устроена данная клавиатура можно изучив следующую схему: Чтобы понять какая кнопка была нажата, нужно подавать сигнал на первые четыре контакта модуля и смотреть какой сигнал возвращается со второй. Но не стоит пугаться того, что вам придется писать алгоритмы обработки для восьми пинов вручную — в этом нам поможет готовая библиотека «keypad.h», благодаря которой нам не придется изобретать велосипед.
Подключение к плате
Подключение собственно модуля
В этой статье я воспользуюсь следующей схемой подключения: У Вас наверное возникает вопрос: «Почему я решил использовать пины со второго по девятый, пропустив нулевой и первый?» — дело в том, что некоторые модули, используют их в качестве каналов RX и TX для получения и передачи данных соответственно. К примеру, блютуз модуль. Поэтому с учётом возможного дополнения проекта другими модулями, было решено оставить данные пины подключения свободными.
Написание скетча
Для начала, для того, чтобы получить возможность использовать библиотеку для подключения клавиатур в коде, нужно установить её на ваше устройство. Это можно сделать следующим образом: в самой Arduino IDE нажимаем Скетч -> Подключить библиотеку -> Управлять библиотеками… либо используем комбинацию горячих клавиш «Ctrl + Shift + I». В поиске вбиваем «keypad.h»(без скобочек) и нажимаем «Установка». После установки приступаем к написанию скетча:
#include // подключаем библиотеку для управление клавиатурой 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);//выводим нажатый символ в монитор порта } }
Плюсы и минусы
Минусы
Плюсы
- Низкая цена
- Легко найти в продаже
Аналоговые клавиатуры
Принцип работы
В аналоговых клавиатурах для изменения уровня напряжения используются резисторы, а сигнал выходит по одному каналу, который подключается в, собственно, аналоговый пин на плате. Как всё устроено можно понять взглянув на следующую схему:
Подключение к плате
Подключение выполняется очень просто, но может изменятся в зависимости от конкретной клавиатуры. В этой статье я буду рассматривать пример использование этой китайской аналоговой клавиатуры с али. Итак: аналоговый выход клавиатуры соединяем с любым аналоговым пином на плате, контакт 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://pikabu.ru/story/kak_ya_podklyuchal_matrichnuyu_klaviaturu_4kh3_k_arduino_6025300
- https://www.robots4life.ru/arduino-keypad
- https://habr.com/post/460409/