Матричная клавиатура и ардуино. Очень интересное и своеобразное сочетание. Глядя на матрицу представляется множество устройств, которые могут быть исполнены с помощью небольшой клавиатуры: умный дом, различные охранные системы и системы управления. В общем большой спектр возможностей, который может быть ограничен лишь вашей фантазией.

Как подключить матричную клавиатуру к Arduino? Легко! Сейчас мы это Вам докажем. А также подключим сервоприводы к Arduino, и будем ими управлять, посылая команды с клавиатуры.

Для урока нам потребуется:

  1. Сервоприводы 2шт.
  2. Матричная клавиатура
  3. Соединительные провода "папа - папа"

Цель урока:

Научиться подключать и работать с клавиатурой. Мы подключим клавиатуру к Arduino, Также в Arduino будут подключены два сервопривода. С помощью управляющих команд, которые будут подаваться с клавиатуры, сервоприводы будут вращаться.

Краткая теория:

Клавиатура типа 4x4. Имеет 16 кнопок с индивидуальными обозначениями. Цифры от 0 до 9, а также символы: " A " , " B " , " C " , " D " и " * ", " # ".

Ход работы:

Для начала давайте соединим клавиатуру и Arduino. Это делается по схеме указанной ниже:

Также для работы нам потребуется подключить сервоприводы. Сервопривод имеет 3 провода, обычно это: коричневый (подключается к GND), красный (подключается к 5V) и оранжевый (управляющий, в данном случае один сервопривод подключается к 11 пину, другой - к 10).

После того, как схема была собрана, можно переходить к написанию скетча. В данном скетче используется библиотека Keypad, необходимая для подключения клавиатуры. Ее вы можете скачать нажав на кнопку .

И так, скетч. Открываем Arduino IDE и вставляем следующий скетч:

#include // Подключаем библиотеку
#include
//используем библиотеку для работы с сервоприводом
Servo servo; //объявляем переменную servo типа Servo
Servo servo2; //объявляем переменную servo2 типа Servo
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys = {
{"1","2","3","A"},
{"4","5","6","B"},
{"7","8","9","C"},
{"*","0","#","D"}
};
byte rowPins = {2,3, 4, 5};
byte colPins = {6, 7, 8, 9};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int n1=0;
int n2=0;

Void setup(){
Serial.begin(9600);
servo.attach(11); //привязываем привод к порту 11
servo2.attach(10); //привязываем привод к порту 10
}
void loop(){
servo.write(n1); //ставим вал под 0
servo2.write(n2); //ставим вал под 0
char key = keypad.getKey();
if (key == "1") {
n1 = n1 + 45;
if (n1 > 180)
{ n1 = 0; }
}
else if (key == "2")
{ n1 = n1 - 45;
if (n1 < 0) { n1=180; }
}
else if (key == "3")
{ n1 = n1 + 90;
if (n1 > 180) { n1=0; }
}
else if (key == "4")
{ n2 = n2 + 45;
if (n2 > 180) { n2 = 0; }
}
else if (key == "5")
{ n2 = n2 - 45;
if (n2 < 0) { n2=180; }
}
else if (key == "6")
{ n2 = n2 + 90;
if (n2 > 180) { n2=0; }
}
​} ​

​Загружаем скетч в Arduino. И теперь нажимаем на кнопки 1 - 6. Кнопки с 1 по 3, отвечают за первый сервопривод, а кнопки с 4 по 6 - за вторую. При нажатии на кнопки 1, 2, 3, 4 сервоприводы будут менять свой угол поворота на 45 градусов, а при нажатии на 5 и 6 - на угол 90 градусов.

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); } }

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

Гайд по использованию мембранной клавиатуры с Arduino

Еще одним устройством, при помощи которого можно взаимодействовать с микроконтроллером 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 и т.д.

Необходимые компоненты

Для нашего проекта понадобятся следующие компоненты:

  • Одна плата Arduino (см. на eBay)
  • Одна мембранная клавиатура (см. на eBay)
  • Провода-перемычки

Схема

Подсоедините эти компоненты друг к другу как показано на картинке ниже. Если ваша клавиатура выглядит по-другому, то подключите ее согласно информации из ее даташита (его можно найти в сети или спросить у продавца).

Установка библиотеки

Для нашего проекта понадобится библиотека «Keypad». Чтобы установить ее, выполните следующее:

  • Загрузите отсюда ZIP -архив с библиотекой.
  • Распакуйте ZIP -архив.
  • Установите библиотеку в IDE Arduino, переместив распакованную папку в папку «libraries» IDE Arduino .
  • Перезапустите IDE Arduino .

Если ваша клавиатура не работает с кодом ниже, то ее нужно подключить не так, как на картинке выше, а в соответствии с даташитом. Даташит можно найти в сети или спросить у продавца, у которого вы купили свою клавиатуру.

Примечание: Если у вашей клавиатуры другое количество клавиш, вам нужно будет поменять значения во 3-ей и 4-ой строчках кода. Кроме того, после этого нужно будет поменять значения в массиве, который расположен на строчках с 5-ой по 10-ую .

    #include "Keypad.h"

  1. const byte ROWS = 4 ; // количество рядов

    const byte COLS = 3 ; // количество столбцов

    char keys[ ROWS] [ COLS] = {

    { "1" , "2" , "3" } ,

    { "4" , "5" , "6" } ,

    { "7" , "8" , "9" } ,

    { "#" , "0" , "*" }

  2. byte rowPins[ ROWS] = { 8 , 7 , 6 , 5 } ; // контакты для рядов:

    // R1 = D8, R2 = D7,

    // R3 = D6, R4 = D5

    byte colPins[ COLS] = { 4 , 3 , 2 } ; // контакты для столбцов:

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

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


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


Схема.


Все предельно просто. Если ни одна из кнопок не нажата, то между вертикальными линиями (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.


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