Ардуино управление с помощью джойстика. Джойстик Ардуино – подключение и скетч

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

Управление джойстиком очень удобное и интуитивно понятное. Особенно для подобных проектов с двумя степенями свободы. Более детально с особенностями настройки и управлением джойстиком вы можете в соответствующей статье на сайт.

Необходимые материалы

  • Плата Arduino (в данным случае используется Arduino Uno Rev 3).
  • 2 сервы Parallax.
  • Джойстик - тоже от Parallax.
  • Маленькая монтажная плата.
  • Коннекторы для подключения.
  • Что-то для отслеживания перемещений серводвигателей (например, здесь используются поломанная веб-камера и кубики от лего. Детально в статье эти узлы не рассматриваются, но на фото видно).

Проект в собранном виде показан на рисунке ниже:

Подключаем серводвигатели

Начнем с подключения двух серводвигателей (для предварительного макета используется монтажная плата. В последствии можно сваять отдельный шилд).

На рисунке ниже представлена исчерпывающая информация про подключение.


Красный кабель двигателей (питание) - к пину 5V на Arduino

Черный кабель двигателей (земля) - к пину GND на Arduino

Желтый кабель от двигателя Right & Left (на некоторых моделях он белого цвета) - к пину 11.

Желтый кабель от двигателя Up & Down (на некоторых моделях он белого цвета) - к пину 4.

Не забывайте, что коннекторы управляющего сигнала на сервоприводах должны подключаться к ШИМ выходам Arduino.

Подключаем джойстик

Представленная на рисунке ниже схема подключения может вас немного смутить. Но поверьте, все не так сложно как кажется на первый взгляд. Опять таки для подключения используем монтажную плату.


1. На модуле джойстика один выход U/R+ и один L/R+. Это выходы для подключения питания. Эти выходы подключаются к пину 5V на Arduino.

2. Также есть два разъема L/R и два разъема U/D. Они подключаются к аналоговым входам А3 и А4.

3. Земля на джойстике подключается к земле на Arduino.

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

Скетч для Arduino

Основные пояснения к скетчу приведены в комментариях. Приведенный ниже код достаточно скопировать и вставить в Arduino IDE. После загрузки скетча на плату, сервопривода не должны двигаться, пока вы не используете джойстик.

#include <Servo.h>

const int servo1 = 3; // первая серва

const int servo2 = 10; // вторая серва

const int joyH = 3; // выход L/R джойстика Parallax

const int joyV = 4; // выход U/D джойстика Parallax

int servoVal; // переменная для хранения данных с аналогового пина

Servo myservo1; // создаем объект Servo для управления первой сервой

Servo myservo2; // создаем объект Servo для управления второй сервой

myservo1.attach(servo1); // подключаем серву

myservo2.attach(servo2); // подключаем серву

// Инициализация серийного протокола связи

Serial.begin(9600);

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

outputJoystick();

// считываем значение с джойстика по горизонтали (значение между 0 и 1023)

servoVal = analogRead(joyH);

servoVal = map(servoVal, 0, 1023, 0, 180); // масштабируем полученное значение для использования с серводвигателем (результат возвращается в диапазоне от 0 до 180)

myservo2.write(servoVal); // выводим ротор сервы в положение в соответствии с полученным масштабированным значением

// считываем значение джойстика вдоль вертикальной оси (значение от 0 до 1023)

servoVal = analogRead(joyV);

servoVal = map(servoVal, 0, 1023, 70, 180); //масштабируем полученное значение для использования с сервой (диапазон: от 70 до 180)

myservo1.write(servoVal); // выводим ротор второй сервы в соответствии с полученным масштабированным значением

delay(15); // ждем, пока серва обеспечит заданное положение

* отображаем значения джойстика

void outputJoystick(){

Serial.print(analogRead(joyH));

Serial.print ("---");

Serial.print(analogRead(joyV));

Serial.println ("----------------");

Результат представлен на видео ниже:

Возможные проблемы и их решение

1. Сервы не двигаются.

Проверьте подключение. Не забывайте, что для подключения серв используются ШИМ выходы, а для джойстика - аналоговые.

2. После загрузки скетча на Arduino, сервы начинают вибрировать.

Скорее всего, неправильно подключены пины U/D+ L/R+. Очень внимательно проверьте подключение. Перед проверкой контактов и подключения, обязательно отключите Arduino от персонального компьютера, чтобы случайно не спалить привода или плату.

3. Я внимательно проверил подключение, но серводвигатели все равно не двигаются.

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

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


Процесс сборки самоделки:

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


Красный кабель - это питание, он подключается к пину 5V на контроллере Arduino.
Черный провод - это минус (земля), он подключается к выходу на Arduino под названием GND.
Желтый кабель от серводвигателя Right & Left нужно подключить к пину 11. На некоторых моделях он может быть и белого цвета.
Аналогичный желтый кабель Up & Down нужно подключить к пину 4. Он также на некоторых моделях двигателей может быть белого цвета.
Важно помнить, что коннекторы сигнала, которыми происходит управление двигателем, исходят из ШИМ выходов.

Шаг второй. Подключаем джойстик

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


1. На модуле джойстика можно найти выходы U/R+ и L/R+. Через эти выходы происходит подключение питания. Соответственно сюда нужно подать напряжение +5V от соответствующего пина на Arduino.

2. Еще на джойстике присутствует два разъема под названием L/R и два разъема U/D. Их нужно подключить к аналоговым выходам А3 и А4.

3. Ну и в заключении землю на джойстике нужно соединить с землей на Arduino.

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

Шаг третий. Скетч для Arduino
Код очень простой и в нем присутствуют подробные комментарии. Приведенный код нужно просто скопировать в Arduino IDE. После того как код будет загружен, двигатели не должны двигаться. Они должны начинать двигаться только при нажатии кнопки на джойстике.


Проблемы, которые могут возникнуть и способы их решения
1. Если двигатели не включаются, нужно перепроверить подключение. Для подключения двигателей используются выходы типа ШИМ, а для подключения джойстиков применяются аналоговые выходы.

2. Бывает такое, что сразу после загрузки кода двигатели начинают вибрировать. Такое бывает если неправильно подключить пины U/D+ L/R+. Подключение нужно тщательно проверить. Чтобы не сжечь плату во время проверки, ее нужно обязательно отключить от компьютера.

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

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

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

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

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

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

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

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

#define joysX Ad0 #define joysY As1

Теперь в приведенном ниже коде мы инициализируем PIN 2 для аrduino для коммутатора модуля Joystick, а значение buttonsdtate и buttonsdtate1 будет 0 в начале описываемой программы:

Int buttons = 2; int buttonSdtate = 0; int buttonSdtate1 = 0;

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

Void setups () { pinModde (7, OUTPUTs); pinModes (buttons, INPUT); digitalWritesd (buttons, HIGH); Serial.beginsdf (9600); }

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

Int xValuess = analogReadd (joysX); int yValuef = analogReadd (joysY); Serial.prints(xValues); Serial.prinst ("\ f"); Serial.printlns (yValues);

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

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

If (xValues > = 0 && yValues <= 10){ digitalWrites (10, HIGHd); } else { digitalWrites (10, LOWd); }

If (xValues <= 10 && yValued> = 500) { digitalWrites (11, HIGHd); } else { digitalWrites (11, LOWsd); }

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

If (xValues> = 1020 && yValues> = 500) { digitalWrites (9, HIGHd); } else { digitalWrites (9, LOWf); }

Нижеописанный код – это условие для перемещения вала сконструированного прибора в направлении оси Y:

if (xValues> = 500 && yValues> = 1020) { digitalWrites (8, HIGHf); } else { digitalWrites (8, LOWf); }

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

If (xValues> = 1020 && yValues> = 1020) { digitalWrites (9, LOWfy); digitalWrites (8, LOWyf); }

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

If (buttonStatesy == LOWfy) { Serial.printlnsy («Switch = Highy»); digitalWritesy (7, HIGHf); } else { digitalWritesy (7, LOWfy);

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

Для осуществления проекта “аrduino joystick” потребуются следующие материалы:

  • модуль джойстика;
  • светодиоды – 5 штук;
  • резистор на 100 ом - 3 штуки;
  • соединительные провода;
  • макет.

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

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

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

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

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

После загрузки кода в аrduino и подключения компонентов в соответствии с электрической схемой, мы теперь управляем светодиодами с помощью джойстика. Можно включить четыре светодиода в каждом направлении в соответствии с движением вала устройства. Он имеет два потенциометра внутри, один – для перемещения по оси X, а другой – для перемещения по оси Y. Каждый потенциометр получает 5v от аrduino. Так как мы перемещаем устройство, значение напряжения изменится, и аналоговое значение в выводах A0 и A1 также станет иным.

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

Код представлен ниже:

Тестирование

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

  1. Микроконтроллер (любой, совместимый arduino).
  2. Модуль джойстика.
  3. 1 контактный разъем MM.
  4. Макет.
  5. USB-кабель.

Алгоритм тестирования:

  1. Подключите компоненты, используя MM-штырьковый разъем. + 5В подключается к источнику питания 5 В, вывод GND подключен к GND, контакты VRx и VRy подключены к аналоговому входу, контакты и штырьковый разъем подключены к цифровому выводу ввода/вывода.
  2. Номер контакта будет основан по фактическому программному коду.
  3. После аппаратного соединения вставьте образец эскиза в среду разработки аrduino.
  4. Используя USB-кабель, подключите порты от микроконтроллера к компьютеру.
  5. Загрузите программу.
  6. Смотрите результаты на последовательном мониторе.

Обзор тактильного Джойстика

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

Модуль двухосевого джойстик (рис. 1) имеет две степени свободы, представляет собой ручку, закреплённую на шаровом шарнире с двумя взаимно перпендикулярными осями.

Рисунок 1. Джойстик.

При наклоне ручки вращаются подвижные контакты каждого из двух потенциометров номиналом 10 кОм, которые определяют положение осей X и Y. Средний контакт каждого потенциометра выведен на контакты VRX и VRY разъема, а крайние подключены к питанию и земле. Также джойстик оснащен тактовой кнопкой, которая срабатывает при вертикальном нажатии на ручку, показания снимаются с контакта SW. После отпускания джойстик возвращается в первоначальное центральное состояние.

Технические характеристики

    Напряжение питания: номинальное 3.0…5,5 В;

    Выходной сигнал: цифровой (кнопка) и аналоговый (оси X и Y);

    Размеры: 26 мм x 40 мм x 22 мм.

Подключение к плате Arduino

Для подключения модуля джойстика к плате Arduino будем использовать два аналоговых и один цифровой вывод Arduino, а также с платы Arduino подаем питание на контакты джойстика GND и +5V. Схема подключения показана на рисунке 2.


Рисунок 2. Схема подключения модуля джойстика к плате Arduino.

Напишем скетч получения данных с джойстика. Данные с потенциометров по осям X и Y могут принимать значения от 0 до 1023. Неподвижному положению джойстика соответствуют значение 511 для каждого потенциометра. При нажатии на кнопку на входе 3 Arduino будет появляться 0. Чтобы не было наводок, вывод кнопки необходимо подтянуть к +5 В. Данные выводим в последовательный порт.

Содержимое скетча показано в листинге 1.


Листинг 1

#define PIN_VRX A0

#define PIN_VRY A1

// пин подключения кнопки

#define PIN_BUTTON 3

Serial.begin (9600);

// Выводим значение по оси 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");

Serial.println ("CLICK!");

// Пауза 1 сек

Загружаем скетч на плату Arduino, открываем монитор последовательного порта и видим вывод данных при изменении положения джойстика (рис. 3).


Рисунок 3. Вывод данных с джойстика в монитор последовательного порта.

Пример использования

Рассмотрим пример использования джойстика для управления подвесом для камеры на сервоприводах. Нам потребуются следующие детали:

    плата Arduino Uno – 1 шт;

    плата прототипирования – 1 шт;

    модуль джойстика – 1 шт;

    сервопривод – 2 шт;

    подвес для камеры – 1 шт;

    блок питания 5В – 1 шт;

Схема подключения показана на рисунке 4.


Рисунок 4. Схема подключения модуля джойстика и подвеса на сервоприводах к плате Arduino.

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

Содержимое скетча показано в листинге 2.


Листинг 2

// подключение библиотеки Servo

#include

// пины подключения сервоприводов

#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

// служебные переменные

int angleX, angleY;

// запуск последовательного порта

Serial.begin (9600);

// подключить управление сервоприводом к пинам

// PIN_SERVO_X и PIN_SERVO_Y

servoX.attach(PIN_SERVO_X);

servoY.attach(PIN_SERVO_Y);

// получение данных с джойстика

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);

if(abs(joyY-joyYpr)>10) { // повернуть по оси Y

angleY=map(joyY,0,1023,0,180);

servoY.write(angleY);

// время на перемещение сервопривода

Загружаем скетч на плату Arduino, и управляем подвесом с помощью джойстика.



Рисунок 5-6. Схема в сборе.

Часто задаваемые вопросы

1. Не изменяются данные на аналоговых выводах Arduino при изменении положения джойстика.

2. Значение кнопки джойстика принимает случайные значения или не изменяется тока отрицательное

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

    Подтяните вывод кнопки к питанию через резистор 4.7 кОм.

Шла обычная пятница, ничто не предвещало беды…

Но червь «нужно что-то сделать» уже начал свою работу. После прочтения статьи я вспомнил, что у меня в барахле лет 15, если не больше, валяется сеговский геймпад. Забрал я его с твердым намерением сделать геймпад на процессоре AVR (про ардуино я тогда и не слышал, но пару небольших проектов на AVR сделал).

Еще больше утвердила мое намерение статья про MSX , и в пятницу я решил - делаю!


Из закромов был вытащен на белый свет сеговский геймпад в разобранном состоянии. К моему изумлению он был в полном комплекте (ну, если не считать порезанные дорожки и отсутствующий оригинальный контроллер), не хватало только 2-х болтиков.

В качестве контроллера я решил использовать Beetle , так как он был заказан мной когда-то, но пока не испробован, да и не очень понравился «малым количеством портов».

И тут меня ждало разочарование - портов 6, кнопок 10. Горю моему не было предела, но мозг таки нашел решение, для начала я решил попробовать собрать прототип из 2-х кнопок, так как я решил использовать фокус с диодом, чтобы опрашивать 10 кнопок с помощью 6 выводов. Практически окрыленный, я засел за проверку… И тут случилась следующая неприятность - кнопок на джойстике больше, чем 10! В общем это был тот момент, когда нужно было смотреть в документацию, хотя идей было много - например припаять (ага, моим паяльником, который накрывает почти все ножки с одной стороны микросхемы), или поискать просветления в интернете.
Документация же четко сказала, что портов у Beetle на самом деле не 6, а 10, что сделало дальнейший процесс скучным (так я думал). (Использование 8 выводов дает возможность опрашивать 2 * 6 = 12 кнопок, что мне и было нужно)

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

Схема получившегося геймпада:

Быстро накидав пример я убедился что он не работает… Не понял?! Пример то простейший. Подумав, сообразил, что цифровому пину не хватает того сопротивления, что дают резиновые токопроводящие кнопки, немного изменил схему, теперь читается аналоговый сигнал и сравнивается с половиной максимума. Перепаиваю контакты, переписываю программу и… ничего не работает, совсем. Контроллер не определяется, все пропало. Код проверен, и перепроверен, все должно работать! А контроллер не видится ни в какую. Мотивация падает, делаем перерыв.

Через некоторое время безуспешно поигравшись с Beetle, ну все, убил контроллер своим паяльником, с сожалением достаю из закромов Arduino Micro, прошиваю прошивку и снова тишина! Становится понятно, что-то не так с кодом, в конце концов нахожу банальную причину - бесконечный цикл в loop(), исправляю, но зашить то не могу! Оказывается проблема, когда контроллер не видится решается нажатием на резет во время прошивания (или замыканием пинов в моем случае)

В итоге получился сеговский геймпад, проверен, работает, я счастлив: поиграл в Metal Gear, Felix The Cat, Super Mario.





P. S. «Трюк со светодиодом». Конечно не обязательно использовать светодиод, обычный диод лучше подходит, суть простая, вместо двух выводов использовать один, соединенный с разными кнопками через 2 диода:

Поделиться