Джойстик является одним из устройств для удобной передачи информации от человека к компьютеру или микроконтроллеру. Джойстики используются для управления движением роботов, мобильных платформ и прочих механизмов. Модуль двухосевого джойстик
имеет две степени свободы, представляет собой ручку, закреплённую на шаровом шарнире с двумя взаимно перпендикулярными осями.
Джойстик.
При наклоне ручки вращаются подвижные контакты каждого из двух потенциометров номиналом 10 кОм, которые определяют положение осей X и Y. Средний контакт каждого потенциометра выведен на контакты VRX и VRY разъема, а крайние подключены к питанию и земле. Также джойстик оснащен тактовой кнопкой, которая срабатывает при вертикальном нажатии на ручку, показания снимаются с контакта SW. После отпускания джойстик возвращается в первоначальное центральное состояние.
Технические характеристики
- Напряжение питания: номинальное 3.0…5,5 В
- Выходной сигнал: цифровой (кнопка) и аналоговый (оси X и Y)
- Размеры: 26 мм x 40 мм x 22 мм
Подключение к плате Arduino
Для подключения модуля джойстика к плате Arduino будем использовать два аналоговых и один цифровой вывод Arduino, а также с платы Arduino подаем питание на контакты джойстика GND и +5V. Схема подключения показана ниже.
Схема подключения модуля джойстика к плате Arduino.
Напишем скетч получения данных с джойстика. Данные с потенциометров по осям X и Y могут принимать значения от 0 до 1023. Неподвижному положению джойстика соответствуют значение 511 для каждого потенциометра. При нажатии на кнопку на входе 3 Arduino будет появляться 0. Чтобы не было наводок, вывод кнопки необходимо подтянуть к +5 В. Данные выводим в последовательный порт
// пин подключения контакта VRX
#define PIN_VRX A0
// пин подключения контакта VRY
#define PIN_VRY A1
// пин подключения кнопки
#define PIN_BUTTON 3
void setup () {
// запуск последовательного порта
Serial.begin (9600);
}
void loop () {
// Выводим значение по оси X
Serial.print("X = ");
Serial.println(analogRead(PIN_VRX));
// Выводим значение по оси Y
Serial.print("Y = ");
Serial.println(analogRead(PIN_VRY));
// Состояние кнопки
Serial.print("button = ");
if (digitalRead(PIN_BUTTON) == HIGH) {
Serial.println ("NOT CLICK");
}
else {
Serial.println ("CLICK!");
}
// Пауза 1 сек
delay (1000);
}
Загружаем скетч на плату Arduino, открываем монитор последовательного порта и видим вывод данных при изменении положения джойстика.
Вывод данных с джойстика в монитор последовательного порта.
Пример использования
Рассмотрим пример использования джойстика для управления подвесом для камеры на сервоприводах. Нам потребуются следующие детали:
- плата Arduino Uno – 1 шт
- плата прототипирования – 1 шт
- модуль джойстика – 1 шт
- сервопривод – 2 шт
- подвес для камеры – 1 шт
- блок питания 5В – 1 шт
- провода
Схема подключения модуля джойстика и подвеса на сервоприводах к плате Arduino.
Считываем показания джойстика для каждой из осей X, Y и переводим их в значение угла поворота соответствующего сервопривода. Чтобы убрать дрожание сервопривода не реагируем на маленькие изменения положения джойстика.
// подключение библиотеки Servo
#include <Servo.h>
// пины подключения сервоприводов
#define PIN_SERVO_X 9
#define PIN_SERVO_Y 10
// пин подключения контакта VRX
#define PIN_VRX A0
// пин подключения контакта VRY
#define PIN_VRY A1
// пин подключения кнопки
#define PIN_BUTTON 3
// создание объектов Servo
Servo servoX;
Servo servoY;
// служебные переменные
int joyXpr=0;
int joyYpr=0;
int joyX, joyY;
int angleX, angleY;
void setup() {
// запуск последовательного порта
Serial.begin (9600);
// подключить управление сервоприводом к пинам
// PIN_SERVO_X и PIN_SERVO_Y
servoX.attach(PIN_SERVO_X);
servoY.attach(PIN_SERVO_Y);
}
void loop () {
// получение данных с джойстика
joyX=analogRead(PIN_VRX);
joyY=analogRead(PIN_VRY);
// Выводим значение по оси X
Serial.print("X = ");
Serial.print(joyX);
// Выводим значение по оси Y
Serial.print(" Y = ");
Serial.println(joyY);
// сравнение с предыдущими
if(abs(joyX-joyXpr)>10) { // повернуть по оси X
angleX=map(joyX,0,1023,0,180);
servoX.write(angleX);
// время на перемещение сервопривода
delay(15);
}
if(abs(joyY-joyYpr)>10) { // повернуть по оси Y
angleY=map(joyY,0,1023,0,180);
servoY.write(angleY);
// время на перемещение сервопривода
delay(15);
}
joyXpr=joyX;
joyYpr=joyY;
}
Загружаем скетч на плату Arduino, и управляем подвесом с помощью джойстика.
Схема в сборе.
Что делать если
Не изменяются данные на аналоговых выводах Arduino при изменении положения джойстика.
Проверьте правильность подключения джойстика к плате Arduino.
Значение кнопки джойстика принимает случайные значения или не изменяется тока отрицательное
Проверьте правильность подключения джойстика к плате Arduino.
Подтяните вывод кнопки к питанию через резистор 4.7 кОм.