Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Arduino UNO урок 12 - Джойстик

Для плат Arduino существуют модули аналоговых джойстиков. Как правило, имеющие ось X, Y и кнопку - ось Z. Джойстик позволяет более плавно и точно отслеживать степень отклонения от нулевой точки. А помимо удобства по сравнению с кнопками, это позволяет реализовывать более совершенные интерфейсы. К примеру, при изменении какого-либо значения в меню, можно написать программу таким образом, что чем сильнее отклонена ось джойстика, тем быстрее изменяется значение переменной. Например, нам необходимо изменить значение от 0 до 2000 с шагом в 1. Представьте, сколько раз вам потребовалось бы нажимать кнопку или писать специальный алгоритм, скажем при длительности нажатия больше 3 сек прибавлять изменять шаг на 10 или 100. А при использовании джойстика это можно реализовать намного проще.

Средняя цена на подобные модули колеблется в районе 1-2$ за модуль (с бесплатной доставкой в Россию). Поиск модулей в магазине AliExpress

Сами модули выглядят примерно так:

Джойстики

Не пугайтесь количеством выводов, это сделано для универсальности и удобства подключения. Контакты Vcc и GND между всеми тремя группами контактов соединены. Т.о. для подключения нужно 5 проводов: ось X, ось Y, кнопка Z, питание Vcc и общий GND. Джойстики пассивные модули и не потребляют какую-либо энергию от платы Arduino. Питание Vcc необходимо только для подтягивающих резисторов. Бывают модули без подтягивающих резисторов, в таком случае, необходимо вывод подключения кнопки подтянуть к +Vcc через резистор 1-10 кОм.

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

Подключение джойстика к Arduino

В программе, работать с джойстиком также очень просто:

#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. И видим следующую картину:

Вывод данных джойстика в Serial Monitor

Как видите все довольно просто. И напоследок напишем небольшую программу, целью которой будет изменять значение переменной, в зависимости от отклонения джойстика по оси Y от нулевой точки. А при нажатии на кнопку джойстика, переменная будет обнуляться.

#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);                      // Задержка
}

Вывод в Serial Monitor:

Вывод данных джойстика в Serial Monitor

Прикрепленные файлы:

Теги:

Колтыков А.В. Опубликована: 2012 г. 0 2
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (12) | Я собрал (0) | Подписаться

0
ant0 #
> if(value_Y >= 0 && value_Y < 100) value = value - 10;
и т.д - это индуский код!
проще так:
value_X = map(analogRead(axis_X), 0, 1023, -10, 10);
Ответить
+1
talibanich #
Проще для вас. А для новичка сложнее. Поэтому сознательно сделано именно так, т.к. статья предназначена для новичков
Ответить
0
Golim #
value_X = map(analogRead(axis_X), 0, 1023, -10, 10);
Тоже индусятина. Правильно будет
value_X = map(analogRead(axis_X), 0, 1023, -9, 10);
Ответить
0
Tetragon #
Собрал, прошил, все работает кроме кнопки. Да и не мудрено - так включать ее нельзя! Нужно обязательно подтянуть резистором к +5V
Ответить
0
talibanich #
Значит у вас такой модуль. У меня 2 разных модуля (других на Али не встречал). У обеих модулей уже есть pull-up резисторы встроенные.
Не знаю, где вы такой модуль нашли...
Ответить
0
vladimir #
pinMode(axis_Z, INPUT_PULLUP);// подтяжка внутренним резистором
Все будет работать.
Ответить
0
Тагир #
Serial.println(value, DEC);
Должно быть Serial.println(value_Y, DEC);, если я не ошибаюсь
Ответить
0
talibanich #
Ошибаетесь!
Ответить
0
Анатолий #
Можете подсказать по поводу кода с кнопкой.Примерно такой алгоритм:
нажали кнопку, держим секунду или две, начинаем двигать осями и передаем значения, перестаем двигать осями секунд 5, то прекращаем передачу и ждем нажатия кнопки снова.
Ответить
0
Владислав #
Я новичек еще, поэтому не знаю грамотный код или нет, но работает
Прикрепленный файл: joystic_5s.ino
Ответить
0
Артур #
Вопрос возник. Подключил все по схеме но навесным монтажом на распаечной плате. Так вот значения джойстика в пределах 770-1024, то есть в среднем положении 890 показывает. Это брак или я что-то умудрился не так распаять?
Ответить
0
Денис #
= value - 10;
Я правильно понял,что прибавляя или отнимая значения,мы вносим поправки?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Тестер ESR, полупроводников, резисторов, индуктивностей Модуль радиореле на 4 канала
вверх