Для плат Arduino существуют модули аналогового джойстика. Как правило, имеющие ось X, Y и кнопку — ось Z. Джойстик позволяет более плавно и точно отслеживать степень отклонения от нулевой точки. А помимо удобства по сравнению с кнопками, это позволяет реализовывать более совершенные интерфейсы. К примеру, при изменении какого-либо значения в меню, можно написать программу таким образом, что чем сильнее отклонена ось джойстика, тем быстрее изменяется значение переменной. Например, нам необходимо изменить значение от 0 до 2000 с шагом в 1. Представьте, сколько раз вам потребовалось бы нажимать кнопку или писать специальный алгоритм, скажем при длительности нажатия больше 3 сек прибавлять изменять шаг на 10 или 100. А при использовании джойстика это можно реализовать намного проще.
Средняя цена на ebay колеблется в районе 7-10$ за модуль (с бесплатной доставкой в Россию). Найти модуль на ebay очень просто: в поисковое поле введите запрос joystick module.
Сами модули выглядят примерно так:
Не пугайтесь количеством выводов, это сделано для универсальности и удобства подключения. Контакты Vcc и GND между всеми тремя группами контактов соединены. Т.о. для подключения нужно 5 проводов: ось X, ось Y, кнопка Z, питание Vcc и общий GND. Джойстики пассивные модули и не потребляют какую-либо энергию от платы Arduino.
Схема подключения к Arduino:
В программе, работать с джойстиком также очень просто:
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
|
#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 от нулевой точки. А при нажатии на кнопку джойстика, переменная будет обнуляться.
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
|
#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); // Задержка 250 мс } |
Вывод в Serial Monitor:
Скачать файлы примера
Автор: Колтыков А.В.