Eurotehnik.ru

Бытовая Техника "Евротехник"
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ардуино: подключение матричной клавиатуры

Ардуино: подключение матричной клавиатуры

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

Клавиатуры имеют массу вариантов исполнения. На старых персональных компьютерах использовались клавиатуры с механическими клавишами, которые имели большой ход и были почти также удобны как клавиши на старых печатных машинках. Последние 15-20 лет широко применяются мембранные клавиатуры, которые проще и дешевле в изготовлении. Именно такую клавиатуру мы будем подключать к Ардуино.

Популярная в Ардуино проектах матричная мембранная клавиатура имеет 12 или 16 кнопок. С нижней части клавиатуры выходит шлейф, заканчивающийся dupont розеткой.

Для чего нужна матричная клавиатура?

Для примера возьмем обычную кнопку. Как вы знаете, это простейшее электромеханическое устройство. Чтобы подключить ее к плате, нужно использовать стягивающий резистор, а также задействовать по одному контакту питания и «земли». Нажатием такой кнопки можно выполнить определенное действие, например можно управлять светодиодом, различными приводами, механизмами и так далее. А что, если нам необходимо подключить несколько кнопок? Тогда придется задействовать больше контактов и большее число проводов, да и без макетной платы уже не обойтись, плюс еще резисторы придется использовать в большем количестве.

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

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

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

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

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

Читайте так же:
Кабель от монитора к системному блоку название

В данном случае воспользуемся платой Arduino Mega 2560, подключим к ее выводам с 1 по 7 линии матричной клавиатуры 3×4 и будем выводить получаемые с нее данные в последовательный порт. Схема подключения платы 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= ; // строки с 0 по 3 byte cPins= ; // столбцы с 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); >>

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

Сегодня про так называемую резистивную клавиатуру или как подключить много кнопок на один аналоговый вход. Для этого был собран вот такой модуль, на котором 5 кнопок и несколько SMD резисторов, а так же 3 штырька для питания и выхода.

В общем как это все устроено.

Я надеюсь все знают как работает делитель напряжения. Есть 2 резистора подключенных последовательно в цепь питания и от средней точки этих резисторов снимается напряжение, величина которого зависит от падения напряжения на этих самых резисторах. А если совсем просто, то если на входе й нас 5 вольт и 2 резистора по 1кОм, то со средней точки мы будем снимать 2,5 вольт.

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

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

Читайте так же:
Механическая клавиатура для печати

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

Осталось только различать эти значения в коде без условия if здесь не обойтись, а лучше вообще это вынести в отдельную функцию. К примеру эта функция будет key() и возвращает она байт

ИСПОЛЬЗОВАНИЕ ЖК-ДИСПЛЕЯ С КЛАВИАТУРОЙ

Теперь посмотрим, как выводить нажатия клавиш на ЖК-дисплее. Клавиатуры 4X4 используют 8 контактов, а клавиатуры 3X4 используют 7 контактов. Это занимает много пинов, поэтому мы будем использовать ЖК-дисплей с поддержкой I2C. В этом случае для подключения к Arduino потребуется всего 4 провода.

Чтобы использовать ЖК-дисплей с поддержкой I2C на Arduino, необходимо установить библиотеку LiquidCrystal I2C от Marco Schwartz. Эта библиотека хороша тем, что включает в себя большинство функций, доступных в стандартной библиотеке LiquidCrystal. Чтобы установить его, загрузите ZIP-файл ниже, затем перейдите в Sketch> Включить библиотеку> Добавить ZIP-библиотеку:

Библиотека Wire необходима для добавления поддержки связи I2C. Он поставляется в комплекте с Arduino IDE, поэтому его не нужно устанавливать. Но если по какой-либо причине он не установлен в вашей системе, перейдите в Управление библиотеками и найдите «wire», чтобы установить его.

После установки библиотек подключите контакты заземления и Vcc на ЖК-дисплее к Arduino, затем подключите выводы SDA и SCL на ЖК-дисплее в соответствии с таблицей ниже для различных плат Arduino:

Затем подключите клавиатуру к Arduino. Это должно выглядеть примерно так (для Arduino Uno):

Как только все подключится, загрузите этот код в Arduino:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;

byte rowPins[ROWS] = <9, 8, 7, 6>;
byte colPins[COLS] = <5, 4, 3, 2>;

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x21, 16, 2);

void setup() <
lcd.backlight();
lcd.init();
>

void loop() <
char customKey = customKeypad.getKey();
if (customKey) <
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(customKey);
>
>

Вам необходимо добавить адрес I2C вашего ЖК-дисплея в строке 20:

LiquidCrystal_I2C lcd (0x21, 16, 2);

I2C-адрес моего ЖК-дисплея — 0x21, но ваш, может быть другим. Адрес I2C вашего ЖК-дисплея должен быть указан в техническом описании , но если нет, вы можете найти его, запустив этот скетч I2C_Scanner .

Читайте так же:
Маленький легкий ноутбук для работы

Матричная клавиатура 4х4 динамическое считывание данных с портов

В прошлой своей заметке я описывал считывание одной клавиши с помощью микроконтроллера ATmega8 и вывод на ЖКИ. Написанную выше программу можно легко модифицировать на большее количество кнопок. Следует подсоединить клавиши к свободным выводам и периодически их всех опрашивать.

Но при большом количестве клавиш не хватает ножек. Можно перейти на более «многоногие» контроллеры, но они, как правило, стоят больших денег и в некоторых случаях приходиться заново переписывать проект под них. Рассмотрим решение проблемы нехватки ножек при считывании с клавиатуры, так называемое динамическое считывание. Например, мы имеем 16 клавиш, и хотим считать с них информацию. Хитро соединим их в клавиатурную матрицу, как показано на рисунке ниже:

Со схемы видно, что для считывания 16-ти клавиш нам потребуется 8 выводов. По сравнению с обычным подключением (один пин – одна кнопка) мы выиграем в 16/8=2 раза. Алгоритм считывания будет таков: конфигурируем выводы PB0-PB3 как выхода и подадим на них нулевой уровень, а выводы PC0-PC3, выставим как входа и будем смотреть в какой колонке находиться нажатая клавиша. Далее поменяем все местами. Порты PC0-PC3 будут выходами с нулевым уровнем, а на портах PB0-PB3 будет считывать строку, в которой находиться нажатая клавиша. Зная строку и колонку можно однозначно вычислить клавишу, которая была нажата. Каждой клавише сопоставим код, который будет храниться в 2х мерном массиве 4х4 (строка нажатой клавиши – первый индекс массива, колонка — второй):

То есть, нажав клавишу во 2-й строке и 4-й колонке, микроконтроллер поймет, что была нажата клавиша «9» (массив будет отличаться, в зависимости от того, как подсоединить клавиатуру к микроконтроллеру). Далее все это будем выводить на экран ЖКИ. В схеме так же присутствуют ограничивающие резисторы R4-R11 номиналом 2 кОм, которые на «всякий пожарный случай» не дают пройти большому току через порт микроконтроллера. Клавиатуру проще всего изготовить из макетной платы и отдельных кнопок, соединив их короткими перемычками, она верой и правдой послужит в дальнейших опытах. Вид сверху:
клавиатура вид сверху
И снизу:
клавиатура вид снизу
Теперь перейдем к написанию программы:

фото устройства

И подсоединить светодиод к каждой ножке порта, если он замигает – все в порядке, если нет – порт дефектный. Внешний вид макета можно увидеть на фото:

Видео для демонстрации приведено ниже:

Но на этом не стоит ограничиваться. Зачастую введенные данные нужно обрабатывать, также следует предусмотреть возможность сброса введенного или удаление последнего символа. Реализуем макет, где с клавиатуры будет вводиться шестизначное целое число, при нажатии на клавишу «С» на экране ЖКИ должен мигать курсор, число его миганий равно числу, введенному с клавиатуры. Также клавиша «F» будет означать очистку экрана, а клавиша «E» — последнего введенного символа. Перейдем к написанию программы:

Читайте так же:
Можно ли подключить обычный микрофон к компьютеру

Номиналы резисторов:
R4-R11 — 2кОм,
R3 — 17 Ом,
R1, R2 — 1 кОм.

Теперь программа выглядит посерьезней. Добавился глобальный массив row в котором содержаться нажатые цифры и переменная row_count – их количество. Функция void write_row(void) выводит на ЖКИ содержимое row, а void get_number(void) – конвертирует массив цифр в целочисленную переменную number. Также появилась функция проверки, является ли x цифрой – is_digit(x). Во всем остальном код хорошо прокомментирован, и разобраться в нем не составит труда. Исходные коды программ, в виде проектов под AVR Studio
скачиваем здесь.
Видео работы:

вход-выход

>> DDRC=0x00; //конфигурируем порт C как вход
>> PORTC=0x0F; //выводим на 4 младших бита порта C лог. 1

объясните пожалуйста, какая разница между входом и выходом, если на вход мы можем _выводить_ сигналы?

>> DDRC=0x00; //конфигурируем

>> DDRC=0x00; //конфигурируем порт C как вход
>> PORTC=0x0F; //выводим на 4 младших бита порта C лог. 1

В этом случае PC0-PC3 — входа с подключенным подтягивающим резистором.
Читать мануал на стр. 52, таблица 12-1

количество нажатых кнопок,а именно вывод этого количества на жки

как вывести на жки количество нажатых(или зажатых)кнопок,например я зажал 7 кнопок,и мне нужно чтобы на жки вывелось 7,я зажал 16 и на жки вывелось 16. помогите пожайлуста,очень нужно!

Схема проектируемого нами калькулятора представлена на следующем рисунке.

Схема калькулятора с использованием клавиатуры 4х4 и платы Arduino

Напряжение +5V и землю для схемы можно непосредственно получить с контактов 5V и ground платы Arduino. Саму плату Arduino можно запитать от компьютера через USB кабель, от батарейки 9 В или адаптера на 12 В.

ЖК дисплей подключен к плате Arduino в 4-битном режиме, то есть используются 4 его контакта данных. Клавиатура имеет 8 выходных контактов, которые подключены к контактам 0-7 платы Arduino. Для более детального изучения данного вопроса вы можете прочитать статью про подключение клавиатуры 4х4 к плате Arduino.

Необходимые соединения в представленной схеме показаны в следующей таблице.

Контакт ArduinoКуда подсоединен
D01-й контакт клавиатуры
D12-й контакт клавиатуры
D23-й контакт клавиатуры
D34-й контакт клавиатуры
D45-й контакт клавиатуры
D56-й контакт клавиатуры
D67-й контакт клавиатуры
D78-й контакт клавиатуры
D8Register select pin of LCD (pin 4)
D9Enable pin of LCD (pin 6)
D10Data pin 4 (pin 11)
D11Data pin 4 (pin 11)
D12Data pin 4 (pin 11)
D13Data pin 4 (pin 11)
+5VVdd pin of LCD (pin 2)
GroundVss,Vee and RW pin of LCD (pin 1,3 and 5)
Читайте так же:
Запуск компьютера при подаче питания

Некоторые платы Arduino могут выдавать ошибку при загрузке в них программы в то время когда что-либо подсоединено к их контактам 0 и 1. Поэтому если вы столкнулись с такой ошибкой, просто отключите клавиатуру на время загрузки программы.

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

Принцип комбинации клавиш

Поддержка матричной клавиатурой комбинированных клавиш во многом зависит от метода сканирования матричной клавиатуры.

Метод разворота линии

Метод инверсии строк не поддерживает комбинации клавиш:

Прогрессивная развертка

Метод прогрессивной развертки поддерживает комбинации клавиш с перекрестными линиями, но не поддерживает сочетания клавиш однорангового типа:

Двойное сканирование петли

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

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

Интеллектуальная рекомендация

метаданные кластера Кафка в распределении памяти Zookeeper

Все мы знаем, что, поскольку Кафка родился, мы использовали услуги Zookeeper для выполнения метаданных и управления состоянием кластеров Кафки, хотяKIP-500 Существует предложение , чтобы удалить завис.

Срок действия сертификата безопасности TeamViewer истек, решение

Каталог статей Решение проблемы с истечением срока действия бесплатной лицензии TeamViewer Решение проблемы с истечением срока действия бесплатной лицензии TeamViewer Teamviewer — это программн.

[JVM] Анализ памяти Java

https://www.cnblogs.com/wyb628/p/8566337.html thread dump Основная запись выполнения JVM в определенное время, в виде стека, является текстовым файлом. Конкретный код будет исправлен, анализируя пробл.

Распознавание лиц Чтение бумаги (4)

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

bzoj3784 Путь в дереве точки разделяй и властвуй + RMQ + приоритетная очередь

Тематический анализ Путь по дереву? Да, это немного разделяй и властвуй. Найдите самый длинный m m mДлина штанги? Да, это очередь с приоритетом. Но проблема в том, что очередь с приоритетами может исп.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector