Подключение джойстика к Arduino
Подключение джойстика к Arduino позволит просто и эффективно обмениваться информацией между человеком и электронными устройствами (компьютером, ноутбуком, тем же микроконтроллером). Подобные девайсы уже давно используются в гейминге (в качестве геймпадов), конструировании, проектировании, а в особенности – робототехнике (для контроля и управления движением портативных систем, машин, роботов, авиасимуляторов и прочих «движущихся» деталей ∕ «взрослых» игрушек ∕ автоматизированных механизмов). Они бюджетны по стоимости и доступны для приобретения как на отечественных, так и китайских торговых онлайн-площадках.
Стандартный аналоговый джойстик внешне выглядит как ручка, закрепленная на шаровом шарнире с 2-мя взаимно перпендикулярными осями (X и Y) и тактовой кнопкой Z. Его принцип действия достаточно прост — при наклоне получаем вращение подвижных контактов, при отпускании ручка возвращается в свое первоначальное состояние. Так этот модуль функционирует (по сути, в 4 направлениях, если говорить о движении).
Теперь разберем детальнее подключение прибора к плате Ардуино Uno. Обратите внимание на принципиальную схему сборки:
В ней мы применили такие аппаратные детали как: микроконтроллер Ардуино Uno, модуль джойстика, соединительные провода (можно также добавить макетную плату, USB-кабель для подключения к ПК).
Чтобы получить данные с геймпада и проверить его конфигурации, заливаем следующий скетч:
Переносим программные коды на ПО, открываем Serial Monitor (монитор COM-порта), наблюдаем тестовый вывод данных.
Мы разобрали в общих чертах информацию о том, как подключить джойстик к Ардуино. Если у вас «случайно» «завалялись» плата прототипирования, модуль джойстика, парочка сервоприводов и перемычек, а также соединительные провода — можно поработать над простым проектом по управлению подвесом для камеры. В интернете имеются хорошие примеры с готовыми библиотеками и кодами по этой теме.
Геймпад – вещь функциональная и удобная, он несомненно пригодится многим пользователям для создания как собственных увлекательных проектов, так и воспроизведения уже существующих вариантов. На этом прощаемся! Удачи!
Примеры
Опросим обе оси джойстика и кнопку (умножим на 100 для лучшего масштаба) и выведем значения в порт через запятую. Подвигаем джойстиком, пощёлкаем кнопкой, посмотрим на график:
Оси джойстика ожидаемо выдают значение от 0 до 1023, а кнопка – инвертирована, так как при нажатии замыкается на GND. Работать с сырыми данными с джойстика не очень удобно, потому что нет “нуля”: он находится где-то в районе 500. Можно попробовать сделать по простому, через функцию map() . Преобразуем значения с осей в диапазон -100.. 100:
В принципе стало удобнее, с такими значениями гораздо удобнее работать
Записки программиста
В детстве я много времени проводил за игровой приставкой Sega Mega Drive, также известной, как Sega Genesis. Одна из интересных особенностей этой приставки заключается в том, что джойстики подключаются к ней через обычный DE9-порт. Теоретически, сигнал от джойстика должно быть достаточно просто декодировать. Джойстик от ретро-приставки видится мне интересным примитивом для использования в будущих DIY проектах, в связи с чем я решил попробовать сынтегрировать его с Arduino.
Достаточно толковая информация о декодировании сигнала от джойстика была найдена по следующим ссылкам:
Сам же джойстик, если у вас его нет, достаточно легко найти на eBay по запросу вроде «Sega Controller». Цена джойстика составляет в районе 2-3$. Вот как он выглядит:
Следующая иллюстрация объясняет, какой пин DE9-порта каким образом используется джойстиком:
Пины 5 и 8 используются для питания. Пин 7 называется SEL и используется приставкой для выбора режима считывания. Например, если на SEL подано высокое напряжение, пин 6 отражает состояние кнопки B джойстика. Если же на SEL подано низкое напряжение, тот же пин отражает состояние кнопки A. Таким образом, переключая напряжение на SEL, можно считать состояние кнопок вверх, вниз, влево и вправо, кнопок A, B, С, а также кнопки Start.
Старые джойстики имели только эти кнопки. Однако в новых джойстиках, вроде того, что изображен выше, были добавлены еще три кнопки X, Y, Z, а также кнопка Mode, располагаемая под указательным пальцем правой руки. Считать эти кнопки можно через пины 1-4, если послать на SEL серию из трех низких и высоких сигналов, каждый из которых имеет продолжительность около 20 микросекунд.
Вооружившись этими знаниями, несложно написать прошивку для Arduino:
OLED oled ( SDA, SCL ) ;
extern uint8_t SmallFont [ ] ;
#define UP_OR_Z 1
#define DOWN_OR_Y 2
#define LEFT_OR_X 3
#define RIGHT_OR_MODE 4
#define B_OR_A 6
#define SEL 7
#define C_OR_START 9
bool sega_up = false ;
bool sega_down = false ;
bool sega_left = false ;
bool sega_right = false ;
bool sega_start = false ;
bool sega_mode = false ;
bool sega_a = false ;
bool sega_b = false ;
bool sega_c = false ;
bool sega_x = false ;
bool sega_y = false ;
bool sega_z = false ;
void segaRead ( ) {
digitalWrite ( SEL, HIGH ) ;
delayMicroseconds ( 20 ) ;
sega_up = ( digitalRead ( UP_OR_Z ) == LOW ) ;
sega_left = ( digitalRead ( LEFT_OR_X ) == LOW ) ;
sega_right = ( digitalRead ( RIGHT_OR_MODE ) == LOW ) ;
sega_down = ( digitalRead ( DOWN_OR_Y ) == LOW ) ;
sega_c = ( digitalRead ( C_OR_START ) == LOW ) ;
sega_b = ( digitalRead ( B_OR_A ) == LOW ) ;
digitalWrite ( SEL, LOW ) ;
delayMicroseconds ( 20 ) ;
sega_a = ( digitalRead ( B_OR_A ) == LOW ) ;
sega_start = ( digitalRead ( C_OR_START ) == LOW ) ;
digitalWrite ( SEL, HIGH ) ;
delayMicroseconds ( 20 ) ;
digitalWrite ( SEL, LOW ) ;
delayMicroseconds ( 20 ) ;
digitalWrite ( SEL, HIGH ) ;
delayMicroseconds ( 20 ) ;
digitalWrite ( SEL, LOW ) ;
delayMicroseconds ( 20 ) ;
digitalWrite ( SEL, HIGH ) ;
delayMicroseconds ( 20 ) ;
sega_x = ( digitalRead ( LEFT_OR_X ) == LOW ) ;
sega_y = ( digitalRead ( DOWN_OR_Y ) == LOW ) ;
sega_z = ( digitalRead ( UP_OR_Z ) == LOW ) ;
sega_mode = ( digitalRead ( RIGHT_OR_MODE ) == LOW ) ;
digitalWrite ( SEL, LOW ) ;
delayMicroseconds ( 20 ) ;
digitalWrite ( SEL, HIGH ) ;
delayMicroseconds ( 20 ) ;
}
void setup ( ) {
oled. begin ( ) ;
oled. setFont ( SmallFont ) ;
pinMode ( SEL, OUTPUT ) ;
digitalWrite ( SEL, HIGH ) ;
pinMode ( UP_OR_Z, INPUT ) ;
pinMode ( DOWN_OR_Y, INPUT ) ;
pinMode ( LEFT_OR_X, INPUT ) ;
pinMode ( RIGHT_OR_MODE, INPUT ) ;
pinMode ( B_OR_A, INPUT ) ;
pinMode ( C_OR_START, INPUT ) ;
}
void loop ( ) {
char temp [ 16 ] ;
segaRead ( ) ;
oled. clrScr ( ) ;
sprintf ( temp, » %s %s %s%s%s» ,
sega_up ? «U» : «u» ,
sega_mode ? «M» : «m» ,
sega_x ? «X» : «x» ,
sega_y ? «Y» : «y» ,
sega_z ? «Z» : «z» ) ;
oled. print ( temp, CENTER, 8 * 4 ) ;
sprintf ( temp, «%s%s%s %s %s%s%s» ,
sega_left ? «L» : «l» ,
sega_down ? «D» : «d» ,
sega_right ? «R» : «r» ,
sega_start ? «S» : «s» ,
sega_a ? «A» : «a» ,
sega_b ? «B» : «b» ,
sega_c ? «C» : «c» ) ;
oled. print ( temp, CENTER, 8 * 5 ) ;
oled. update ( ) ;
delay ( 1 ) ;
}
Внешний вид получившегося прототипа:
Плату с DE9-портом вы могли узнать по заметке Травим плату перекисью водорода с лимонной кислотой. Состояние кнопок джойстика отображается на OLED-экранчике на базе чипа SSD1306 с диагональю 0.96 дюйма (24.5 мм), имеющем I2C-интерфейс. На eBay такой экранчик можно приобрести менее, чем за 3$.
Экранчик питается от 5 В. К Arduino он подключается так: пин SDA подключаем к A4, а пин SCL — к A5. Это если мы говорим про Arduino Uno, у прочих же Ардуин I2C пины могут быть другими. Работа с экранчиком осуществляется через библиотеку OLED_I2C. Написал ее тот же человек, что является автором библиотеки для экранчиков от Nokia 5110, поэтому эти библиотеки имеют похожий интерфейс. При небольших размерах и используя всего лишь два пина микроконтроллера, экранчик позволяет отобразить шрифтом SmallFont 7 строк, каждая из которых содержит до 21 символа. Также в библиотеке есть шрифт TinyFont, который позволяет вывести еще больше информации, хотя ее будет и труднее прочитать.
Полную версию исходников к этой статье вы найдете на GitHub. Как видите, работать с джойстиком от приставки 1988 года выпуска оказалось не так уж и сложно. Если вам понравился этот проект, могу предложить вам улучшить его, взяв микроконтроллер ATmega32U4 и сделав с его помощью адаптер джойстика к современным компьютерам. Кое-какие подробности на эту тему можно найти в заметке Декодируем сигнал с OOK-модуляцией и паяем кликер.
А доводилось ли вам делать что-то прикольное с ретро-консолями, и если да, то что именно?
Видео:
- Питание геймпада: 3 В (2 батарейки типа AAA);
- Питание приёмника: 3.3/5В;
- Дальность действия: до 20м;
- Частота работы: 2.4 ГГц;
Распиновка самых популярных плат ардуино Arduino board pinmaping
В посте собраны практически все платы ардуино с распиновкой в хорошем качестве !
Arduino — это эффективное средство разработки программируемых электронных устройств, которые, в отличие от персональных компьютеров, ориентированы на тесное взаимодействие с окружающим миром. Ардуино — это открытая программируемая аппаратная платформа для работы с различными физическими объектами и представляет собой простую плату с микроконтроллером, а также специальную среду разработки для написания программного обеспечения микроконтроллера.
Ардуино может использоваться для разработки интерактивных систем, управляемых различными датчиками и переключателями. Такие системы, в свою очередь, могут управлять работой различных индикаторов, двигателей и других устройств. Проекты Ардуино могут быть как самостоятельными, так и взаимодействовать с программным обеспечением, работающем на персональном компьютере (например, приложениями Flash, Processing, MaxMSP). Любую плату Ардуино можно собрать вручную или же купить готовое устройство; среда разработки для программирования такой платы имеет открытый исходный код и полностью бесплатна.
Язык программирования Ардуино является реализацией похожей аппаратной платформы «Wiring», основанной на среде программирования мультимедиа «Processing».
Подключить джойстик и сервопривод к Arduino. Научимся управлять сервоприводами с помощью джойстика.
Джойстик часто используется для управления сервоприводами. Поэтому рассмотрим небольшой пример, в котором будем изменять угол положения двух servo подключённых к Arduino UNO по схеме.
Для данного примера устанавливать дополнительные библиотеки не нужно, так как библиотека servo устанавливается вместе с Arduino IDE.
Код для управления сервоприводами с помощью джойстика будет небольшим и достаточно простым.
Итог: Как видим из примеров, применение джойстика достаточно большое в разработке проектов на Arduino и в робототехнике.
Если вас интересует дополнительная информация о джойстике, пишите об этом в комментариях.
Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.