View Categories

Джойстик

Джойстик – орган управления с двумя аналоговыми осями (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());
  }
}

Полезные страницы #

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх