Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Джойстик встречается в виде модуля 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
Сам джойстик на пружинах, поэтому всегда возвращается в свою начальную позицию. По идее, при таком положении показания должны выдавать значения 511-512, но в реальности показания могут немного отличаться и находиться в пределах от 505 до 516, поэтому следует помнить об этом, если речь идёт о точности.
Наглядная визуализация показаний джойстика.
Скетч для демонстрации работы джойстика.
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.
Перепишем в скетче функцию 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];
}
}