Первое, что приходит в голову большинству людей когда их спрашивают про джойстик – это игровой контроллер. Да, джойстики действительно очень широко применяются в индустрии компьютерных игр, но, кроме этого, они находят применение и в разнообразных DIY (сделай сам) электронных проектах. По сути, джойстик – это не что иное как комбинация двух потенциометров, для плоскостей X и Y соответственно.
В этой статье мы рассмотрим подключение джойстика к плате Arduino, с помощью которого мы будем управлять включением/выключением 4-х светодиодов, которые будут показывать направление перемещения ручки джойстика. Также у джойстика есть кнопка (нажатия), которая, при необходимости, также может задействоваться для различных целей. Мы при нажатии этой кнопки будем зажигать в нашем проекте еще один светодиод.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Джойстик (купить на AliExpress).
- Светодиоды (5 шт.) (купить на AliExpress).
- Резисторы 100 Ом (3 шт.) (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Принципы работы джойстика
Модуль джойстика, который мы будем использовать в нашем проекте, по принципу действия очень похож на игровые джойстики, широко применяющихся в индустрии компьютерных игр. Принцип его действия основан на двух потенциометрах, установленных под углом 90 градусов относительно друг друга. Данные потенциометры подсоединены к короткой оси, центрированной с помощью пружин.
Джойстики выпускаются различных форм и размеров. Внешний вид типового модуля джойстика показан на рисунке ниже. Данный модуль джойстика имеет аналоговые выходы, на которых формируется выходное напряжение в зависимости от того, в каком направлении наклонена ось джойстика. Интерпретируя эти изменения напряжений на выходах джойстика с помощью микроконтроллера (в данном случае его роль выполняет плата Arduino) мы можем определить направление перемещения оси джойстика. Ранее на нашем сайте мы уже рассматривали подключение джойстика к микроконтроллеру AVR.
Внешний вид джойстика со снятой рукояткой показан на следующем рисунке.
Как вы можете видеть из представленного рисунка, рассматриваемый нами модуль джойстика имеет две оси: X и Y. Каждая ось джойстика смонтирована на потенциометре. Средние контакты (то есть переменные контакты) этих потенциометров подключены к выходным контактам Rx и Ry джойстика. Когда джойстик находится в состоянии покоя, Rx и Ry выполняют роль делителя напряжения. Принцип работы джойстика показан на следующем видео.
Потенциометры джойстика выполняют роль делителей напряжения. В положении покоя (то есть когда ось джойстика находится по центру) напряжение на выходах данных потенциометров составляет величину 2.5V. Перемещение оси джойстика приводит к тому, что напряжения на выходах потенциометров будут изменяться в диапазоне от 0 до 5 В в зависимости от направления перемещения оси джойстика. При подключении джойстика к аналоговым входам платы Arduino на выходах их АЦП (аналого-цифровых преобразователей) в состоянии покоя будет значение равное 512 (возможны небольшие вариации от данного значения из-за неточности пружин остальных компонентов механизма джойстика). При движении оси джойстика значения на выходах данных АЦП будут изменяться в диапазоне от 0 до 1023.
На представленной картинке показаны направления X и Y джойстика и как изменяются значения на его выходах когда он подключен к плате Arduino Uno.
Когда джойстик движется вдоль горизонтальной оси напряжение на контакте Rx изменяется. Аналогично, если джойстик движется вдоль вертикальной оси, то изменяется напряжение на контакте Ry. То есть мы имеем 4 направления движения джойстика и 2 выходных контакта АЦП (аналого-цифрового преобразования). Когда ось джойстика движется, напряжение на этих контактах становится больше или меньше в зависимости от направления движения джойстика.
Мы в нашем проекте направление движения джойстика будем отслеживать с помощью АЦП, присутствующих на аналоговых входах платы Arduino. Более подробно об АЦП в Arduino можно прочитать в этой статье.
Технические характеристики джойстика:
- состоит из двух потенциометров: по одному на каждую ось;
- размеры: 34 x 34 x 15 (LxWxH) mm;
- рабочее напряжение: 5V.
Распиновка модуля джойстика
Модуль джойстика содержит 5 контактов: два для подачи питания, два для потенциометров по осям X и Y и один для центрального переключателя. Распиновка модуля джойстика показана на следующем рисунке.
Назначение контактов:
VCC – контакт для подачи питания. В нашем проекте его необходимо подключить к контакту 5V платы Arduino.
GND – общий провод (земля). Необходимо подключить к земле платы Arduino.
VRx/VRy – выходы потенциометров.
SW – выход переключателя. При нажатии на нем формируется уровень low.
Компоненты джойстика
Сам по себе джойстик содержит всего два потенциометра (по одному для каждой оси) и переключатель для фиксации нажатий. Одна сторона потенциометров подключена к земле, а другая – к VCC. Центральные контакты подключены к контактам VRx и VRy. Переключатель включен между контактами GND и SW. В некоторых джойстиках также присутствует подтягивающий резистор для переключателя.
Схема джойстика
Схема модуля джойстика показана на рисунке ниже. Как мы уже упоминали, устройство джойстика крайне простое – он состоит из двух потенциометров и переключателя.
Наиболее часто задаваемые вопросы про джойстик
Что такое модуль джойстика?
Модуль джойстика очень похож на джойстики для компьютерных игр. Принцип его действия основан на двух потенциометрах, установленных под углом 90 градусов относительно друг друга. Данные потенциометры подсоединены к короткой оси, центрированной с помощью пружин. Модуль формирует на своих выходах аналоговые напряжения, уровень которых зависит от положения оси джойстика. Данные уровни напряжений можно измерить и на их основе потом рассчитать положение оси джойстика.
Какие преимущества джойстика?
- очень быстрый интерфейс;
- легок в управлении;
- контроль в 3-х измерениях (3D);
- быстрый отклик (реакция), что крайне востребовано во многих компьютерных играх.
Как подключить джойстик к плате Arduino?
Необходимо просто считывать значения напряжений с контактов VRx и VRy джойстика, используя аналоговые контакты платы Arduino, и на их основе рассчитывать положение оси джойстика.
Джойстик работает неправильно или не работает совсем. Что необходимо проверить в первую очередь?
В этом случае необходимо, прежде всего убедиться в том, что все соединения правильны. Затем, если они корректны, необходимо проверить значения с выходов VRx и VRy джойстика – если они неправильные или при движении оси джойстика они изменяются "прыжками", значит проблема в потенциометрах джойстика. В этом случае вы можете вручную, с помощью небольших нажатий на потенциометры, попробовать немного изменить их местоположение, после чего почистить их каким-нибудь образом. Это может помочь в решении описанной проблемы. Если эта операция не помогла, то придется заменить либо потенциометры в джойстике, либо весь модуль джойстика.
Схема проекта
Схема подключения джойстика к плате Arduino Uno представлена на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы обсудим его наиболее важные фрагменты.
В следующем фрагменте кода мы инициализируем аналоговые контакты Arduino A0 и A1 чтобы отслеживать перемещение джойстика по осям X и Y соответственно.
1 2 |
#define joyX A0 #define joyY A1 |
Далее мы инициализируем контакт PIN 2 (к нему подключена кнопка джойстика) и определим начальные значения переменных buttonstate и buttonstate1.
1 2 3 |
int button=2; int buttonState = 0; int buttonState1 = 0; |
В следующем фрагменте кода мы инициализируем последовательный порт связи для работы на скорости 9600 бод/с и зададим режим работы контактов: Pin 7 – на вывод данных, контакт, к которому подключена кнопка – на ввод данных.
1 2 3 4 5 6 |
void setup() { pinMode(7,OUTPUT); pinMode(button,INPUT); digitalWrite(button, HIGH); Serial.begin(9600); } |
Далее в программе мы считываем значения с аналоговых входов A0 и A1 и передаем их в окно монитора последовательной связи.
1 2 3 4 5 6 |
int xValue = analogRead(joyX); int yValue = analogRead(joyY); Serial.print(xValue); Serial.print("\t"); Serial.println(yValue); |
Затем мы должны прописать в программе условия включения и выключения светодиодов в зависимости от перемещений оси джойстика. На следующем рисунке представлены диапазоны возможных изменений значений на выходах АЦП контактов A0 и A1 в зависимости от перемещения оси джойстика.
Условие для перемещения оси джойстика в направлении -Y:
1 2 3 4 |
if (xValue>=0 && yValue<=10){ digitalWrite(10, HIGH); } else{digitalWrite(10, LOW);} |
Условие для перемещения оси джойстика в направлении -X:
1 2 3 4 |
if (xValue<=10 && yValue>=500){ digitalWrite(11, HIGH); } else{digitalWrite(11, LOW);} |
Условие для перемещения оси джойстика в направлении +X:
1 2 3 4 |
if (xValue>=1020 && yValue>=500){ digitalWrite(9, HIGH); } else{digitalWrite(9, LOW);} |
Условие для перемещения оси джойстика в направлении +Y:
1 2 3 4 |
if (xValue>=500 && yValue>=1020){ digitalWrite(8, HIGH); } else{digitalWrite(8, LOW);} |
Но если мы переместим джойстик по диагонали, то значения с выходов АЦП по осям X и Y будут 1023 и 1023 соответственно. И, поскольку, в этом случае будут выполнены сразу два из вышеперечисленных условий, то должны зажечься светодиоды, подключенные к контактам Pin 9 и Pin 8. Чтобы устранить это несоответствие, мы добавим еще условие – если оба значения (X, Y) будут равны (1023, 1023), тогда оба светодиода будут в выключенном состоянии.
1 2 3 4 |
if (xValue>=1020 && yValue>=1020) { digitalWrite(9, LOW); digitalWrite(8, LOW); } |
И в заключение нам осталось одно условие для кнопки джойстика – при ее нажатии будет загораться светодиод и гореть до тех пор пока мы не отпустим кнопку.
1 2 3 4 5 |
if (buttonState == LOW) { Serial.println("Switch = High"); digitalWrite(7, HIGH); } else{digitalWrite(7, LOW);} |
Тестирование работы проекта
После осуществления всех необходимых соединений в схеме и загрузки программы в плату Arduino мы можем приступать к тестированию проекта. Перемещая ось джойстика в различных направлениях, мы можем поочередно включать все 4 светодиода в нашей схеме. Как уже отмечалось, джойстик имеет два потенциометра – один для управления движением вдоль оси X, а другой – для управления движением вдоль оси Y. На каждый потенциометр подается напряжение 5 В с платы Arduino. При перемещении джойстика значения входных напряжений на контактах A0 и A1 будут изменяться.
При нажатии кнопки джойстика должен загораться дополнительный светодиод в нашей схеме.
Исходный код программы
Код программы достаточно подробно объяснен выше в статье, поэтому, надеюсь, анализ его работы не вызовет у вас затруднений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#define joyX A0 #define joyY A1 int button=2; int buttonState = 0; int buttonState1 = 0; void setup() { pinMode(7,OUTPUT); pinMode(button,INPUT); digitalWrite(button, HIGH); Serial.begin(9600); } void loop() { int xValue = analogRead(joyX); int yValue = analogRead(joyY); Serial.print(xValue); Serial.print("\t"); Serial.println(yValue); buttonState = digitalRead(button); Serial.println(buttonState); if (xValue>=0 && yValue<=10) { digitalWrite(10, HIGH); } else{digitalWrite(10, LOW);} if (xValue<=10 && yValue>=500) { digitalWrite(11, HIGH); } else{digitalWrite(11, LOW);} if (xValue>=1020 && yValue>=500) { digitalWrite(9, HIGH); } else{digitalWrite(9, LOW);} if (xValue>=500 && yValue>=1020) { digitalWrite(8, HIGH); } else{digitalWrite(8, LOW);} if (xValue>=1020 && yValue>=1020) { digitalWrite(9, LOW); digitalWrite(8, LOW); } if (buttonState == LOW) { Serial.println("Switch = High"); digitalWrite(7, HIGH); } else{digitalWrite(7, LOW);} buttonState1 = digitalRead(7); Serial.println(buttonState1); delay(50); } |
Спасибо. Какие библиотеки подключаются?
Никаких библиотек не нужно, используются простейшие операции, присутствующие в Ардуино по умолчанию
Интересно. Спасибо. Окажите помощь.
Второй день бьюсь с ESP32. При использовании jператорf if-else в месте с командами bleKeyboard.press
и bleKeyboard.release
выполняется цикличная перезагрузка ESP.
например:
#define USE_NIMBLE
#include
BleKeyboard bleKeyboard;
#define BT1 34 // ПИН к которому подключена кнопка А
#define BT2 35 // ПИН к которому подключена кнопка В
void setup () {
// запуск последовательного порта
Serial.begin (115200);
pinMode(BT1, INPUT_PULLUP); // ПИН кнопки как вход
pinMode(BT2, INPUT_PULLUP); // ПИН кнопки как вход
pinMode(LED_BUILTIN, OUTPUT); // встроеный светодиод
bleKeyboard.begin();
}
void loop () {
digitalWrite (LED_BUILTIN, bleKeyboard.isConnected());
if (!digitalRead(BT1)) // если нажата кнока A
{
bleKeyboard.press('C'); // нажимаем клавишу C
}
else
{
bleKeyboard.releaseAll(); // отпускаем все клавиши
}
if (!digitalRead(BT2)) // если нажата кнока B
{
bleKeyboard.press('V'); // нажимаем клавишу V
}
else
{
bleKeyboard.releaseAll(); // отпускаем все клавиши
}
}
К сожалению не работал пока с командами bleKeyboard, не могу пока с этим помочь
GND, +5V, VRX, VRY, SW от джойстика в какие места платы arduino uno надо подключать?
Ну так на приведенной в статье схеме все же отлично видно куда их нужно подключать. Или у вас не отображается в браузере схема?