Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Джойстик

Joystick

Джойстик встречается в виде модуля KY-023 или его аналогов.

Работа с джойстиком оказалось простой. У него пять выводов: GND, +5V, VRX, VRY, SW (обозначения могут различаться у разных производителей). По внешнему виду напоминают джойстики от PlayStation 2. Существуют также платы с джойстиком и кнопками, но мы их рассматривать не будем.

Выводы GND и +5V пояснений не требуют - заземление и питание на 5В. Выводы VRX и VRY подключаются к аналоговым выводам платы и отвечают за координаты по оси X и Y в диапазоне от 0 до 1023. Вывод SW подключается к цифровому выводу платы и позволяет определить нажатие кнопки джойстика.


KY-023 | Arduino 
----------------
   GND | GND 
   +5V | 5V 
   VRx | A
   VRy | A
    SW | D

Joystick

Сам джойстик на пружинах, поэтому всегда возвращается в свою начальную позицию. По идее, при таком положении показания должны выдавать значения 511-512, но в реальности показания могут немного отличаться и находиться в пределах от 505 до 516, поэтому следует помнить об этом, если речь идёт о точности.

Наглядная визуализация показаний джойстика.

Joystick

Скетч для демонстрации работы джойстика.


const int xPin = A1;
const int yPin = A0;
const int buttonPin = 2;

int xPosition = 0;
int yPosition = 0;
int buttonState = 0;

void setup() {
  Serial.begin(9600);
  
  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);

  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  // Считываем показания с джойстика
  xPosition = analogRead(xPin);
  yPosition = analogRead(yPin);
  buttonState = digitalRead(buttonPin);
  Serial.print("X: ");
  Serial.print(xPosition);
  Serial.print(" | Y: ");
  Serial.print(yPosition);
  Serial.print(" | Button: ");
  Serial.println(buttonState);
  delay(100); // добавляем задержку между считыванием данных
}

Открываем Serial Monitor и наблюдаем за показаниями джойстика.

Processing

За показаниями гораздо удобнее следить через Processing.

Перепишем в скетче функцию loop() для удобной обработки данных, которые будем отправлять в последовательный порт.


void loop() {
  // Считываем показания с джойстика
  xPosition = analogRead(xPin);
  yPosition = analogRead(yPin);
  buttonState = digitalRead(buttonPin);
  //Serial.print("X: ");
  //Serial.print(xPosition);
  //Serial.print(" | Y: ");
  //Serial.print(yPosition);
  //Serial.print(" | Button: ");
  //Serial.println(buttonState);

  Serial.print(xPosition); // x-pos
  Serial.print(",");
  Serial.print(yPosition);
  Serial.print(",");
  Serial.print(buttonState);
  Serial.print("\n");  
  delay(100); // добавляем задержку между считыванием данных
}

В скетче для Processing создаём окно и рисуем в нём круг. При нажатии кнопки круг увеличится в размерах, при отпускании снова станет маленьким. А также мы можем управлять движением круга в окне.


import processing.serial.*;

Serial serial;

int x;   // A0
int y;   // A1
int button;   // D2
PFont messageFont;
String port;

void setup()
{
  size(512, 512);

  port = Serial.list()[0];
  serial = new Serial(this, port, 9600);

  messageFont = createFont("Arial", 16, true);
  textFont(messageFont, 16);
}

void draw()
{
  clear();
  fill(255);

  if (button == 0)
  {
    ellipse(x/2, 512-(y/2), 50, 50);
  } else
  {
    ellipse(x/2, 512-(y/2), 25, 25);
  }

  text("X = "+(x)+ " Y = "+(y), 10, 20);
}

void serialEvent(Serial port)
{
  String input = port.readStringUntil('\n');

  if (input != null)
  {
    input = trim(input);
    println(input);
    int[] vals = int(splitTokens(input, ","));

    x = vals[0];
    y = vals[1];
    button = vals[2];
  }
}

Processing Arduino Joystick

Дополнительные материалы

Джойстик на ESP32

Реклама