Подключение модуля джойстика PS2 (XY Joystic) к плате Arduino

Рассмотрим в данной статье, как работают аналоговые джойстики, на примере подключения модуля джойстика PS2 (XY Joystic) к плате Arduino. Джойстики такого типа выполнены на основе потенциометров установленных на плате. Отклоняя джойстик в какую-либо сторону, прокручивается потенциометр, изменяя свое сопротивление, и передаёт нам аналоговый сигнал в диапазоне от 0 до 1023. Кнопка в модуле джойстика PS2 (XY Joystic) срабатывает при нажатии на сам грибок джойстика, то есть точно также как и в джойстиках игровых консолей, а сигнал о состоянии кнопки передается нам в цифровом виде.

Подключение модуля джойстика PS2 (XY Joystic) к плате ArduinoДля подключения модуля джойстика PS2 (XY Joystic) используется разъем из пяти пинов (GND, +5V, VRx, VRy, SW) стандарта 2.54мм. В вашем случае может оказаться джойстик другого производителя с другими обозначениями на пинах управления, например: Ground, Vcc, X, Y, Key или GND, VCC, V, H, KEY. Суть и принцип подключения от обозначений не меняется, какие пины обозначают одно и то же на всех этих примерах догадаться не трудно.

Подключаем модуль джойстика к плате Arduino Uno.

Подключение модуля джойстика PS2 (XY Joystic) к плате Arduino

Пин GND модуля джойстика соединяем с выходом GND платы Arduino Uno. Пин питания +5V джойстика соединяем соответственно с пином 5V платы Ардуино. Выходы VRx и VRy передающие нам информацию о перемещении джойстика по оси X или оси Y соответственно, соединяем с любыми аналоговыми пинами платы Ардуино. В нашем случае мы подключили выход VRx джойстика к аналоговому пину А1 платы Ардуино, а выход VRy к аналоговому пину А2 платы Arduino Uno. Выход SW отвечающий за кнопку джойстика мы соединяем с любым цифровым пином платы Ардуино, в данном случае мы подвели его к цифровому пину 4.

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

//КОНСТАНТЫ
const int SW = 4;  // кнопка джойстика
const int VRx = A1; // Ось X джойстика
const int VRy = A2; // Ось Y джойстика

void setup() // НАСТРОЙКИ
  {
  pinMode(VRx, INPUT); // устанавливаем аналоговый пин А1 в режим входа
  pinMode(VRy, INPUT); // устанавливаем аналоговый пин А2 в режим входа
  pinMode(SW, INPUT); // устанавливаем цифровой пин 4 в режим входа
  digitalWrite(SW, HIGH); // включаем встроенный подтягивающий резистор
  Serial.begin(9600); // инициируем последовательное соединение и задаем скорость передачи данных
  }

void loop()  // ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ
  {
  int X = analogRead(VRx); // считываем аналоговое значение оси Х и записываем его в новую переменную
  int Y = analogRead(VRy); // считываем аналоговое значение оси Y и записываем его в новую переменную
  int S = digitalRead(SW); // считываем состояние кнопки и записываем его в новую переменную
  Serial.print(X); // Выводим значение смещения джойстика по оси X в Serial Monitor
  Serial.print("\t"); // табуляция
  Serial.print(Y); // Выводим значение смещения джойстика по оси Y в Serial Monitor
  Serial.print("\t"); // табуляция
  Serial.println(S); // Выводим состояние кнопки в Serial Monitor и переходим на следующую строку
  }


Всё надеюсь предельно понятно, читайте комментарии к каждой строке. Стоит только обратить внимание на строку:

digitalWrite(SW, HIGH); // включаем встроенный подтягивающий резистор

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

Теперь давайте загрузим наш скетч на плату Ардуино, после чего откроем мониторинг порта в программе Arduino IDE (Инструменты - Монитор порта), чтобы посмотреть, как передаются значения в зависимости от изменения положения рычага джойстика и нажатия кнопки. Открыв мониторинг порта мы должны будем увидеть примерно следующую картину:

 Мониторинг последовательного порта программы Arduino IDE

У Вас могут немного отличаться значение, но суть не меняется. То есть в спокойном положении джойстика значения по оси X и Y находятся в районе 500, а кнопка выдает нам сигнал 1. Галочку "Автопрокрутка" не снимайте, я это сделал для того чтобы прекратили изменяться показания и сделать скриншот окна для этой статьи.

Отклоняя рычаг джойстика в какую либо сторону мы видим как в первых двух колонках изменяются показания от 0 до 1023:

Мониторинг порта

Нажимая на грибок джойстика, срабатывает кнопка и в третьей колонке вместо 1 появляется значение 0, говорящее нам о нажатом состоянии кнопки:

Мониторинг порта работы модуля джойстика с платой Arduino

Если у вас все так же, значит всё хорошо. Далее на основании приходящих данных о состоянии кнопки и положении грибка джойстика, нам надо с помощью логических операций, заставить микроконтроллер управлять другим (или другими) устройством. Чтобы было более понятно, давайте просто возьмем пять светодиодов и заставим их зажигаться в зависимости от того в какую сторону будет отклонен грибок модуля джойстика PS2 (XY Joystic), то есть каждый светодиод будет отвечать за свою сторону (верх, низ, лево, право), а пятый светодиод будет зажигаться при нажатии на кнопку джойстика. Рассмотрев внимательно данный пример с использованием светодиодов, и поняв принцип действий, вы сможете управлять без проблем любым другим устройством, с принципами работы и инициализацией которого вы уже знакомы.

И так, добавляем в нашу предыдущую схему ещё 5 светодиодов.

Подключение модуля джойстика PS2 (XY Joystic) к плате Arduino

К каждой плюсовой ножке светодиода подключаем отдельный выход платы Ардуино, в данном случае мы взяли пины 5, 6, 7, 8 и 9. Далее подводим землю (GND) к ножкам катодов светодиодов и незабываем поставить резисторы. После чего загружаем следующий скетч:

//КОНСТАНТЫ
const int SW = 4;  // кнопка джойстика
const int VRx = A1; // Ось X джойстика
const int VRy = A2; // Ось Y джойстика

void setup() // НАСТРОЙКИ
  {
  pinMode(VRx, INPUT); // устанавливаем аналоговый пин А1 в режим входа
  pinMode(VRy, INPUT); // устанавливаем аналоговый пин А2 в режим входа
  pinMode(SW, INPUT); // устанавливаем цифровой пин 4 в режим входа
  digitalWrite(SW, HIGH); // включаем встроенный подтягивающий резистор
  pinMode(5, OUTPUT); // устанавливаем цифровой пин 5 в режим выхода
  pinMode(6, OUTPUT); // устанавливаем цифровой пин 6 в режим выхода
  pinMode(7, OUTPUT); // устанавливаем цифровой пин 7 в режим выхода
  pinMode(8, OUTPUT); // устанавливаем цифровой пин 8 в режим выхода
  pinMode(9, OUTPUT); // устанавливаем цифровой пин 9 в режим выхода
  }

void loop()  // ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ
  {
  int X = analogRead(VRx); // считываем аналоговое значение оси Х и записываем его в новую переменную
  int Y = analogRead(VRy); // считываем аналоговое значение оси Y и записываем его в новую переменную
  int S = digitalRead(SW); // считываем состояние кнопки и записываем его в новую переменную

  if (X<250)
    digitalWrite(9, HIGH); // зажигаем светодиод подключенный к пину 9
  else
    digitalWrite(9, LOW); // отключаем светодиод подключенный к пину 9
    
  if (X>750)
    digitalWrite(6, HIGH); // зажигаем светодиод подключенный к пину 6
  else
    digitalWrite(6, LOW); // отключаем светодиод подключенный к пину 6

  if (Y<250)
    digitalWrite(7, HIGH); // зажигаем светодиод подключенный к пину 7
  else
    digitalWrite(7, LOW); // отключаем светодиод подключенный к пину 7

  if (Y>750)
    digitalWrite(8, HIGH); // зажигаем светодиод подключенный к пину 8
  else
    digitalWrite(8, LOW); // отключаем светодиод подключенный к пину 8

  if (S==0)
    digitalWrite(5, HIGH); // зажигаем светодиод подключенный к пину 5
  else
    digitalWrite(5, LOW); // отключаем светодиод подключенный к пину 5
  }

В данном скетче мы добавили инициализацию новых задействованных пинов для наших светодиодов в блоке SETUP. А так же появились логические конструкции (if, else), которые позволяют проверить необходимые нам условия. То есть, если условие стоящее после оператора if (ЕСЛИ) является верным, тогда выполняется строчка расположенная под ним, в противном же случае выполняется строчка расположенная после оператора else (ИНАЧЕ). Попробуйте изменять положения джойстика или давить на кнопку и вы увидите как будут загораться соответствующие светодиоды.

Все довольно просто и наверное уже много для такого устройства как модуль джойстика PS2 (XY Joystic). Если что-то осталось непонятно, пишите в комментариях.

 

 

 

Добавить комментарий

Защитный код
Обновить

шт.
Корзина пуста
Принимаем к оплате: