Андрей Смирнов
Время чтения: ~10 мин.
Просмотров: 12

Как сделать самому резистивную клавиатуру для arduino

1558938128115581754.jpg

Доброго времени суток всем.Немного предыстории.

Идея заиметь себе программируемую клавиатуру родилась у меня довольно таки давно. По работе и не только, я уже около 7 лет пользуюсь замечательными программами PunoSwitcher и Mkey. У них есть свои минусы, но все таки — все они здорово облегчают и автоматизируют многие рутинные задачи. И, в целом, основную массу моих потребностей в скриптах и программируемых клавишах можно реализовать софтверно через вышеописанные программы. Но здесь есть 3 существенных минуса:Оговорюсь сразу, все это чистой воды субъективщина, и ИМХО

1) Программы “съедают” некоторые клавиши. Например переназначив всю Numpad клавиатуру, вы останетесь без удобного ввода цифровых значений, и каждый раз переключать режимы в том же Mkey(который имеет свойство зависать в самый нужный момент), не очень удобно.2) При смене рабочей машины приходится каждый раз переназначать настройки и устанавливать софт. Да, можно сделать экспорт настроек и все такое прочее, но это не Plug&Play,в плане удобства.3)Кроссплатформенность. Так вышло, что у меня основной машиной для “взять с собой в поездку налегке” является старенький нетбук AcerAspire One с Linux Arch на борту, ибо только он там работал адекватно. И оказавшись без своих скриптов и переназначенных клавиш, было очень некомфортно работать. справедливости ради стоит упомянуть, что через какое-то время я накатил на него облеченную версию WIN 7 и все стало прекрасно, но пост это об этом).И так как цены на программируемые клавиатуры кусались, и я подумал, “а что если сделать ее на Ардуино?”. И вот в результате родилось это «чудо».За основу я взял проект из ролика небезызвестного ,В  о комп.пранке.(ссылка)Саня если ты это читаешь — огромное тебе спасибо. Ты не только вдохновил меня на это все, но облегчил разработку своими удобными библиотеками по работе с кнопками. КомплектующиеДля создания проекта понадобится:Arduino Pro Micro — 1 шт

PNP транзистор — 1 шт.

NPN транзисторы — 3 шт.

Резисторы:

200 Ом — 1 шт.

220 Ом — 6 шт

10 кОм — 1 шт.USB разъем (или PS/2 разъем) — 1 шт.

1558939267153480947.jpg

Да, можно было бы выбросить транзисторы с LED светодиодов, но я решил немного заморочится).

Поначалу проект разрабатывался под старую PS/2 клавиатуру, поэтому на ранних фото вы можете наблюдать в схеме PS/2 разъем.

В ходе экспериментов стало ясно, что некоторые клавиатуры могут работать с Аодуиной, как Ps/2 устройства, после перезагрузки.Именно для этого в схеме есть PNP транзистор для перезагрузки клавиатуры, через полсекунды после подключения Ардуины.

Затем,специально под этот проект, на Али была куплена Numpad клавиатура за 300р, которая оказалась вонючим куском пластика, к тому же еще и с бракованной клавишей, которая вывалилась при распаковке.

1558939715180693162.png

Демонстрация работы.

Одна из самых важных функций этой клавиатуры — возможность эмуляции нажатий нескольких клавиш — уже делает эту клаву, очень удобным инструментом в работе.Например.Как то давно, на Пикабу был выложен постВ  “Создание МОЩНОЙ программируемой клавиатуры”, путем использования программы HIDmacros.МОЩНОЙ!

#comment_61663005

Чтож, как говорил Сергей Дружко.

Gifx

Так же, вот пример работы одних из самых популярных комбинаций клавиш.

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

В моем случае, на 4 режимах работы, уже получается не 17 программируемых клавиш (доп.клавиши к сожалению не работают на PS/2 клавиатурах), а 68.

Ссылка на код и схему подключения

ГуглДиск

229Привет, жители Хабра! Сегодня я решил сделать полный гайд по клавиатурам для 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 будет отсутсвием сигнала     }   } }

Плюсы и минусы

Плюсы

  • Очень простое подключение
  • Занимает лишь один пин
  • Экономит память, которую вы не тратите под библиотеку
  • Обеспечивает стабильную работу(при условии, если вы не будете нажимать более одной кнопки одновременно)

Минусы

  • Стоит дороже матричных клавиатур
  • Скорее всего единственным способом покупки будет заказывать с Китая и доставка займёт какое-то время

Итоги

Лично я рекомендую использовать именно аналоговые клавиатуры, так как они чаще-всего более качественные и подключать их проще-простого. Главное обращать внимание на таблицу значений нажатых кнопок, которую предоставляет производитель или же, если таковой нет, можно сделать эти замеры самостоятельно, выводя значения из аналогового порта в монитор порта, чтобы потом использовать их в коде. Но выбор, всегда остается за Вами: использовать стандартный дешёвый вариант либо переплатить ради значительных плюсов в некоторых ситуациях. На этом у меня всё. Оставляйте свои вопросы в комментариях, пишите своё мнение и встретимся на просторах Хабра!th-4x4_matrix_16_keypad_keyboard_module_16_button-240x180.jpg      th-matrix_keyboard_16_key-240x180.png      th-matrix_keyboard_4x4_16_key-240x180.jpg

Самыми распространенными являются 16 кнопочные клавиатуры 4×4. Принцип их работы достаточно прост, Arduino поочередно подает логическую единицу на каждый 4 столбцов, в этот момент 4 входа Arduino считывают значения, и только на один вход подается высокий уровень. Это довольно просто, если знать возможности управления портами вывода в Arduino, а так же портами входа/ввода.

image005.png

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

Подключаем клавиатуру в любые порты ввода/вывода.

shema_podklyuchenie_arduino_i_matrix_key.png

На красные порты будем подавать сигналы, а с синих будем их принимать. Зачастую на синие провода подводят подтягивающие резисторы, но мы их подключим внутри микроконтроллера 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>Используемые источники:

  • https://pikabu.ru/story/arduino_programmiruemaya_klaviatura_svoimi_rukami_6726579
  • https://habr.com/post/460409/
  • https://www.robots4life.ru/arduino-keypad

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации