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

Джойстик Программирование

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

Принцип работы джойстика

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

Необходимые составляющие

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

  1. Плата Arduino Uno
  2. Джойстик
  3. Светодиоды, 5 шт.
  4. Резисторы на 100 Ом, 3 шт.
  5. Соединительные провода
  6. Макетная плата

Распиновка модуля джойстика

Он содержит всего 5 контактов: два для подачи питания, два для определения осей X и Y, один для центрального переключателя. Как изображено на рисунке

snimok 3

Контакты:

VCC – для подачи питания. Подключаем его к 5 V.

 GND – земля. Подключается к земле.

 VRx/VRy – выходы потенциометров.

 SW – выходи переключателя

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

snimok 2

Суть программы и подробный разбор

Сама программа приведена ниже вместе с описанием ключевых моментов.

#define joyX A0 //здесь мы инициализируем аналоговые контакты Arduino A0 и A1, чтобы отслеживались перемещения по осям X и Y.

 #define joyY A1

int button=2; //называем контакт PIN2 ,к которому подключена кнопка джойстика, и начальные значения переменных

 int buttonState = 0;

 int buttonState1 = 0;

void setup() {                             //PIN7 – на вывод данных, button – на вход, назначаем скорость

  pinMode(7,OUTPUT);          //9600 бод/с

  pinMode(button,INPUT);

  digitalWrite(button, HIGH);

  Serial.begin(9600);

}

 

void loop() {

 int xValue = analogRead(joyX);  // Теперь считываем значения A0 и A1, и передаем их в окно

 int yValue = analogRead(joyY);  //монитора последовательной связи

 

  Serial.print(xValue);

  Serial.print(«\t»);

  Serial.println(yValue);

  

  buttonState = digitalRead(button);  

  Serial.println(buttonState);

  if (xValue>=0 && yValue<=10)      // Задаём условия для перемещения оси джойстика 

  {                                                          //в направлении -Y

    digitalWrite(10, HIGH);

  }

  else{digitalWrite(10, LOW);}

  if (xValue<=10 && yValue>=500) // Задаём условия для перемещения оси джойстика

  {                                                          //в направлении -X

    digitalWrite(11, HIGH);

  }

  else{digitalWrite(11, LOW);}

  if (xValue>=1020 && yValue>=500)  // Задаём условия для перемещения оси джойстика

  {                                                          //в направлении X

    digitalWrite(9, HIGH);

  }

  else{digitalWrite(9, LOW);}

  if (xValue>=500 && yValue>=1020)   // Задаём условия для перемещения оси джойстика

  {                                                          //в направлении Y

    digitalWrite(8, HIGH);

  }

  else{digitalWrite(8, LOW);}

  if (xValue>=1020 && yValue>=1020)   // Если значения X и Y будут равны (джойстик

  {                                                          // передвинуть по диагонали), то светодиоды не горят вовсе

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

}

Протестируем программу

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

Вторая программа

Есть ещё одна программа, которую можно запустить как тестовую.

Для неё нам понадобиться:

  1. Микроконтроллер
  2. Джойстик
  3. Разъём ММ
  4. Макетная плата
  5. USB–кабель

Алгоритм включения

  1. Подключаем наш джойстик, как показано на схеме.snimok2
  2. Используя USB подключаем наш микроконтроллер к компьютеру.
  3. Загружаем программу, код похож на предыдущий, но результат будет другим, данный код позволяет менять цвет светодиода:

const int pinRed = 9;

const int pinGreen  = 10;

const int pinBlue   = 11;

const int swPin = 8;

const int pinX  = A1; // X

const int pinY  = A2; // Y

const int ledPin = 13;

boolean ledOn = false;  // текущее состояние кнопки

boolean prevSw = false; // предыдущее состояние кнопки

 

void setup() {

  pinMode(ledPin, OUTPUT);

  pinMode(pinRed, OUTPUT);

  pinMode(pinGreen, OUTPUT);

  pinMode(pinBlue, OUTPUT);

  pinMode(pinX, INPUT);

  pinMode(pinY, INPUT);

  pinMode(swPin, INPUT); 

  digitalWrite(swPin, HIGH); // включаем встроенный подтягивающий резистор

}

 

void loop() {

  if (isLedOn()) freeMode(); // если нажата кнопка и горит светодиод на пине 13, включаем режим «фонарик»

  else discoMode(); // иначе включаем «цветомузыку»

}

 

boolean isLedOn() { // Определяем нажатие кнопки

  if (digitalRead(swPin) == HIGH && prevSw == LOW) {

ledOn = !ledOn;

prevSw = HIGH;

  }

  else  prevSw = digitalRead(swPin);

  digitalWrite(ledPin, ledOn); // включаем светодиод на пине 13

  return ledOn;

}

 

void freeMode() { // Режим «фонарик»

  int X = analogRead(pinX); // считываем положение джойстика

  int Y = analogRead(pinY);

  int RED = map(Y, 512, 1023, 0, 255); // маппинг значений

  int GREEN = map(X, 512, 1023, 0, 255);

  int BLUE = map(X, 511, 0, 0, 255);

  analogWrite(pinRed, RED); // включение каналов R,G,B

  analogWrite(pinGreen, GREEN);

  analogWrite(pinBlue, BLUE);

}

 

void discoMode() { // Режим «цветомузыка»

for (int i=0; i <= 255; i++) {

   if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла

   analogWrite(pinRed, i); // работает канал RED

   analogWrite(pinGreen, 0);

   analogWrite(pinBlue, 0); 

   delay(5);

}

for (int i=0; i <= 255; i++) {

   if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла

   analogWrite(pinRed, 0);

   analogWrite(pinGreen, 0);

   analogWrite(pinBlue, i);  // работает канал BLUE

   delay(5);

}

for (int i=0; i <= 255; i++) {

   if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла

   analogWrite(pinRed, 0);

   analogWrite(pinGreen, i); // работает канал GREEN

   analogWrite(pinBlue, 0); 

   delay(5);

}

}

Заключение

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

Оцените статью
Информация об Ардуино
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я принимаю политику конфиденциальности.