Подключение джойстика к Arduino Управление сервоприводами.

Подключение джойстика к Arduino Управление сервоприводами.

В видео рассказано как подключить джойстик к Ардуино и управлять движением 2-х сервомоторов. Управление сервомоторами будет по двум осям. По горизонтали и по вертикали. Управление джойстиком  самый удобный способ управлять серво приводом. Подключение джойстика к arduino к аналоговым входам даёт интервал в 1024 градации, которые можно перевести в 180 градусов.

Сегодня мой рассказ будет как подключить модуль джойстика к Ардуино.  
Этот пример можно использовать для поворотной панели, на которую можно установить камеру или лазер. В этом случае получится лазерный прицел. Так же можно управлять движением робота или машины и многое другое.
В одном из следующих видео я покажу как добавить в этот пример модули NRF24 и управлять устройствами удалённо, без проводов. Если вы не знаете что это за модули, то можете посмотреть примеры использования такого модуля.
В видео будет представлено 2 примера. 
Первый это просто движение сервомоторов вверх и вниз и вправо и влево. Движение будет пока ручка джойстика отклонена от центральной точки. После того как отпустили джойстик сервомоторы вернутся в изначальное положение. Движение возможно по двум осям. Горизонтальной и вертикальной.
Второй пример – это движение с памятью. По окончании движения положение сервомотора будет запоминаться, сохраняться в переменную, а после того как отпустили ручку управления джойстика сервомотор останется в той точке где он прекратил движение. Если снова переместить джойстик, то положение мотора продолжится из последней точки.
Этот пример мы более подробно рассмотрим дальше в видео.

А ещё на джойстике есть кнопка. Я буду использовать её для зажигания светодиода, ну а вы можете придумать что-то более полезное. Главное что в скетче уже есть код управления кнопкой, а что включать изменяется всего одной строчкой кода.

Теперь давайте рассмотрим сам модуль джойстика.

Устройство джойстика.
Из модуля выходят 5 проводов.

  • Два из которых питание. Джойстик работает от 5 вольт.
  • Ещё два — это оси x и y. Эти контакты подключаются к аналоговым входам и имеют значение от 0 до 1023. Средняя точка установлена на заводе и имеет значение примерно 510. Правда имеется небольшой разброс. Поэтому лучше сначала проверить какое значение по центру.
  • И последний вывод это кнопка. В игрушках её можно использовать для выстрела, а при работе с фотокамерой можно сделать нажатие на спуск фотоаппарата. 

Давайте посмотрим схему подключения.

  • Землю джойстика подключаем к земле, а питание подключаем к выходу +5 вольт Ардуино.
  • Ось X подключаем к аналоговому входу А1, а Ось Y подключаем к аналоговому входу А2.
  • Кнопку подключаем к цифровому входу D4.

Сервомоторы желательно питать от отдельного источника напряжения +5 вольт. Земли обоих источников должны быть соединены вместе.
Нижняя серва которая отвечает за движение по оси Х подключается к цифровому выходу D2, а верхняя которая движется вверх и вниз подключаем к цифровому выходу D3.
Светодиод в примере используется параллельно тому, что распаян на плате, то есть на цифровом выходе D13.
Вот и вся схема. Она довольно простая.

Конструкцию поворотного механизма можно купить, можно сделать на 3д принтере, а можно просто разместить друг на друге. Получится не очень красиво, зато бесплатно и просто. И можно сделать буквально за 5 минут.

Теперь давайте подробнее посмотрим как это всё работает.
Начнём с определения координат центральной точки. Для этого запускаем скетч Joystick_Servo. Подробно как и что, я расскажу дальше. Здесь нас всего лишь интересуют вот эти строчки. Чтобы он не мельтишили я вставил паузу в полсекунды.
Как видите при центральном положении джойстика мы получаем координаты по оси х 91 градус, а по осу Y 87 градусов. Это нам пригодиться в следующем примере. Теперь отклоним ручку сервера по оси y до конца и получим 179 градусов, теперь в другую сторону и получим 0. Тоже самое проделаем с осью х.
Теперь загружаем следующий скетч и остановимся на нём более подробно.
В начале нам надо подключить библиотеку Servo. Думаю, что с этим проблем быть не должно. Создаём 2 класса для двух сервомоторов. Это классы MyServo1 и MyServo2.
Переменные a и b нужны для хранения текущего положения по осям  x и y сервомоторов.
Переменным X и Y будут присвоены считанные значения с джойстика и переведённые в градусы. Это будут значения от 0 до 180 градусов.
Здесь указываем к каким контактам будет подключен джойстик, кнопка и в моём случае светодиод.
Переменная флаг нужна для работы с кнопкой на модуле.

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

В цикле loop мы постоянно считываем текущее положение с обоих сервомоторов и присваиваем их переменным a и b.  А здесь мы принимаем положение ручки джойстика. Так как джойстик подключён к аналоговому входу, то  он может иметь значение от 0 до 1023. 

Функция map преобразует их в интервал от 0 до 180. Так мы получаем градусы. Например для сервомотора по оси Y можно уменьшить этот интервал и сделать от 45 до 135 этим мы уменьшим повороты мотора.
Рассмотрим ось X. В начале мы определили, что при центральном положении джойстика оно было равно 91. Делаем небольшой зазор. Если его не сделать, или он будет маленьким, то у вас при включении джойстик будет двигаться непрерывно в какую-нибудь сторону. Так, что этот интервал придётся подобрать самостоятельно.

Теперь если положение выше центрального, то уменьшаем его с шагом 1, а если ниже, то увеличиваем.
Отправляем значение на сервомотор и он перемещает свой вал в эту позицию. Это небольшая пауза, что бы мотор успел переместиться. Чем меньше это значение, тем быстрее и более плавно будет двигаться мотор, но тяжелее остановить в определённом месте. Он будет его проскакивать.

Ось Y мы рассматривать не будем, здесь всё тоже самое что и по оси х. Единственное что центр у нас был в позиции 87.

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

Ну я думаю, что всё понятно объяснил. Если нет, то спрашивайте. По возможности отвечу.