====== Четырёхкнопочная клавиатура (Troyka-модуль) ====== [[amp>product/troyka-quad-switch?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Клавиатурный модуль]] — это четыре [[amp>product/tactile-button?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|тактовые кнопки]] собранные в один [[troyka-modules:|Troyka-модуль]]. Вам не придётся возиться с пайкой и беспокоиться о подтягивающих резисторах для каждой кнопки — они уже есть на модуле. {{ :продукты:troyka-quad-switch.1.jpg |}} ===== Подключение и настройка ===== Тактовая кнопка — это простой [[сенсоры:цифровые|цифровой датчик]]. Пока кнопка не зажата, датчик отдаёт логическую единицу, когда кнопка зажата — логический ноль. На модуле клавиатурном модуле собрано сразу четыре таких кнопки. У кнопок общее питание и отдельные сигнальные пины. Это позволило вдвое сократить количество необходимых проводов — для подключения четырёх кнопок их понадобится всего шесть. Подключение к [[amp>collection/arduino?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Arduino]] или [[amp>product/iskra-js?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Iskra JS]] упростит [[amp>product/arduino-troyka-shield?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Troyka Shield]]. {{ :продукты:troyka-quad-switch:troyka-quad-switch_scheme_troykashield.png |}}Если хотите оставить минимум проводов — воспользуйтесь [[amp>product/arduino-troyka-slot-shield?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Troyka Slot Shield]]. {{ :продукты:troyka-quad-switch:troyka-quad-switch_scheme_troykaslotshield.png |}} ===== Видеообзор ===== {{youtube>CyIVAscrsx0?large}} ===== Примеры работы ===== ==== Пример работы для Arduino ==== Выведем в Serial-порт текущее состояние всех кнопок и будем обновлять его каждые 100 миллисекунд. // даём разумные имена пинам кнопок #define BUTTON_PIN_1 2 #define BUTTON_PIN_2 3 #define BUTTON_PIN_3 4 #define BUTTON_PIN_4 5 void setup() { // открываем монитор Serial-порта Serial.begin(9600); } void loop() { // считываем состояние пина int buttonState1 = digitalRead(BUTTON_PIN_1); int buttonState2 = digitalRead(BUTTON_PIN_2); int buttonState3 = digitalRead(BUTTON_PIN_3); int buttonState4 = digitalRead(BUTTON_PIN_4); // выводим значения состояния кнопок в Serial-порт Serial.print(buttonState1); Serial.print("\t"); Serial.print(buttonState2); Serial.print("\t"); Serial.print(buttonState3); Serial.print("\t"); Serial.println(buttonState4); delay(100); } На экране вы увидите четыре столбика бегущих единиц. Порядковый номер столбика соответствует номеру кнопки. При нажатии на кнопки, единицы в столбиках сменятся нулями. ==== Эмуляция игрового джойстика на Arduino ==== {{ :продукты:troyka-quad-switch:super-mario-bros.jpg |}} Помните «лихие девяностые», когда [[https://ru.wikipedia.org/wiki/Dendy|Dendy]] и [[https://ru.wikipedia.org/wiki/Sega|Sega]] открыли окно в новую реальность? С помощью наших модулей вы сможете вспомнить старые добрые игры. Соберите игровой контроллер на [[amp>collection/new-2016-12-02?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki |Troyka Pad 1×4]]. Возьмите [[amp>product/troyka-3d-joystick?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki |3D-джойстик]] и [[amp>product/troyka-quad-switch?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki |четырёхкнопочный модуль]] и пару светодиодов. Пример работает только с платами, которые определяются ПК как [[https://ru.wikipedia.org/wiki/USB_HID|HID устройство.]] Скетч подойдет для: * [[amp>product/iskra-neo?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Iskra Neo]] * [[amp>product/arduino-leonardo?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Arduino Leonardo]] * [[amp>product/arduino-leonardo-eth?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Arduino Leonardo ETH]] * [[amp>product/arduino-micro?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Arduino Micro]] * [[amp>product/arduino-due?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Arduino Due]] // библиотека для эмуляции клавиатуры #include "Keyboard.h" // номера цифровых пинов кнопок #define BUTTON_PIN_1 2 #define BUTTON_PIN_2 3 #define BUTTON_PIN_3 4 #define BUTTON_PIN_4 5 // номера аналоговых пинов джойстика #define JOYSTICK_X A2 #define JOYSTICK_Y A5 // номера цифровых пинов светодиодов #define LED_GREEN A0 #define LED_RED A1 // переменные для хранения состояния сенсоров на джойстике int joystickValueX = 0; int joystickValueY = 0; int buttonState1 = 0; int buttonState2 = 0; int buttonState3 = 0; int buttonState4 = 0; // переменные для хранения временных интервалов long millisJoystickX = 0; long millisJoystickY = 0; long millisButtom1 = 0; long millisButtom2 = 0; long millisButtom3 = 0; long millisButtom4 = 0; bool state1 = true; bool state2 = true; bool state3 = true; bool state4 = true; void setup() { // открываем монитор Serial-порта Serial.begin(9600); // инициализируем эмуляцию клавиатуры Keyboard.begin(); // назначаем пины светодиодов в режим выхода pinMode(LED_RED, OUTPUT); pinMode(LED_GREEN, OUTPUT); } void loop() { // считывание состояние всех сенсоров на джойстике joystickRead(); // проверка на зажигание светодиодов joystickLed(); // проверка на нажатие клавиш joystickPress(); // проверка на отпускания клавиш joystickRelease(); } void joystickRead() { // считываем состояние джойстика и пинов кнопок joystickValueX = analogRead(JOYSTICK_X); joystickValueY = analogRead(JOYSTICK_Y); buttonState1 = digitalRead(BUTTON_PIN_1); buttonState2 = digitalRead(BUTTON_PIN_2); buttonState3 = digitalRead(BUTTON_PIN_3); buttonState4 = digitalRead(BUTTON_PIN_4); } void joystickLed() { // если нажата хотя бы одна кнопка if (!buttonState1 || !buttonState2 || !buttonState3 || !buttonState4 ) { // зажигаем зелёный светодиод digitalWrite(LED_GREEN, HIGH); } else { // гасим зелёный светодиод digitalWrite(LED_GREEN, LOW); } // если джойстик отклонен относительно своего обычного состояния if (joystickValueX > 600 || joystickValueX < 400 || joystickValueY > 600 || joystickValueY < 400 ) { // зажигаем красный светодиод digitalWrite(LED_RED, HIGH); } else { // гасим красный светодиод digitalWrite(LED_RED, LOW); } } void joystickPress() { // если джойстик отклонен вправо if (joystickValueX > 600) { // эмулируем нажатие и удерживание клавиши «d» Keyboard.press('d'); // запоминаем текущее время millisJoystickX = millis(); } // если джойстик отклонен влево if (joystickValueX < 400) { // эмулируем нажатие и удерживание клавиши «a» Keyboard.press('a'); // запоминаем текущее время millisJoystickX = millis(); } // если джойстик отклонен вниз if (joystickValueY < 400) { // эмулируем нажатие и удерживание клавиши «s» Keyboard.press('s'); // запоминаем текущее время millisJoystickY = millis(); } // если джойстик отклонен вверх if (joystickValueY > 600) { // эмулируем нажатие и удерживание клавиши «w» Keyboard.press('w'); // запоминаем текущее время millisJoystickY = millis(); } // если нажата кнопка «1» // и не прошёл заданный интервал времени с предыдущего нажатия данной кнопки if (!buttonState1 && state1 == 0) { // запоминаем состояние кнопки «1» state1 = true; // эмулируем нажатие и удерживание клавиши «k» Keyboard.press('k'); // запоминаем текущее время millisButtom1 = millis(); } // если нажата кнопка «2» // и не прошёл заданный интервал времени с предыдущего нажатия данной кнопки if (!buttonState2 && state2 == 0) { // запоминаем состояние кнопки «2» state2 = true; // эмулируем нажатие и удерживание клавиши «l» Keyboard.press('l'); // запоминаем текущее время millisButtom2 = millis(); } // если нажата кнопка «3» // и не прошёл заданный интервал времени с предыдущего нажатия данной кнопки if (!buttonState3 && state3 == 0) { // запоминаем состояние кнопки «y» state3 = true; // эмулируем нажатие и удерживание клавиши «y» Keyboard.press('y'); // запоминаем текущее время millisButtom3 = millis(); } // если нажата кнопка «4» if (!buttonState4 && state4 == 0) { // запоминимаем состояние кнопки «u» state4 = true; // эмулируем нажатие и удерживание клавиши «u» Keyboard.press('u'); // запоминаем текущее время millisButtom4 = millis(); } } void joystickRelease() { // если прошёл заданный интервал эмуляции нажатие клавиши // при отклонении джойстика влево или вправо if (millis() - millisJoystickX > 5) { // эмулируем отпускание клавиш «a» и «d» Keyboard.release('a'); Keyboard.release('d'); } // если прошёл заданный интервал эмуляции нажатие клавиши // при отклонении джойстика вверх или вниз if (millis() - millisJoystickY > 5) { // эмулируем отпускание клавиш «w» и «s» Keyboard.release('w'); Keyboard.release('s'); } // если прошёл заданный интервал эмуляции нажатие клавиши «k» if (millis() - millisButtom1 > 5) { // эмулируем отпускание клавиш «k» Keyboard.release('k'); state1 = 0; } // если прошёл заданный интервал эмуляции нажатие клавиши «l» if (millis() - millisButtom2 > 100) { // эмулируем отпускание клавиш «l» Keyboard.release('l'); state2 = 0; } // если прошёл заданный интервал эмуляции нажатие клавиши «y» if (millis() - millisButtom3 > 5) { // эмулируем отпускание клавиш «y» Keyboard.release('y'); state3 = 0; } // если прошёл заданный интервал эмуляции нажатие клавиши «u» if (millis() - millisButtom4 > 5) { // эмулируем отпускание клавиш «u» Keyboard.release('u'); state4 = 0; } } Прошейте плату и запускайте эмулятор с любимой игрой. ==== Пример программы для Iskra JS ==== Поймаем нажатие кнопок с помощью [[js:button|библиотеки для Iskra JS]]. var myButton1 = require('@amperka/button') .connect(P2, { }); var myButton2 = require('@amperka/button') .connect(P3, { }); var myButton3 = require('@amperka/button') .connect(P4, { }); var myButton4 = require('@amperka/button') .connect(P5, { }); myButton1.on('press', function() { console.log("Button '1' is press"); }); myButton2.on('press', function() { console.log("Button '2' is press"); }); myButton3.on('press', function() { console.log("Button '3' is press"); }); myButton4.on('press', function() { console.log("Button '4' is press"); }); Нажмите любую кнопку — в консоли появится сообщение: Button 'N' is press" где N — номер нажатой кнопки. ==== Что-то пошло не так ==== Если у при нажатии кнопки значения не меняются, проверьте работу порта управляющей платы с помощью [[amp>product/wire-mm?utm_source=man&utm_campaign=troyka-quad-switchn&utm_medium=wiki|соединительного провода «папа-папа»]]. Поверим работу кнопки на ''4'' пине. * ''4''+''G'' — кнопка нажата.{{ :продукты:troyka-button:wire-mm_g_scheme_troykashield.png |}} * ''4''+''V(IOREF)'' — кнопка отжата.{{ :продукты:troyka-button:wire-mm_v_scheme_troykashield.png |}} Если значения меняются — ваша кнопка неисправна. Обратитесь в техническую поддержку через [[amp>page/form|форму обратной связи]] или по телефону. ===== Элементы платы ===== {{ :продукты:troyka-quad-switch:troyka-quad-switch_annotation.png |}} ==== Тактовая кнопка ==== Тактовая кнопка без фиксатора — простой механизм, замыкающий цепь при нажатии на толкатель. ==== Подтягивающий резистор ==== В модуль входят четыре независимые кнопки подключённые по одной схеме. Пока кнопка нажата, выходное напряжение на сигнальном пине ''S'' = ''LOW''. Когда кнопка отпущена, провода работают как антенна и набирают наведённый сигнал — на пине ''S'' появляются «шумы». Эти шумы легко устранить, добавив в цепь резистор на ''10 кОм''. {{ :продукты:troyka-button:p008-button-pull-up.svg.png |}} ==== Контакты подключения 3-проводных шлейфов ==== //1 группа// * Земля (G) — соедините с землёй микроконтроллера. * Питание (V) — соедините с питанием микроконтроллера. * Сигнальный (S1) — цифровой выход кнопки ''S1''. Подключите к любому цифровому пину микроконтроллера. //2 группа// * Сигнальный (S2) — цифровой выход кнопки ''S2''. Подключите к любому цифровому пину микроконтроллера. * Сигнальный (S3) — цифровой выход кнопки ''S3''. Подключите к любому цифровому пину микроконтроллера. * Сигнальный (S4) — цифровой выход кнопки ''S4''. Подключите к любому цифровому пину микроконтроллера. ===== Принципиальная и монтажная схемы ===== {{:продукты:troyka-quad-switch:troyka-quad-switch_schematic.png?direct&350 |}} {{ :продукты:troyka-quad-switch:troyka-quad-switch_layout.png?direct&300|}} ===== Характеристики ===== * Сопротивление изолятора кнопки: 100 МОм * Рабочий ток кнопки: 50 мА * Сопротивление подтягивающих резисторов: 10 кОм * Рабочее напряжение: 3,3–12 В * Габариты: 25,4×25,4 мм ===== Ресурсы ===== * [[amp>product/troyka-quad-switch?utm_source=man&utm_campaign=troyka-quad-switch&utm_medium=wiki|Quad Switch (Troyka-модуль)]] в магазине. * [[https://github.com/amperka/hardware-drawings/blob/master/troyka-quad-switch.svg|Векторное изображение Quad Switch (Troyka-модуль)]] * [[https://github.com/amperka/TroykaButton | Библиотека для работы с кнопками]] * [[js:button|Описание библиотеки «button» для Iskra JS]]