Как из ардуино сделать клавиатуру. Использование клавиатуры совместно с Arduino

30.04.2019

Сегодня про так называемую резистивную клавиатуру или как подключить много кнопок на один аналоговый вход. Для этого был собран вот такой модуль, на котором 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. Чаще всего это относится к моделям с небольшим количеством выводов. Для этого была придумана матричная клавиатура. Такая система работает в компьютерных клавиатурах, калькуляторах, телефонах и других устройств, в которых используется большое количество кнопок.

Для 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 const byte ROWS = 4; const byte COLS = 3; char keys = { {"1","2","3"}, {"4","5","6"}, {"7","8","9"}, {"#","0","*"} }; byte rowPins = {5, 4, 3, 2}; byte colPins = {8, 7, 6}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key != NO_KEY){ Serial.println(key); } }

Arduino и матричная клавиатура

Клавиатура позволяет пользователям вводить данные во время работы программы. Это очень полезное и удобное устройство ввода. В радиолюбительских проектах также зачастую требуется вводить какую-либо пользовательскую информацию, и в этом случае прекрасно подойдет простая матричная клавиатура.



В этом обучающем проекте будет показано, как подключить 12-кнопочную матричную клавиатуру к Arduino и запрограммировать плату для работы с ней.


Мембранные клавиатуры являются экономичным решением для многих приложений. Они довольно тонкие и могут легко монтироваться там, где они нужны. Клавиатура с 12 кнопками имеет три столбца и четыре ряда. При нажатии этой кнопки один из выходов строки будет выведен на один из выходов столбца. Из этой информации Arduino может определить, какая кнопка была нажата. Например, при нажатии клавиши 1 столбец 1 и строка 1 замыкаются. Arduino обнаружит это, и в программе будет индицирована цифра 1. Порядок расположения строк и столбцов внутри клавиатуры показан на рисунке ниже.



В данном случае воспользуемся платой Arduino Mega 2560, подключим к ее выводам с 1 по 7 линии матричной клавиатуры 3x4 и будем выводить получаемые с нее данные в последовательный порт. Схема подключения платы Arduino Mega 2560 и матричной клавиатуры показана ниже.



Код (скетч) взаимодействия Arduino и матричной клавиатуры представлен далее.


#include "Keypad.h" const byte Rows= 4; // число строк 4 const byte Cols= 3; // число столбцов 3 // расположение цифр и символов в матрице: char keymap= { {"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"}, {"*", "0", "#"} }; // подключение к линиям Arduino: byte rPins= {A6,A5,A4,A3}; // строки с 0 по 3 byte cPins= {A2,A1,A0}; // столбцы с 0 по 2 // инициализация класса Keypad Keypad kpd= Keypad(makeKeymap(keymap), rPins, cPins, Rows, Cols); void setup() { Serial.begin(9600); // включаем последовательный монитор } // если клавиша нажата, ее номер сохраняется в переменной keypressed // если номер клавиши не равен NO_KEY, тогда он выводится в последовательный монитор void loop() { char keypressed = kpd.getKey(); if (keypressed != NO_KEY) { Serial.println(keypressed); } }

Это очень простой пример, но он наглядно демонстрирует, насколько легко можно подключить клавиатуру к вашему проекту и довольно эффективно ее использовать. Вы можете использовать этот тип ввода для многих разных проектов, в том числе для ввода пароля, ввода задания ШИМ-сигнала, ввода времени срабатывания таймера или будильника.

Эта статья посвящена матричной клавиатуре. Я расскажу об устройстве клавиатуры, её возможностях. И, конечно, статья содержит программный код с подробными пояснениями.


Собственно матричная клавиатурка.


Схема.


Все предельно просто. Если ни одна из кнопок не нажата, то между вертикальными линиями (1, 2, 3, 4) и горизонтальными линиями (5, 6, 7, 8) нет контакта. Нажатие кнопочки приводит к возникновению контакта между одной из вертикальных линий (1, 2, 3, 4) и одной из горизонтальных линий (5, 6, 7, 8). Например, нажатие кнопки S1 приводит к возникновению контакта между линиями 4 и 5.


Впрочем, никто не запрещает подключать эту клавиатурку к контроллеру через резисторы ом в 500. Это поспособствует защите контроллера от ошибок при подключении, а также программных ошибок.

Как работать с этой клавиатурой? Самая первая мысль, что приходит в голову, заключается в том, чтобы сконфигурировать выводы ардуино к которым подключены линии 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 void setup() { DDRB = 0b00000000; PORTB = 0b00000000; DDRC = 0b00000000; PORTC = 0b00000000; DDRD = 0b00000000; PORTD = 0b00000000; Serial.begin(9600); } void loop() { unsigned char x = 4, y = 4; DDRB = 0b00000000; PORTB = 0b00001111; _delay_us(10); // Wait 10 us DDRC = 0b00001111; PORTC = 0b00000000; _delay_us(10); // Wait 10 us if ((PINB & 0b00000001) == 0) x = 0; if ((PINB & 0b00000010) == 0) x = 1; if ((PINB & 0b00000100) == 0) x = 2; if ((PINB & 0b00001000) == 0) x = 3; DDRC = 0b00000000; PORTC = 0b00001111; _delay_us(10); // Wait 10 us DDRB = 0b00001111; PORTB = 0b00000000; _delay_us(10); // Wait 10 us if ((PINC & 0b00000001) == 0) y = 0; if ((PINC & 0b00000010) == 0) y = 1; if ((PINC & 0b00000100) == 0) y = 2; if ((PINC & 0b00001000) == 0) y = 3; if (x != 4 && y != 4) Serial.println(((y*4)+x+1)); _delay_ms(1000); // Wait 1000 ms } // // End // ////////////////////////
Результат работы программы можно наблюдать в мониторе порта Arduino IDE.


Основным недостатком описанного алгоритма является некорректная работа при одновременном нажатии нескольких кнопок. Здесь нужно сказать, что есть алгоритм для матричной клавиатуры позволяющий корректно обрабатывать одновременное нажатие двух кнопок. Но про него я расскажу как нибудь позже.

Клавиатуры позволяют пользователям вводить данные во время выполнения программы. Данная статья показывает вам, как подключить к Arduino 12-кнопочную клавиатуру, и как использовать библиотеку Keypad.h.

Клавиатура часто требуется для обеспечения ввода данных в систему на Arduino, и мембранные клавиатуры являются экономичным решением для многих приложений. Они довольно тонкие и могут быть легко установлены везде, где они необходимы.

В данной статье мы покажем, как использовать 12-кнопочную цифровую клавиатуру, похожую на ту, что вы можете увидеть на телефоне. 12-кнопочная клавиатура имеет три столбца и четыре строки. Нажатие кнопки замыкает вывод одной из строк с выводом одного из столбцов. Из этой информации Arduino может определить, какая кнопка была нажата. Например, когда нажата кнопка 1, замкнуты столбец 1 и строка 1. Arduino определит это и введет в программу 1.

На рисунке ниже показано, как внутри клавиатуры расположены строки и столбцы.

Эксперимент

В данном эксперименте мы продемонстрируем работу с библиотекой " keypad.h " для Arduino. Когда пользователь нажимает на кнопку на клавиатуре, программа отображает соответствующее значение в мониторе последовательного порта.

Необходимые комплектующие

  • перемычки (необязательно);
  • макетная плата (необязательно).

Схема соединений

Подключите клавиатуру к плате Arduino, как показано на рисунке ниже.

Код

/* Пример кода для руководства по работе с матричной клавиатурой 3x4 совместно с платой Arduino. Данный код выводит значение нажатой на клавиатуре кнопки в монитор последовательного порта. */ #include "Keypad.h" const byte Rows= 4; // количество строк на клавиатуре, 4 const byte Cols= 3; // количество столбцов на клавиатуре, 3 // определяем массив символов соответствующий распределению кнопок на клавиатуре: char keymap= { {"1", "2", "3"}, {"4", "5", "6"}, {"7", "8", "9"}, {"*", "0", "#"} }; // соединения клавиатуры с выводами Arduino задаются так: byte rPins= {A6,A5,A4,A3}; // строки с 0 по 3 byte cPins= {A2,A1,A0}; // столбцы с 0 по 2 // команда для библиотеки клавиатуры // инициализирует экземпляр класса Keypad Keypad kpd= Keypad(makeKeymap(keymap), rPins, cPins, Rows, Cols); void setup() { Serial.begin(9600); // инициализация монитора последовательного порта } // Если кнопка нажата, эта кнопка сохраняется в переменной keypressed. // Если keypressed не равна NO_KEY, то выводим значение в последовательный порт. void loop() { char keypressed = kpd.getKey(); if (keypressed != NO_KEY) { Serial.println(keypressed); } }

Заключение

Это очень простой пример, но я думаю, вы смогли увидеть, как легко получить в программе на Arduino данные ввода с клавиатуры. Вы можете использовать этот тип ввода во многих различных проектах, в том числе.

Похожие статьи