====== Четырёхкнопочная клавиатура (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]]