Управление ардуино джойстиком ps2

Обновлено: 04.07.2024

Использование джойстика – это один из способов обмена информацией между человеком и устройством (компьютер, микроконтроллер) на основе Arduino. Чаще всего их используют для управления механизмами или роботами. По аналогии с привычным игровым миром джойстики также часто называют геймпадами. Геймпад прост и удобен в использовании. Сегодня существует большое количество видов джойстиков по количеству степеней свободы, частоте считывания информации и используемой технологии. В данной статье мы рассмотрим наиболее популярный вариант, научимся управлению джойстиком и узнаем, как его подключать.

Принцип работы джойстика

Джойстик ардуино

Аналоговый джойстик выглядит как ручка, которая закрепляется на шарнире с двумя потенциометрами, определяющими оси X и Y, и кнопкой Z. Наклон или поворот ручки вращает специальный подвижный контакт, из-за чего изменяется выходное напряжение. Сам геймпад оснащен пружиной, благодаря которой плавно возвращается в первоначальное центральное состояние после отпускания его с какой-либо позиции. Устройство позволяет более плавно отследить степень отклонения от центральной (нулевой) точки.

Подключение джойстика к ардуино

Подключение джойстика к Arduino Uno выполняется по схеме, приведенной ниже.

Джойстик Ардуино

На модуле имеется 5 выходов – Vcc, Gnd, X, Y и Key (обозначения могут различаться в зависимости от устройства).

Данные по оси X выводятся на вход А0, по оси Y – на А1. Для визуального контроля нажатия кнопки также можно подключить светодиод D11. Питание осуществляется напряжением 5 Вольт. Пин GND присоединяется к такому же пину на плате Ардуино. Контакт SW можно подсоединить к любому цифровому пину.

Как видим, подключение модуля джойстика не сложно. Если устройство не работает после подключения, проверьте, правильно ли вы подсоединили все пины.

Как отслеживать текущее положение или направление джойстика

Для использования джойстка в реальном проекте нам понадобится написать скетч, чтобы обрабатывать данные, которые отправляет джойстик во время своей работы.

Узнать, в каком положении в текущий момент находится устройство, можно в зависимости от значений потенциометров. Перемещение происходит по направлению находящихся перпендикулярно осей X и Y. Считывание информации с геймпада происходит с помощью функции analogRead() – она показывает значения в диапазоне от 0 до 1023. В качестве аргументов ей поступают номера пинов, к которым произведено подключение джойстика:

Serial.println(analogRead(A0)); // показывает положение X координаты

Serial.println(analogRead(A1)); // показывает положение Y координаты

Для удобства советуется использовать константы, чтобы уменьшить и упростить итоговый код. Аналоговые пины как раз можно объявить постоянными:

const byte PIN_ANALOG_X = A0; // постоянная для координаты Х

const byte PIN_ANALOG_Y = A1; // постоянная для координаты Y

Определение направления движения джойстиком

Управление с помощью джойстика подразумевает собой то, что мы должны узнать направление движения ручки джойстика. Для этого нам придется получить и интерпретировать данные по всем осям.

По значению положений осей X и Y можно узнать, находится ли джойстик в центре или произошло смещение. Значения во всех направлениях находятся в диапазоне от 0 до 1023, как говорилось ранее. В первую очередь приходит мысль, что центральная точка будет находиться примерно в значении 511-512. Это заключение не совсем правильно, так как абсолютно точное положение определить нельзя.

Джойстик ардуино координаты

Неверное определение центрального значения может привести к тому, что будет получена ошибочная информация о движении джойстика, если он будет находиться в неподвижном состоянии. Для этого следует выбрать числовой диапазон и условно считать, что любое значение в нем будет центральной точкой. Значения нужно подстраивать под каждый вид джойстика, но примерно оно будет в диапазоне 505-518. Полученные значения записываются в код в виде постоянных:

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 518;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

Следующим шагом будет преобразование координат в диапазон от -1 до 1. Для X -1 – это перемещение влево, 0 – нет движения, 1 – вправо. По Y -1 – движение вниз, 0 – центральное значение, 1 – вверх. Изначально устанавливаем все значения в центр 0. Для проверки, происходит ли перемещение, используем выражения if/else.

Подводные камни в работе геймпада

Как и с любое устройство, джойстики не лишены недостатков. В первую очередь, наличие пружины не позволяет ручке точно вернуться в центральное положение из-за трения в механических деталях. Это приводит к тому, что приходится программно определять центральное положение, вернее диапазон значений, в которых любая точка будет условно считаться серединой.

Второй проблемой можно назвать наличие так называемых мертвых зон. Два крайних значения при наибольших отклонениях должно быть равным 0 В и напряжению питания. В действительности эти значения могут различаться, так как не используется весь электрический диапазон изменения сопротивления. Для решения этой проблемы крайние точки могут соответствовать значениям 1 кОм и 9 кОм.

Плата расширения JoyStick shield

Для управления роботами или другими механизмами иногда требуется использовать джойстик к кнопками и средствами коммуникаций. Для того, чтобы не придумывать каждый раз новые конструкции, рекомендуется купить готовую плату расширения ардуино для джойстика, в которой все необходимые элементы будут спаяны.

Рассмотрим, что представляет собой этот шилд от известного в мире ардуино производителя Sparkfun. Данный геймпад работает исправно и стоит относительно недорого. Устройство может поставляться в немного разобранном виде, так что сначала его нужно собрать.

Шилд содержит несколько стандартных кнопок (4 обычных сбоку и кнопка выбора). В зависимости от модели, на плате могут быть добавлены разъемы для подключения модулей bluetooth или wifi. Традиционно, с помощью выходов пинов и гребенки можно подключать внешние устройства.

Заключение

Подключение готового модуля не сложно, так же весьма доступным является и сам управляющий скетч. Чаще всего, джойстик используется в месте с кнопками и в паре с беспроводными интерфейсами, потому то управлять джойстиком на проводе быстро перемещающимися устройствами практически невозможно. Поэтому рекомендуется для работы использовать готовые шилды, в которых есть все необходимое.

Технические характеристики KY-023

  • Напряжение питания: 5 В
  • Поворот ручки: 360°
  • Размеры: 40 мм х 26 мм х 32 мм

Распиновка KY-023

Вывод Описание
GND Земля/общий
+5V/VCC Питание
VRX Аналоговый выход потенциометра оси X
VRY Аналоговый выход потенциометра оси Y
SW Выход кнопки

Принципиальная схема джойстика KY-023

Принципиальная схема джойстика KY-023

Модуль двухосевого джойстика состоит из двух потенциометров на 10 кОм, определяющие положение осей X и Y изменение сопротивления осуществляется рычагом. Средняя нога каждого потенциометра выведены на контакты VRX и VRY, а вторая и третья нога подключена к питанию и массе. Дополнительно установлена тактовая кнопка, показания снимаются с контакта SW, так-же предусмотрено посадочное место для подтягивающего резистора (R1).

Для считывания данных с выводов VRX (ось X) и VRY (ось Y) необходимо использовать аналоговые порт Arduino. (значение от 0 до 5В или от 0 до 1023), а для считывания данных с вывода RW используем цифровой порт (значение 0В и 5В или 0 и 1). Так-как один вывод тактовой кнопки подключен к земле и при нажатии на джойстик вниз, происходит замыкание цепи, но возможно ложные срабатывания (наводки). Для получения стабильных показаний, вывод RW необходимо подтянуть к питанию +5В, через подтягивающий резистор R1 или использовать встроенный подтягивающий резистор.

Схема подключения джойстика KY-023 к Arduino

Для считывания значений с потенциометров джойстика будут использоваться пара аналоговых контактов на Arduino (A0 и A1) и цифровой вывод для считывания значений с кнопки.

KY-023 Arduino
GND GND
+5V 5V
VRx A0
VRy A1
SW 3


В примере используется встроенный подтягивающий резистор (можно использовать и внешний, для этого необходимо добавить на модули резистор R1, типа размера 0805). Подключаем провода, VRX к аналоговому порту А0, VRY к аналоговому порту A1, SW к цифровому порту 3, осталось подключить питание +5В к выводу 5V и GND к GND на Arduino Pro Mini или Arduino Uno.

Пример скетча

Следующий скетч Arduino будет постоянно считывать значения с потенциометров и кнопки на KY-023 и преобразует их в значение напряжения (0-1023 -> 0V-5V). Перемещение джойстика вверх/вниз увеличит/уменьшит значения X и перемещение джойстика влево/вправо увеличится/уменьшится для значений Y. Нажмите на джойстик, чтобы активировать кнопку. Запускаем среду разработки и загружаем данный скетч, затем открываем мониторинг порта.

Если у вас есть беспроводной джойстик от PlayStation, то вы сможете подключить его к Arduino и управлять своими поделками. Для этого вам не понадобится USB Host. В данной инструкции используется аналог беспроводного джойстика от PS3 купленного на eBay.

Список необходимых компонентов:


1. Беспроводной PS3 джойстик с радиоприемником.
2. Провода 6 шт.
3. Разъёмы.
4. Вилка штыревая.
5. Arduino Uno или Mega.

Подключение PS3 джойстика к Ардуино:

1. Изготовление проводов.

Возьмите провода, я использовал «джамперы» из набора. К одному концу припаяйте разъём, если нет одинарных, тогда отрежьте неиспользуемую часть разъема. Так как контакты в радиомодуле толстые, вам придётся увеличить отверстие в разъеме. Если вы используете простые провода, тогда к другому концу припаяйте штыревую вилку. У вас должен получиться вот такой провод.


Для корректной работы джойстика вам понадобится добавить как минимум два резистора. Это связано с тем, что радиомодуль работает от 3.3В, а рабочее напряжение на пинах Ардуино Уно и Мега 5В. Сам автор библиотеки пишет, что у одних пользователей работает с резисторами, у других без резисторов. В моем случае, ниже указанная схема самая стабильная.

Для пинов Command и Clock добавьте резисторы номиналом 5.6 КОм. Провода будут выглядеть так.


Радиомодуль с подключенными проводами.


2. Подключение радиомодуль к Ардуино:

Распиновка радиомодуля от PS3 джойстика (обозначены только нужные нам пины):


Подключите провода к указанным пинам на приемнике. После этого, подключите приемник к Ардуино по следующей схеме. Пины на Ардуино можно будет изменить в скетче.


Настройка и запуск программы для работы с джойстиком:

1. Скачайте и установите библиотеку PS2X_lib
2. Откройте пример из библиотеки. Если вам нужен пример с комментариями на русском языке скачайте его тут PS2X_Example_RUS
3. Настройте нужные вам пины в скетче.
4. Загрузить скетч на Ардуино.
5. Откройте монитор портов
6. Библиотека не поддерживает подключение на горячую, по этому если радиомодуль не переходит в режим поиска вам нужно: Отключить питание от радиомодуля, затем подключить питание снова снова. При необходимости перезагрузить ардуино кнопкой ресет.
7. Включите джойстик. Некоторые клоны джойстиков могут не работать или работать не правильно. Возможно вам поможет отключение проверки ошибок. if(error == 1) - Проверка ошибок. Если ваш джойстик обнаруживается как неизвестный контроллер, но на нажатия кнопок не реагирует, попробуйте в скетче закрыть комментариями две строки. Выглядеть это будет примерно так:

// if(error == 1) //Цикл «loop» пропускается если джойстик не найден
// return;

Видео с демонстрацией управления машинкой при использовании беспроводного джойстика и данного кода.

В данном примере будем подключать джостик от Play Station к arduino и при помощи USB Host нее управлять машинкой.

  • Play Station джойстик с радиоприемником;
  • соеденительные провода;
  • разъёмы;
  • вилка штыревая;
  • любая плата arduino.

playstation-i-arduino01

Для того чтобы подключится к разъему SPS нужен слегка подредактировать провод "джампер". Штырьки в радиомодуле довольно толстые и поэтому необходимо слегка увеличить отверстие в разъеме либо найти специальный и впаять его к вместо имеющегося. Ну или конечно если вам не жалко радиомодуль можно напрямую припаять, без всяких соеденительных проводов.

playstation-i-arduino02

Также нужно будет добавить в 2 провода резисторы. Они необходимы для согласования уровней. Радиомодуль работает от напряжение в 3.3В а на пинах arduino 5В. У некоторых работает и без этих проводов, но я как то побаиваюсь подключаться напрямую, вдруг радиомодуль испортится. И тогдв придется нести мой джостик вместе с радиомодулем в сервис по ремонту sony playstation 4 или заказывать новый и ждать 2-3 недели, а на это просто не хватит терпения. Провод с припаеным резистором представлен ниже, номиналы сопротивлений можно посмотреть на схеме.

playstation-i-arduino02

Распиновка радиомодуля от PS3, здесь представленны только задействованные пины.

Распиновка радиомодуля от PS3

Вот так будет выглядить разъем с выведенными проводами

разъем с выведенными проводами

Схема подключения беспроводного джойстика от PlayStation и Arduino

Схема подключения беспроводного джойстика от PlayStation и Arduino

Для того чтобы запустить наш проект нам понадобится:

Открыть пример который идет вместе с библиотекой. Пример с комменариями на русском языке.

Настраиваем нужные нам пины в прогамме (скетче).

Загружаем скетч в arduino

Открываем монитор порта.

Если радиомодуль не перехоидит в режим поиска, то необходимо сделать следующее: оключить в включить питание радиомодуля, перезапустить Arduino.

Читайте также: