Сегодня про так называемую резистивную клавиатуру или как подключить много кнопок на один аналоговый вход. Для этого был собран вот такой модуль, на котором 5 кнопок и несколько SMD резисторов, а так же 3 штырька для питания и выхода.
В общем как это все устроено.
Я надеюсь все знают как работает делитель напряжения. Есть 2 резистора подключенных последовательно в цепь питания и от средней точки этих резисторов снимается напряжение, величина которого зависит от падения напряжения на этих самых резисторах. А если совсем просто, то если на входе й нас 5 вольт и 2 резистора по 1кОм, то со средней точки мы будем снимать 2,5 вольт.
Теперь к кнопкам, тут тот же самый делитель напряжения только второй резистор подтягивается соответствующей кнопкой. Номиналы у резисторов разные и соответственно напряжение на выходе будет различаться, и зависеть от нажатой кнопки. Конечно же такую клавиатуру не получится использовать для управления радиоуправляемыми моделями , так как в ней может быть нажата только одна кнопка, при нажатии двух сразу сработает совсем другой номер кнопки.
Есть еще и другой вариант подключения. В этом случае кнопкой подтягивается несколько последовательно соединенных резисторов. Если не одна кнопка не нажата, то 5 вольт через резистор подаются на аналоговый вход, а при нажатии на кнопку подкидываем резистор и втягиваем часть напряжения на массу.
Это даже можно продемонстрировать. Ниже пример, который отправляет значение в serial которое считывает функцией analogread на выходе А0 к которому подключена клавиатура. Когда ничего не нажато в мониторе порта будет 1023, если надавить на кнопку это значение будет отличаться и зависеть от нажатой кнопки.
Осталось только различать эти значения в коде без условия if здесь не обойтись, а лучше вообще это вынести в отдельную функцию. К примеру эта функция будет key() и возвращает она байт
Byte key(){ int val = analogRead(0); // считываем значение с аналогового входа в переменную val if (val < 50) return 1; // сверяем переменную, если val меньше 50 возвращаем 1 (первая кнопка) else if (val < 150) return 2; // если val меньше 150 вторая кнопка и т.д. else if (val < 350) return 5; else if (val < 500) return 4; else if (val < 800) return 3; else return 0; // если ничего не подошло возвращаем 0 }
Void loop() { int sensorValue = analogRead(A0); // считываем значения с А0. Пригодится для отладки Serial .print(key()); // выводим номер кнопки в serial Serial .print(" "); Serial .println(sensorValue); // выводим значения с А0. Пригодится для отладки delay(1); // задержка между считываниями для стабильности }
Byte key(){ int val = analogRead(0); if (val < 50) return 1; else if (val < 150) return 2; else if (val < 350) return 5; else if (val < 500) return 4; else if (val < 800) return 3; else return 0; } // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial .begin(9600); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: int sensorValue = analogRead(A0); // print out the value you read: Serial .print(key()); Serial .print(" "); Serial .println(sensorValue); delay(1); // delay in between reads for stability }
Еще одним устройством, при помощи которого можно взаимодействовать с микроконтроллером Arduino , является клавиатура. Такую клавиатуру можно достать, к примеру, разобрав старый телефон или просто купив в магазине электротехники.
Клавиатуры бывают разных форм и размеров. Самые распространенные – это с расположением кнопок 3х4 или 4х4 . В продаже есть также клавиатуры с кнопками не только для цифр, но также для букв и даже слов.
Такие клавиатуры очень популярны среди тех, кто занимается проектами на базе Arduino . Они очень дешевые, и их можно использовать вместе с любым микроконтроллером.
Купить клавиатуру можно на eBay (к примеру, ), и она обойдется вам всего в пару долларов.
Мембранная клавиатура – это матрица, состоящая из кнопок, расположенных рядами и столбцами. Таким образом, каждая кнопка находится в каком-нибудь столбце или ряду (см. картинку ниже). 12 -кнопочная клавиатура состоит из 4 рядов и 3 столбцов. Цифра «1» стоит на перекрестии 1 ряда и 1 столбца (Р1С1 ), «2» – это Р1С2 , «3» – Р1С3 , «звездочка» – Р4С1 , «9» – Р3С3 и т.д.
Для нашего проекта понадобятся следующие компоненты:
Подсоедините эти компоненты друг к другу как показано на картинке ниже. Если ваша клавиатура выглядит по-другому, то подключите ее согласно информации из ее даташита (его можно найти в сети или спросить у продавца).
Для нашего проекта понадобится библиотека «Keypad». Чтобы установить ее, выполните следующее:
Если ваша клавиатура не работает с кодом ниже, то ее нужно подключить не так, как на картинке выше, а в соответствии с даташитом. Даташит можно найти в сети или спросить у продавца, у которого вы купили свою клавиатуру.
Примечание: Если у вашей клавиатуры другое количество клавиш, вам нужно будет поменять значения во 3-ей и 4-ой строчках кода. Кроме того, после этого нужно будет поменять значения в массиве, который расположен на строчках с 5-ой по 10-ую .
#include "Keypad.h"
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] = { 8 , 7 , 6 , 5 } ; // контакты для рядов:
// R1 = D8, R2 = D7,
// R3 = D6, R4 = D5
byte colPins[ COLS] = { 4 , 3 , 2 } ; // контакты для столбцов:
Эта статья посвящена матричной клавиатуре. Я расскажу об устройстве клавиатуры, её возможностях. И, конечно, статья содержит программный код с подробными пояснениями.
Собственно матричная клавиатурка.
Схема.
Как работать с этой клавиатурой? Самая первая мысль, что приходит в голову, заключается в том, чтобы сконфигурировать выводы ардуино к которым подключены линии 1, 2, 3 и 4 как вход с включенным подтягивающим резистором. А выводы ардуино к которым подключены линии 5, 6, 7 и 8 сконфигурировать как выход и установить на них логический ноль. Пока ни одна из кнопок не нажата, на выводах ардуино связанных с линиями 1, 2, 3 и 4 будет логическая единица. Если кнопку нажать, то на одном из выводов ардуино связанном с линией 1, 2, 3 или 4 установится логический ноль. Но с любой из этих линий связано сразу четыре кнопки. Чтобы узнать какая конкретно кнопка нажата нужно изменить настройки. Выводы ардуино к которым подключены линии 1, 2, 3 и 4 следует сконфигурировать как выход и установить на них логический ноль. А выводы ардуино к которым подключены линии 5, 6, 7 и 8 необходимо сконфигурировать как вход с включенным подтягивающим резистором. Теперь логический ноль будет на одном из выводов ардуино связанном с линией 5, 6, 7 или 8. С каждой из этих линий также связано сразу четыре кнопки. Однако у каждой из линий 5, 6, 7 и 8 есть лишь одна общая кнопка с каждой из линий 1, 2, 3 и 4. Кнопка, которая нажата, находится на пересечении линий на которых читается логический ноль при первом и при втором варианте настроек.
Для наглядности опишу как это все будет работать при нажатии кнопки S2. Выводы ардуино к которым подключены линии 1, 2, 3 и 4 сконфигурированы как вход с включенным подтягивающим резистором. Выводы ардуино к которым подключены линии 5, 6, 7 и 8 сконфигурированы как выход и на них установлен логический ноль. На выводах ардуино связанных с линиями 1, 2 и 4 будет читаться логическая единица. На выводе ардуино связанном с линией 3 будет читаться логический ноль. Такое возможно при нажатии одной из кнопок S2, S6, S10 и S14. Теперь настройки меняются. Выводы ардуино к которым подключены линии 1, 2, 3 и 4 сконфигурированы как выход и на них установлен логический ноль. Выводы ардуино к которым подключены линии 5, 6, 7 и 8 сконфигурированы как вход с включенным подтягивающим резистором. На выводах ардуино связанных с линиями 6, 7 и 8 будет читаться логическая единица. На выводе ардуино связанном с линией 5 будет читаться логический ноль. Такое возможно при нажатии одной из кнопок S1, S2, S3 или S4. У линий 3 и 5 есть лишь одна общая кнопка. Это кнопка S2. Нажатая кнопка находится на пересечении линий 3 и 5.
Программа.
////////////////////////
//
// Arduino Uno
//
////////////////////////
//
// Sketch: Matrix Keyboard
//
// Keyboard --- Arduino Uno
//
// 1 --- D11
// 2 --- D10
// 3 --- D9
// 4 --- D8
// 5 --- A0 (D14)
// 6 --- A1 (D15)
// 7 --- A2 (D16)
// 8 --- A3 (D17)
#include
Результат работы программы можно наблюдать в мониторе порта Arduino IDE.
Иногда мы сталкиваемся с проблемой нехватки портов на Arduino. Чаще всего это относится к моделям с небольшим количеством выводов. Для этого была придумана матричная клавиатура. Такая система работает в компьютерных клавиатурах, калькуляторах, телефонах и других устройств, в которых используется большое количество кнопок.
Для Arduino чаще всего используются такие клавиатуры:
Самыми распространенными являются 16 кнопочные клавиатуры 4x4. Принцип их работы достаточно прост, Arduino поочередно подает логическую единицу на каждый 4 столбцов, в этот момент 4 входа Arduino считывают значения, и только на один вход подается высокий уровень. Это довольно просто, если знать возможности управления портами вывода в Arduino , а так же портами входа/ввода.
Для программирования можно использовать специализированную библиотеку Keypad, но в этой статье мы не будем её использовать для большего понимания работы с матричной клавиатуры.
Подключаем клавиатуру в любые порты ввода/вывода.
На красные порты будем подавать сигналы, а с синих будем их принимать. Зачастую на синие провода подводят подтягивающие резисторы, но мы их подключим внутри микроконтроллера Arduino .
В программе будем вычислять нажатую кнопку и записывать её в Serial порт.
В данном методе есть один значительный недостаток: контроллер уже не может выполнять других задач стандартными методами. Эта проблем решается подключением матричной клавиатуры с использованием прерываний .
Int PinOut {5, 4, 3, 2}; // пины выходы int PinIn {9, 8, 7, 6}; // пины входа int val = 0; const char value { {"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, LOW); // если i меньше 4 , то отправляем 0 на ножку for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам { if (digitalRead(PinIn) == LOW) // если один из указанных портов входа равен 0, то.. { Serial.println(value); // то b равно значению из двойного массива delay(175); } } digitalWrite(PinOut, HIGH); // подаём обратно высокий уровень } } void loop() { matrix(); // используем функцию опроса матричной клавиатуры }
С использованием библиотеки считывание данных с цифровой клавиатуры упрощается.
#include
Клавиатуры позволяют пользователям вводить данные во время выполнения программы. Данная статья показывает вам, как подключить к Arduino 12-кнопочную клавиатуру, и как использовать библиотеку Keypad.h.
Клавиатура часто требуется для обеспечения ввода данных в систему на Arduino, и мембранные клавиатуры являются экономичным решением для многих приложений. Они довольно тонкие и могут быть легко установлены везде, где они необходимы.
В данной статье мы покажем, как использовать 12-кнопочную цифровую клавиатуру, похожую на ту, что вы можете увидеть на телефоне. 12-кнопочная клавиатура имеет три столбца и четыре строки. Нажатие кнопки замыкает вывод одной из строк с выводом одного из столбцов. Из этой информации Arduino может определить, какая кнопка была нажата. Например, когда нажата кнопка 1, замкнуты столбец 1 и строка 1. Arduino определит это и введет в программу 1.
На рисунке ниже показано, как внутри клавиатуры расположены строки и столбцы.
В данном эксперименте мы продемонстрируем работу с библиотекой " keypad.h " для Arduino. Когда пользователь нажимает на кнопку на клавиатуре, программа отображает соответствующее значение в мониторе последовательного порта.
Подключите клавиатуру к плате Arduino, как показано на рисунке ниже.
Это очень простой пример, но я думаю, вы смогли увидеть, как легко получить в программе на Arduino данные ввода с клавиатуры. Вы можете использовать этот тип ввода во многих различных проектах, в том числе.