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

Для плат Arduino существуют модули аналоговых джойстиков. Как правило, имеющие ось X, Y и кнопку - ось Z. Джойстик позволяет более плавно и точно отслеживать степень отклонения от нулевой точки. А помимо удобства по сравнению с кнопками, это позволяет реализовывать более совершенные интерфейсы. К примеру, при изменении какого-либо значения в меню, можно написать программу таким образом, что чем сильнее отклонена ось джойстика, тем быстрее изменяется значение переменной. Например, нам необходимо изменить значение от 0 до 2000 с шагом в 1. Представьте, сколько раз вам потребовалось бы нажимать кнопку или писать специальный алгоритм, скажем при длительности нажатия больше 3 сек прибавлять изменять шаг на 10 или 100. А при использовании джойстика это можно реализовать намного проще.

Средняя цена на подобные модули колеблется в районе 1-2$ за модуль (с бесплатной доставкой в Россию). Поиск модулей в магазине AliExpress

Сами модули выглядят примерно так:

Не пугайтесь количеством выводов, это сделано для универсальности и удобства подключения. Контакты Vcc и GND между всеми тремя группами контактов соединены. Т.о. для подключения нужно 5 проводов: ось X, ось Y, кнопка Z, питание V cc и общий GND. Джойстики пассивные модули и не потребляют какую-либо энергию от платы Arduino. Питание V cc необходимо только для подтягивающих резисторов. Бывают модули без подтягивающих резисторов, в таком случае, необходимо вывод подключения кнопки подтянуть к +V cc через резистор 1-10 кОм.

Схема подключения к Arduino:

В программе, работать с джойстиком также очень просто:

#define axis_X 0 // Ось Х подключена к Analog 0 #define axis_Y 1 // Ось Y подключена к Analog 1 #define axis_Z 2 // Ось Z (кнопка джойстика) подключена к Digital 2 int value_X, value_Y, value_Z = 0; // Переменные для хранения значений осей void setup() { pinMode(axis_Z, INPUT); // Задаем как вход Serial.begin(9600); } void loop() { value_X = analogRead(axis_X); // Считываем аналоговое значение оси Х Serial.print("X:"); Serial.print(value_X, DEC); // Выводим значение в Serial Monitor value_Y = analogRead(axis_Y); // Считываем аналоговое значение оси Y Serial.print(" | Y:"); Serial.print(value_Y, DEC); // Выводим значение в Serial Monitor value_Z = digitalRead(axis_Z); // Считываем цифровое значение оси Z (кнопка) value_Z = value_Z ^ 1; // Инвертируем значение Serial.print(" | Z: "); Serial.println(value_Z, DEC); // Выводим значение в Serial Monitor delay(250); // Задержка 250 мс }

Как видно выше, в начале мы определяем входные пины для осей (define), а потом в главном цикле считываем значения с пинов и выводим их в Serial Monitor. И видим следующую картину:

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

#define axis_Y 1 // Ось Y подключена к Analog 1 #define axis_Z 2 // Ось Z (кнопка джойстика) подключена к Digital 2 int value, value_Y, value_Z = 0; // Переменные для хранения значений осей void setup() { pinMode(axis_Z, INPUT); // Задаем как вход Serial.begin(9600); } void loop() { value_Y = analogRead(axis_Y); // Считываем аналоговое значение оси Y if(value_Y >= 0 && value_Y < 100) value = value - 10; if(value_Y > 100 && value_Y < 300) value = value - 5; if(value_Y > 300 && value_Y < 520) value = value - 1; if(value_Y > 535 && value_Y < 700) value = value + 1; if(value_Y > 700 && value_Y < 900) value = value + 5; if(value_Y > 900) value = value + 10; value_Z = digitalRead(axis_Z); // Считываем цифровое значение оси Z (кнопка) if(value_Z == 0) value = 0; // Сброс значения Serial.println(value, DEC); // Выводим значение в Serial Monitor delay(500); // Задержка }

Подключение джойстика к Arduino позволит сделать дистанционное управление с помощью джойстика машинкой или роботом на Ардуино. Рассмотрим в статье, как подключить джойстик шилд самостоятельно и сделать управление сервоприводом с помощью джойстика на Ардуино. Представим несколько скетчей и дадим схему подключения джойстика к микроконтроллеру Arduino Nano или Arduino Uno.

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

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

Как подключить джойстик к Arduino Nano и Arduino Uno

У модуля джойстика KY-023 есть свои недостатки. Дело в том, что ручка джойстика не всегда точно возвращается в центральное положение, поэтому следует учитывать в программе центральное положение ручки, как некоторый диапазон значений, а не точное значение. То есть, при положении ручки джойстика в центре, значение X и Y координат может находиться в диапазоне от 490 до 530, вместо 512.

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

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль джойстика ky-023;
  • 2 светодиода и 2 резистора;
  • макетная плата;
  • провода «папа-мама», «папа-папа».
Схема подключения аналогового джойстика к Ардуино Уно

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

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

#define pinX A2 // ось X джойстика #define pinY A1 // ось Y джойстика #define swPin 2 // кнопка джойстика #define ledPin 13 // светодиод на Pin 13 void setup () { Serial .begin (9600); pinMode (ledPin, OUTPUT ); pinMode (pinX, INPUT ); pinMode (pinY, INPUT ); pinMode (swPin, INPUT ); digitalWrite (swPin, HIGH ); } void loop () { boolean ledState = digitalRead (swPin); // вкл./выкл. светодиод // считываем значение оси Х // считываем значение оси Y Serial .print (X); // выводим в Serial Monitor Serial .print ("\t" ); // табуляция Serial .println (Y); }

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

Теперь можно усложнить схему, сделав плавное включение светодиода , управляемое от джойстика. Для этого подключите два светодиода через резистор к аналоговым портам 5 и 6. В следующем скетче, с помощью функции map() , переменные X и Y преобразуются из диапазона чисел от 0 до 1023 в диапазон чисел от 0 до 255. Подключите светодиоды к пинам 5 и 6 Ардуино и загрузите следующий скетч.

#define pinX A2 // ось X джойстика #define pinY A1 // ось Y джойстика #define swPin 2 // кнопка джойстика #define ledPin 13 // светодиод на Pin 13 #define ledX 5 // светодиод на Pin 5 #define ledY 6 // светодиод на Pin 6 void setup () { pinMode (ledX, OUTPUT ); pinMode (ledY, OUTPUT ); pinMode (ledPin, OUTPUT ); pinMode (pinX, INPUT ); pinMode (pinY, INPUT ); pinMode (swPin, INPUT ); digitalWrite (swPin, HIGH ); } void loop () { boolean ledState = digitalRead (swPin); // считываем состояние кнопки digitalWrite (ledPin, ledState); // вкл./выкл. светодиод int X = analogRead (pinX); // считываем значение оси Х int Y = analogRead (pinY); // считываем значение оси Y X = map (X, 0, 1023, 0, 255); // преобразуем значение X в другой диапазон Y = map (Y, 0, 1023, 0, 255); // преобразуем значение Y в другой диапазон analogWrite (ledX, X); // включаем светодиоды с разной яркостью analogWrite (ledY, Y); }

Пояснения к коду:

  1. с помощью функции map() можно задать любой, в том числе, обратный диапазон чисел. Также можно использовать отрицательные значения.

Сегодня я решил попробовать управлять сервоприводом при помощи джойстика, собрав простую схемку на базе Arduino Uno.

Что нам потребуется

  1. Соединительные провода;

Исходный код

#include
int joyX=0;
int angl=0;
Servo myservo;
void setup()
{
myservo.attach(9);
pinMode(joyX,INPUT);
Serial.begin(9600);
}
void loop()
{
int val = (analogRead(joyX)/64)-8;
if (val > 0) {
angl=angl+abs(val);
}
else {
if (val < 0) {
angl=angl-abs(val);}
}
if (angl < 0) angl = 0;
if (angl > 180) angl = 180;
Serial.print("Power: ");
Serial.println(val);
Serial.print("Angle: ");
Serial.println(angl);
myservo.write(angl);
int spd = 500;
if (val != 0) {
spd = 600/abs(val);
}
Serial.print("Speed: ");
Serial.println(spd);
Serial.println("-----------");
delay(spd);
}

Как это работает

Управлять сервоприводом оказалось просто (с использованием библиотеки). Мы просто вызываем функцию write и значение угла поворота в градусах. А вот само значение угла мы будем изменять динамически с помощью джойстика.

В цикле считывается значение с аналогового входа (изменяется от 0 до 1023 в зависимости от положения джойстика), я делю это значение, чтобы уменьшить шаг на 64 и вычитаю 8, чтобы усреднить. Теперь мы будем иметь значение от 7 до -8. Затем на это значение я изменяю переменную, хранящую угол поворота. Также изменяю задержку в зависимости от этого значения. Чем больше отклонение, тем меньше задержка (быстрее происходит вращение).

  1. С Arduino берём +5 В на одну сторону бредборда (красный првоод);
  2. Чёрный провод идёт с GND на другую сторону бредборда;
  3. Сигнальный пин – девятый, зелёный провод, идёт на сервомотор (жёлтый шлейф);
  4. Так же на аналоговый вход a0 подаётся синий провод от джойстика (пин S-X);
  5. С джойстика VCC стороны X идёт красным проводом на +5 В бредборда;
  6. С джойстика GND стороны X идёт белым проводом на GND общее бредборда;
  7. Ну и соответственно белый провод GND бредборда в чёрный шлейф сервомотора;
  8. Оранжевый провод +5 В бредборда в красный шлейф сервомотора;

Что получилось

В проекте реализовано управление двумя серводвигателями с использованием джойстика и 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. Я внимательно проверил подключение, но серводвигатели все равно не двигаются.

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

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

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

Многим роботизированным проектам нужен джойстик. Модуль джойстика на ардуино аналогичен тем, которые используются в игровых приставках. Это сделано путем установки двух потенциометров под углом 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. Смотрите результаты на последовательном мониторе.
Поделитесь с друзьями или сохраните для себя:

Загрузка...