Джойстик – орган управления с двумя аналоговыми осями (X и Y) и одной кнопкой. Отлично подходит для управления в играх, а также некоторыми механизмами - роботами, машинками, станками в ручном режиме.
![]() |
В наборе GyverKIT | START | IOT | EXTRA |
---|---|---|---|---|
Джойстик | ✔ | ✔ |
Подключение к Arduino #
Подключается к питанию, аналоговые оси (VRX и VRY) – на аналоговые пины, кнопка SW – на цифровой пин. Кнопка никуда не подтянута, но это можно сделать средствами микроконтроллера. Джойстик удобнее подключать проводами папа-мама к макетке:
Программирование #
Опросим обе оси джойстика и кнопку (умножим на 100 для лучшего масштаба) и выведем значения в порт через запятую. Подвигаем джойстиком, пощёлкаем кнопкой, посмотрим на график:
#define J_VRX 0
#define J_VRY 1
#define J_SW 3
void setup() {
Serial.begin(115200);
pinMode(J_SW, INPUT_PULLUP);
}
void loop() {
Serial.print(analogRead(J_VRX));
Serial.print(',');
Serial.print(analogRead(J_VRY));
Serial.print(',');
Serial.println(digitalRead(J_SW) * 100);
}
Оси джойстика ожидаемо выдают значение от 0 до 1023, а кнопка – инвертирована, так как при нажатии замыкается на GND. Работать с сырыми данными с джойстика не очень удобно, потому что нет "нуля": он находится где-то в районе 500. Можно попробовать сделать по простому, через функцию map()
. Преобразуем значения с осей в диапазон -100.. 100:
#define J_VRX 0
#define J_VRY 1
#define J_SW 3
void setup() {
Serial.begin(115200);
pinMode(J_SW, INPUT_PULLUP);
}
void loop() {
Serial.print(map(analogRead(J_VRX), 0, 1023, -100, 100));
Serial.print(',');
Serial.print(map(analogRead(J_VRY), 0, 1023, -100, 100));
Serial.print(',');
Serial.println(digitalRead(J_SW) * 100);
}
Библиотеки #
Для более удобной работы с джойстиком можно использовать библиотеку GyverJoy. Она позволяет удобно калибровать джойстик, задавать мёртвую зону и плавность изменения значений. Её можно установить/обновить из встроенного менеджера библиотек Arduino по названию GyverJoy. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Для работы библиотеки нужно вызывать метод tick()
в loop()
. Он опрашивает аналоговый пин по своему таймеру и вернёт true
, когда следующее измерение будет готово. Пример:
#include <GyverJoy.h>
GyverJoy jx(0); // джойстик на пине 0 (одна ось)
void setup() {
Serial.begin(115200);
//jx.invert(true); // инвертировать
jx.calibrate(); // калибровка нуля при запуске
jx.deadzone(30); // мёртвая зона
jx.exponent(GJ_CUBIC); // "экспонента" для плавности
}
void loop() {
// тикер опрашивает АЦП по своему таймеру
if (jx.tick()) {
// выводим значение, когда оно готово
Serial.println(jx.value());
}
}
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
- Поддержать автора за работу над уроками