Подключение джойстика к Ардуино: принцип работы геймпада

Вопросы и ответы

Смысл подключения джойстика к ардуино

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

Этот модуль выдает примерно 2,5 В на выходе из X и Y в режиме ожидания. При перемещении джойстика выходной сигнал будет изменяться от 0 В до 5 В в зависимости от его направления. Если вы подключите этот модуль к микроконтроллеру, вы можете ожидать, что значение будет около 512 в режиме ожидания.

Когда вы перемещаете джойстик, вы можете видеть, что значения меняются от 0 до 1023, в зависимости от его положения.

Получаем данные от джойстика

Сначала проверяем работу джойстика и пытаемся получить с него данные и отправить их на дверной монитор.

Загрузим простой скетч и откроем монитор. Мы считываем состояние кнопки и потенциометров и отображаем их на мониторе двери.

Когда джойстик перемещается из центрального положения, данные потенциометра изменяются. При нажатии кнопки данные о цифровом контакте также изменяются.

Данные с джойстика в мониторе
Данные с джойстика в мониторе
Данные с джойстика в мониторе

Принцип действия

В приведенном ниже коде мы определили оси X и Y модуля джойстика для аналоговых контактов A0 и A1 соответственно:

Теперь в приведенном ниже коде мы инициализируем PIN-код 2 Arduino для модуля переключателя джойстика, и значения buttondtate и buttondtate1 будут равны 0 в начале описанной программы: int buttons = 2; int buttonSdtate = 0; int buttonSdtate1 = 0;

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

Здесь, в этом коде, мы считываем значения с аналоговых выходов A0 и A1 и последовательно выводим их на устройство:

Условия включения и выключения светодиода в зависимости от движения стержня джойстика определены в приведенном ниже коде. Здесь мы просто принимаем аналоговые значения напряжения на контактах A0 и A1 Arduino. Эти аналоговые значения будут изменяться при перемещении джойстика, и светодиод будет гореть в соответствии с перемещением джойстика.

Это условие для перемещения вала джойстика в направлении Y:

Когда мы перемещаем ось джойстика по диагонали, наступает позиция, когда аналоговые значения X и Y равны 1023 и 1023 соответственно, и загораются светодиоды Pin 9 и Pin 8. Потому что он соответствует условию светодиода. Затем, чтобы устранить это несоответствие, указывается условие, что если значение (X, Y) равно (1023, 1023), то оба светодиода остаются выключенными:

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

Для чего можно использовать джойстик?

На щитке джойстика четыре кнопки справа, кнопка непосредственно на джойстике и сам аналоговый джойстик. Экран можно использовать для управления мелодией или пикселями на мониторе. Кнопки можно использовать для навигации и управления играми.

Для дальнейшей мотивации смотрите видео ниже:

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

Как настроить Arduino для отслеживания состояния кнопки (нажата ли она)?

Прежде чем вы сможете узнать, нажата ли кнопка на щите джойстика, вам необходимо настроить Arduino для распознавания кнопок. Удивительно, но это реализовано в теле функции setup()!

Во-первых, давайте определим константы для контактов Arduino, связанных с кнопками:

Если вы раньше использовали кнопки с Arduino, вы могли заметить, что необходимо использовать резистор для измерения напряжения при нажатии кнопки. Чтобы уменьшить количество деталей, щиток джойстика сконструирован таким образом, что сопротивление не требуется. Вы можете спросить: «Если для кнопок нужны резисторы, почему щиток работает без них?» Вы не учли, что в Arduino встроены резисторы. Вы можете просто активировать их и использовать вместе с нашим щитом!

Чтобы использовать эти встроенные подтягивающие резисторы, установите вывод в режим INPUT, затем включите его, используя следующие строки:

Если вы используете подтягивающий резистор, важно помнить, что нажатая кнопка не ВЫСОКИЙ, а нажатая кнопка — НИЗКИЙ.

Чтобы настроить каждый вывод для работы в режиме ввода и активировать подтягивающие резисторы, можно использовать следующий код:

Далее мы узнаем, как определить, нажата ли кнопка.

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

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

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

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

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

  • константный байт PIN_ANALOG_X = A0; // константа для координаты X
  • константный байт PIN_ANALOG_Y = A1; // константа для координаты Y

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

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

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

Координаты джойстика Arduino

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

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

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

Заключение Описание

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

Joystick Shield

Как уже упоминалось выше, выпускается много модулей джойстиков. У Sparkfun есть интересное решение. Выпускают Joystick Shield, о котором мы поговорим позже. Внешний вид экрана джойстика показан на следующем рисунке.

Щиток джойстика

Сборка джойстик шилда

Здесь стоит отметить, что щиток поставляется в разобранном виде. Значит нужно работать паяльником. Полные инструкции по сборке доступны по этому адресу: Руководство по сборке щита джойстика. Материал от производителя на английском языке, но фотоматериала достаточно. Так что это легко понять.

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

Очень полезный фрагмент кода. Основываясь на значениях позиций X и Y, мы можем определить, находится ли джойстик по центру или он смещен в одном из восьми направлений (вверх, вправо вверх, вправо, вправо вниз, вниз, влево-вниз, влево, оставлено).

Поскольку значения в каждом направлении будут в диапазоне от 0 до 1023, можно предположить, что центр будет в диапазоне 511-512. Но это не так. Так точно мы не получим текущее значение. И если мы определим неверное значение, мы сможем получить информацию о движении джойстика, хотя он был по центру и не двигался.

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

Этот диапазон не является «истиной в последней инстанции». Вы должны установить его на свой джойстик, верно. Эти значения вводятся в код как константы:

Теперь мы преобразуем каждую координату из диапазона от 0 до 1023 в диапазон от -1 до 1. Для координаты X 1 означает движение влево, 0 означает не двигаться, а 1 означает движение вправо. Для направления Y, -1 означает движение вниз, 0 означает отсутствие движения и 1 означает движение вверх.

Мы начнем с установки значения в каждом направлении на 0 («центр»). Затем мы используем операторы if / else, чтобы проверить, больше или меньше значение позиции в обоих направлениях нашего диапазона:

В Arduino IDE есть функция map (), которую теоретически можно использовать вместо if / else, но в этом случае метод усложнен из-за проблем с центрированием, поэтому мы не будем использовать здесь map.

В приведенном ниже примере вы увидите, что позже, если / else используется для отображения направления, вы можете безопасно изменить этот пример в соответствии со своими потребностями:

Необходимые инструменты, материалы и программы

Для реализации проекта «джойстик ардуино» потребуются следующие материалы:

  • arduino UNO;
  • модуль джойстика;
  • led — 5 штук;
  • резистор 100 Ом — 3 штуки;
  • соединительные кабели;
  • договоренность.

Сборка устройства

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

Этот модуль джойстика имеет две оси. Они представляют ось X и ось Y. Каждая ось установлена ​​на потенциометре или потенциометре. Середины этих сосудов обозначены как Rx и Ry. Следовательно, Rx и Ry — переменные точки для этих судов. Когда прибор находится в режиме ожидания, Rx и Ry действуют как делители напряжения.

Когда джойстик Arduino перемещается по горизонтальной оси, напряжение на выводе Rx изменяется. Аналогичным образом, когда он перемещается по вертикальной оси, напряжение на пикселе Ry изменяется. Таким образом, мы имеем четыре направления устройства на двух выходах АЦП. По мере движения ручки напряжение на каждом контакте должно быть высоким или низким, в зависимости от направления.

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

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

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

Управляем матрицей

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

Подключаем библиотеки и выставляем все необходимые переменные.

Инициализируем библиотеки и пины. И выведем светодиод в исходное положение.

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

Он получит предыдущее состояние светодиода, а также координаты движений с джойстика. И он рассчитает следующий светодиод, который должен включиться.

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

Функция color () изменит цвет светодиода на случайный. По умолчанию кнопка в форме отправляет 1, поэтому давайте добавим знак к условию !

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

Управление матрицей с помощью джойстика

Управление матрицей с помощью джойстика

Считывание показаний с аналогового джойстика

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

вкладка Serial.println (Y); }

Значения X и Y аналогового джойстика отображаются на мониторе последовательного порта
Значения X и Y с аналогового джойстика,
монитор последовательного порта

Декларируем пины, устанавливаем для них режимы работы. Обратите внимание, что в процедуре setup () мы устанавливаем вход switchPin на высокий уровень. Это включает встроенный подтягивающий резистор на этом порте. Если его не включить, при не нажатой кнопке джойстика 8-й порт Arduino зависнет в воздухе и захватит звукосниматели. Это приведет к нежелательным и хаотичным ложным срабатываниям.

В процедуре loop () мы постоянно опрашиваем состояние кнопки и отображаем его с помощью светодиода на выходе 13. Из-за активации входа switchPin светодиод постоянно горит, а при нажатии кнопки гаснет, и А не наоборот.

Затем мы считываем показания двух потенциометров джойстика: выход осей X и Y. Arduino имеет 10-битный АЦП, поэтому значения, считываемые джойстиком, находятся в диапазоне от 0 до 1023. В центре положение джойстика, как вы можете видеть на иллюстрации, значения в области 500 находятся примерно в середине диапазона.

Обратите внимание, что показания осей X и Y в нейтральном положении ручки джойстика могут отличаться, а не точно 512.

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

Подключите джойстик согласно следующей схеме. Подключите аналоговые выходы X и Y джойстика к аналоговым входам A1 и A2 Arduino, выход кнопки SW — к цифровому входу 8. На джойстик подается напряжение +5 В.

Подключите аналоговый джойстик к Arduino
Подключите аналоговый джойстик к Arduino

Результат должен выглядеть как на фото.

Аналоговый джойстик, подключенный к Arduino
Аналоговый джойстик, подключенный к Arduino

Настройка и отладка

После загрузки кода в Arduino и подключения компонентов в соответствии со схемой подключения, теперь мы управляем светодиодами с помощью джойстика. Четыре светодиода могут гореть в каждом направлении в зависимости от движения вала устройства. Он имеет два внутренних потенциометра, один для движения по оси X, а другой для движения по оси Y. Каждый потенциометр получает 5 В от Arduino. Когда мы перемещаем устройство, значение напряжения будет изменяться, и аналоговое значение на контактах A0 и A1 также изменится.

Затем с микроконтроллера arduino считываем аналоговое значение для осей X и Y и включаем светодиоды в соответствии с перемещением оси устройства. Нажмите переключатель на модуле и используйте его для управления одним светодиодом в цепи.

Читайте также: Подключение кнопки ардуино с подтягивающим резистором

Оцените статью
Блог про Arduino