Arduino и джойстик
Описание
Джойстик – орган управления с двумя аналоговыми осями (X и Y) и одной кнопкой. Отлично подходит для управления в играх, а также некоторыми механизмами
Подключение
Подключается к питанию, аналоговые оси (VRX и VRY) – на аналоговые пины, кнопка SW – на цифровой пин. Кнопка никуда не подтянута, но это можно сделать средствами микроконтроллера. Джойстик удобнее подключать проводами папа-мама к макетке:
Примеры
Опросим обе оси джойстика и кнопку (умножим на 100 для лучшего масштаба) и выведем значения в порт через запятую. Подвигаем джойстиком, пощёлкаем кнопкой, посмотрим на график:
Оси джойстика ожидаемо выдают значение от 0 до 1023, а кнопка – инвертирована, так как при нажатии замыкается на GND. Работать с сырыми данными с джойстика не очень удобно, потому что нет “нуля”: он находится где-то в районе 500. Можно попробовать сделать по простому, через функцию map() . Преобразуем значения с осей в диапазон -100.. 100:
В принципе стало удобнее, с такими значениями гораздо удобнее работать
Библиотека
Для более удобной работы с джойстиком можно использовать библиотеку GyverJoy. Она позволяет удобно калибровать джойстик, задавать мёртвую зону и плавность изменения значений. Подробное описание и примеры можно найти по ссылке выше.
Как подключить джойстик к Arduino
Существует большое разнообразие способов передачи информации от человека микроконтроллеру или компьютеру, и один из них — это использование джойстика. Давайте посмотрим как подключить к Arduino аналоговый джойстик с двумя осями и кнопкой.
Инструкция по подключению аналогового джойстика к Arduino
Для проекта нам понадобится:
- Arduino (или совместимая плата);
- двухосевой джойстик;
- 3 резистора номиналом 220 Ом;
- 1 RGB (например, таких) или 3 обычных светодиода (вот таких); можно воспользоваться готовым модулем, который содержит необходимые резисторы и удобные выводы для подключения к Arduino.
1 Принцип действия аналогового джойстика
Джойстик – удобное и лёгкое в использовании устройство для передачи информации. Видов джойстиков по количеству степеней свободы, принципу считывания показаний и используемым технологиям существует большое количество. Джойстики чаще всего используются для управления движением каких-либо механизмов, управляемых моделей, роботов.
Аналоговый джойстик, который мы сегодня рассмотрим, представляет собой ручку, закреплённую на шаровом шарнире с двумя взаимно перпендикулярными осями. При наклоне ручки, ось вращает подвижный контакт потенциометра, благодаря чему изменяется напряжение на его выходе. Также аналоговый джойстик имеет тактовую кнопку, которая срабатывает при вертикальном надавливании на ручку.
Принципиальная схема аналогового джойстика
Здесь outX, outY – выходы для снятия показаний по осям X и Y; outSw – вывод тактовой кнопки. Vcc и GND – питание и земля, соответственно.
2 Схема подключения аналогового джойстика к Arduino
Подключим джойстик по приведённой схеме. Аналоговые выходы X и Y джойстика подключим к аналоговым входам A1 и A2 Arduino, выход кнопки SW – к цифровому входу 8. Питание джойстика осуществляется напряжением +5 В.
Схема подключения аналогового джойстика к Arduino
В результате должно получиться примерно так, как на фотографии.
Аналоговый джойстик, подключённый к Arduino
3 Считывание показаний с аналогового джойстика
Для того чтобы наглядно увидеть, как работает джойстик, напишем такой скетч.
Значения X и Y с аналогового джойстика,
выведенные в монитор последовательного порта
Объявим пины, зададим им режимы работы. Обратите внимание, в процедуре setup() мы подали на вход switchPin высокий уровень. Этим мы включили встроенный подтягивающий резистор на этом порту. Если его не включить, то, когда кнопка джойстика не нажата, 8-ой порт Arduino будет висеть в воздухе и ловить наводки. Это повлечёт за собой нежелательные хаотичные ложные срабатывания.
В процедуре loop() мы постоянно опрашиваем состояние кнопки и отображаем его с помощью светодиода на выходе 13. Из-за того, что вход switchPin подтянут к питанию, светодиод постоянно горит, а при нажатии кнопки гаснет, а не наоборот.
Обратите внимание, что показания по осям X и Y в нейтральном положении ручки джойстика могут быть разные, и не равняться ровно 512.
4 Управление яркостью и цветом светодиодас помощью аналогового джойстика и Arduino
Обычно джойстик используют для управления электродвигателями. Но почему бы не использовать его, например, для управления яркостью светодиода? Давайте подключим по приведённой схеме RGB светодиод (или три обычных светодиода) к цифровым портам 9, 10 и 11 Arduino, не забывая, конечно, о резисторах.
Подключение RGB светодиода и джойстика к Arduino
Будем менять яркость соответствующих цветов при изменении положения джойстика по осям, как показано на рисунке.
Из-за того, что джойстик может быть не точно отцентрирован производителем и иметь середину шкалы не на отметке 512, а варьироваться в диапазоне примерно от 490 до 525, то светодиод может слегка светиться даже когда джойстик находится в нейтральном положении. Если вы хотите, чтобы он был полностью выключен, то внесите в программу соответствующие поправки.
Диаграмма распределения яркости красного, синего и зелёного каналов светодиода в зависимости от положения ручки джойстика
Ориентируясь на приведённую диаграмму, напишем скетч управления Arduino яркостью RGB светодиода с помощью джойстика.
Сначала объявим соответствие пинов и две переменные – ledOn и prevSw – для работы с кнопкой. В процедуре setup() назначим пинам функции и подключим к пину кнопки подтягивающий резистор командой digitalWrite(swPin, HIGH).
В цикле loop() определяем нажатие кнопки джойстика. При нажатии на кнопку переключаем режимы работы между режимом «фонарика» и режимом «цветомузыки».
В режиме freeMode() управляем яркостью светодиодов с помощью наклона джойстика в разные стороны: чем сильнее наклон по оси, тем ярче светит соответствующий цвет. Причём преобразование значений берёт на себя функция map(значение, отНижнего, отВерхнего, кНижнему, кВерхнему).
Функция map() очень полезна и удобна в применении. Она переносит измеренные значения (отНижнего, отВерхнего) по осям джойстика в желаемый диапазон яркости (кНижнему, кВерхнему). Можно то же самое сделать обычными арифметическими действиями, но запись с помощью функции map() существенно короче.
В режиме discoMode() три цвета попеременно набирают яркость и гаснут. Чтобы можно было выйти из цикла при нажатии кнопки, каждую итерацию проверяем, не была ли нажата кнопка.
В результате получился фонарик из трёхцветного RGB светодиода, яркость свечения каждого цвета которого задаётся с помощью джойстика. А при нажатии на кнопку происходит включение режима «цветомузыка». Я сделал специальную печатную плату с Arduino Pro Mini и джойстиком, и у меня он используется в качестве ночника для ребёнка :)
Управление яркостью и цветом RGB светодиода с помощью аналогового джойстика, подключённого к Arduino
Таким образом, мы научились подключать к Arduino аналоговый двухосевой джойстик с кнопкой и считывать с него показания. Вы можете придумать и реализовать более интересное применение джойстику, чем наш пример.
Как подключить джойстик к Ардуино
Подключение джойстика к Arduino позволит сделать дистанционное управление с помощью джойстика машинкой или роботом на Ардуино. Рассмотрим в статье, как подключить джойстик шилд самостоятельно и сделать управление светодиодами с помощью джойстика на Ардуино. Представим несколько скетчей и дадим схему подключения джойстика к микроконтроллеру Arduino Nano или Arduino Uno.
Джойстик схема подключения к Ардуино
Аналоговый джойстик представляет собой ручку, которая крепится на шарнире с двумя потенциометрами, определяющими положение джойстика по оси X и Y, и кнопкой Z. Наклон ручки вращает потенциометры и изменяет выходное напряжение, позволяя отследить степень отклонения ручки от центральной точки. При отпускании ручки джойстика, она плавно возвращается в центральное (нулевое) положение.
Как подключить джойстик к Arduino Nano и Arduino Uno
У модуля джойстика KY-023 есть свои недостатки. Дело в том, что ручка джойстика не всегда точно возвращается в центральное положение, поэтому следует учитывать в программе центральное положение ручки, как некоторый диапазон значений, а не точное значение. То есть, при положении ручки джойстика в центре, значение X и Y координат может находиться в диапазоне от 490 до 530, вместо 512.
Подключение джойстика к Arduino UNO
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- модуль джойстика ky-023;
- 2 светодиода и 2 резистора;
- макетная плата;
- провода «папа-мама», «папа-папа».
После подключения к Ардуино джойстика, загрузите следующий скетч. В данном примере на монитор порта будут выводиться данные с джойстика, а при нажатии кнопки будет выключаться светодиод на плате, подключенный параллельно к Pin 13. Соберите схему с джойстиком на Arduino Uno, как показано на схеме выше, загрузите скетч и откройте монитор порта программы Arduino IDE на компьютере.
Скетч. Подключение джойстика к Ардуино
Скетч. Управление джойстиком светодиодами
Теперь можно усложнить схему, сделав плавное включение светодиода, управляемое от джойстика. Для этого подключите два светодиода через резистор к аналоговым портам 5 и 6. В следующем скетче, с помощью функции map(), переменные X и Y преобразуются из диапазона чисел от 0 до 1023 в диапазон чисел от 0 до 255. Подключите светодиоды к пинам 5 и 6 Ардуино и загрузите следующий скетч.
Пояснения к коду:
- с помощью функции map() можно задать любой, в том числе, обратный диапазон чисел. Также можно использовать отрицательные значения.
Заключение. Мы рассмотрели схему подключения джойстика к Arduino и несколько вариантов управления светодиодами от микроконтроллера. Как вы убедились сами, что работа с джойстиком Ардуино доступна любому начинающему мейкеру, так как принцип работы модуля ky-023 схож с простым потенциометром. Данный модуль может использоваться во многих интересных DIY проектах.
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:
В программе, работать с джойстиком также очень просто:
Как видно выше, в начале мы определяем входные пины для осей (define), а потом в главном цикле считываем значения с пинов и выводим их в Serial Monitor. И видим следующую картину:
Как видите все довольно просто. И напоследок напишем небольшую программу, целью которой будет изменять значение переменной, в зависимости от отклонения джойстика по оси Y от нулевой точки. А при нажатии на кнопку джойстика, переменная будет обнуляться.
Джойстик
Джойстик встречается в виде модуля KY-023 или его аналогов.
Работа с джойстиком оказалось простой. У него пять выводов: GND, +5V, VRX, VRY, SW (обозначения могут различаться у разных производителей). По внешнему виду напоминают джойстики от PlayStation 2. Существуют также платы с джойстиком и кнопками, но мы их рассматривать не будем.
Выводы GND и +5V пояснений не требуют — заземление и питание на 5В. Выводы VRX и VRY подключаются к аналоговым выводам платы и отвечают за координаты по оси X и Y в диапазоне от 0 до 1023. Вывод SW подключается к цифровому выводу платы и позволяет определить нажатие кнопки джойстика.
Сам джойстик на пружинах, поэтому всегда возвращается в свою начальную позицию. По идее, при таком положении показания должны выдавать значения 511-512, но в реальности показания могут немного отличаться и находиться в пределах от 505 до 516, поэтому следует помнить об этом, если речь идёт о точности.
Наглядная визуализация показаний джойстика.
Скетч для демонстрации работы джойстика.
Открываем Serial Monitor и наблюдаем за показаниями джойстика.
Processing
За показаниями гораздо удобнее следить через Processing.
Перепишем в скетче функцию loop() для удобной обработки данных, которые будем отправлять в последовательный порт.
В скетче для Processing создаём окно и рисуем в нём круг. При нажатии кнопки круг увеличится в размерах, при отпускании снова станет маленьким. А также мы можем управлять движением круга в окне.