Схема блока джойстика показана на следующем рисунке. Как мы уже говорили, джойстик чрезвычайно прост — он состоит из двух потенциометров и переключателя.
Arduino UNO урок 12 — Джойстик
Для плат Arduino существуют модули аналоговых джойстиков. Как правило, имеющие ось X, Y и кнопку — ось Z. Джойстик позволяет более плавно и точно отслеживать степень отклонения от нулевой точки. А помимо удобства по сравнению с кнопками, это позволяет реализовывать более совершенные интерфейсы. К примеру, при изменении какого-либо значения в меню, можно написать программу таким образом, что чем сильнее отклонена ось джойстика, тем быстрее изменяется значение переменной. Например, нам необходимо изменить значение от 0 до 2000 с шагом в 1. Представьте, сколько раз вам потребовалось бы нажимать кнопку или писать специальный алгоритм, скажем при длительности нажатия больше 3 сек прибавлять изменять шаг на 10 или 100. А при использовании джойстика это можно реализовать намного проще. Средняя цена на подобные модули колеблется в районе 1-2$ за модуль (с бесплатной доставкой в Россию). Поиск модулей в магазине AliExpress Сами модули выглядят примерно так:Не пугайтесь количеством выводов, это сделано для универсальности и удобства подключения. Контакты Vcc и GND между всеми тремя группами контактов соединены. Т.о. для подключения нужно 5 проводов: ось X, ось Y, кнопка Z, питание VccДжойстик очень прост. Джойстики являются пассивными модулями и не потребляют энергию от платы Arduino. Vccтребуется только для подтягивающих резисторов. Также возможно, что модули не имеют подтягивающих резисторов. В этом случае необходимо установить точку подключения кнопки с +Vccчерез резистор 1-10 кОм. Схема подключения к Arduino:В программе, работать с джойстиком также очень просто:
#define axis_X 0 // Ось X подключена к аналогу 0 #define axis_Y 1 // Ось Y подключена к аналогу 1 #define axis_Z 2 // Ось Z (кнопка джойстика) подключена к цифре 2 int value_X, value_Y, value_Z = 0; // Переменные для хранения значений осей void setup()void loop()
Как вы можете видеть выше, сначала мы определяем входные контакты для осей (define), а затем в основном цикле считываем значения с контактов и выводим их на последовательный дисплей. Вот такая картина. Как видите, все очень просто. И, наконец, нам нужно написать короткую программу, которая изменяет значение переменной в зависимости от отклонения джойстика от нуля по оси Y. А при нажатии кнопки джойстика переменная обнуляется.
#define axis_Y 1 // Ось Y подключена к аналогу 1 #define axis_Z 2 // Ось Z (кнопка джойстика) подключена к цифре 2 int value, value_Y, value_Z = 0; // Переменные для хранения значений осей void setup()void loop() = 0 && значение_Y<100) value = value - 10; if(value_Y>100 && значение_Y<300) value = value - 5; if(value_Y>300 && значение_Y<520) value = value - 1; if(value_Y>535 && значение_Y<700) value = value + 1; if(value_Y>700 && значение_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); // Задержка>
Устройство аналогово джойстика и принцип работы.
Джойстик представляет собой блок с 2 потенциометрами и тактовой клавишей.
Все контролируется палкой. При изменении положения стика вдоль оси X вращается выход потенциометра outX, а при перемещении вдоль оси Y вращается значение выхода потенциометра outY. По сути, это 2 потенциометра, с которых мы считываем значения. Рычаг предназначен для самостоятельного возврата в среднее положение. Это обеспечивает центрирование потенциометров. В этом состоянии джойстика выходами являются outX, outY 511 .
На практике, однако, это значение может отличаться в зависимости от точности сборки, качества потенциометров и других факторов. Мы рассмотрим эту ситуацию более подробно на примере.
На панели управления есть кнопка часов. Вы сами решаете, использовать его или нет. Когда я разрабатывал пульт дистанционного управления для автомобиля с дистанционным управлением, я использовал эту кнопку для переключения между функциями джойстика и акселерометра. Если вам интересно, вы можете прочитать об этом на странице проекта: Радиоуправляемый автомобиль. Arduino + nrf24l01 + пульт дистанционного управления.
Вывод данных о положении стика джойстика в монитор порта.
Чтобы определить, какие значения получает Arduino при отпускании джойстика и при перемещении джойстика в среднее положение, мы выведем их на экран порта. Для этого подключите джойстик к Arduino UNO, как показано на рисунке.
Затем необходимо загрузить код в Arduino UNO.
На экране порта вы увидите следующие данные.
Как видите, он отличается от 511. Показания на разных осях разные: X=507, Y=510. Эти данные пригодятся в следующем примере.
Когда мы перемещаем рычаг джойстика, мы видим, что значения для каждой оси изменяются от 0 до 1023.
На выходе получается значение до 1023. Такой диапазон значений трудно реализовать в проектах Arduino, поэтому мы преобразуем это значение в диапазон от 0 до 255 в функции map().
На экране коннектора мы получаем такие значения.
Управление свечением двух светодиодов с помощью джойстика.
Чтобы еще больше усложнить ситуацию, мы можем сделать так, чтобы светодиод не горел, когда джойстик находится в центральном положении, а когда мы наклоняем джойстик, яркость светодиода будет равномерно увеличиваться. Для этого нам нужно подключить светодиоды к контактам с ШИМ. Подключим джойстик и светодиоды к Arduino в соответствии со схемой.
Поскольку мы знаем, что значение в центральном положении джойстика равно 507 для оси x и 510 для оси y, мы приводим его в нужный диапазон с помощью функции map(), например, для оси x от 507 до 1023 в диапазоне от 0 до 255. Код будет выглядеть следующим образом.
Этот пример может быть использован при разработке беспроводного пульта дистанционного управления.
Подключение джойстика к Arduino Uno
Большинство людей, когда их спрашивают о джойстике, в первую очередь вспоминают игровой контроллер. Да, джойстики действительно очень распространены в индустрии видеоигр, но помимо этого, они также находят применение в различных электронных проектах DIY. Джойстик — это, по сути, не что иное, как комбинация двух потенциометров для плоскостей X и Y соответственно.
В этой статье мы рассмотрим подключение джойстика к плате Arduino, которая управляет включением и выключением 4 светодиодов, указывающих направление движения рукоятки джойстика. На джойстике также имеется кнопка, которую при необходимости можно активировать для различных целей. Когда эта кнопка нажата, загорается другой светодиод в нашем проекте.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Джойстик (купить на AliExpress).
- Светодиоды (5 шт.) (купить на AliExpress).
- Резисторы 100 Ом (3 шт.) (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
Модуль джойстика, который мы будем использовать в нашем проекте, по принципу работы похож на джойстики, распространенные в индустрии видеоигр. Он основан на двух потенциометрах, установленных под углом 90 градусов друг к другу. Эти потенциометры соединены с коротким валом, который центрируется пружинами.
Джойстики бывают разных форм и размеров. Внешний вид типичного джойстика показан на рисунке ниже. Блок джойстика имеет аналоговые выходы, которые вырабатывают выходное напряжение, зависящее от направления наклона вала джойстика. Интерпретируя эти изменения напряжения на выходах джойстика с помощью микроконтроллера (в данном случае в этой роли выступает плата Arduino), мы можем определить направление движения оси джойстика. Мы уже обсуждали подключение джойстика к микроконтроллеру AVR на нашем сайте.
На следующем рисунке вы можете увидеть, как выглядит джойстик, когда рукоятка снята.
Как видно на рисунке, рассматриваемый нами модуль джойстика имеет две оси: x и y. Каждая ось джойстика установлена на потенциометре. Средние контакты (т.е. переменные контакты) этих потенциометров подключены к выходным контактам джойстика Rx и Ry. Когда джойстик находится в нерабочем положении, Rx и Ry работают как делители напряжения. Принцип работы джойстика показан в следующем видеоролике.
Потенциометры джойстика действуют как делители напряжения. В положении покоя (т.е. когда ось джойстика отцентрирована) напряжение на выходах этих потенциометров составляет 2,5 В. При движении оси джойстика напряжение на выходах потенциометров изменяется от 0 до 5 В в зависимости от направления движения оси джойстика. Когда джойстик подключен к аналоговым входам платы Arduino, выходы АЦП (аналого-цифровых преобразователей) имеют значение 512 в состоянии покоя (возможны небольшие отклонения от этого значения из-за неточности пружин других компонентов механизма джойстика). При перемещении оси джойстика значения на выходах этих АЦП изменяются от 0 до 1023.
На этом рисунке показаны направления X и Y джойстика и то, как изменяются значения на его выходах при подключении к плате Arduino Uno.
Когда джойстик перемещается вдоль горизонтальной оси, напряжение на выводе Rx изменяется. Если джойстик перемещается вдоль вертикальной оси, напряжение на выводе Ry также изменяется. Таким образом, у нас есть 4 направления джойстика и 2 выходных контакта АЦП. Когда ось джойстика перемещается, напряжение на этих контактах становится выше или ниже в зависимости от направления движения джойстика.