Блютуз джойстик своими руками

Bluetooth пульт из джойстика Sega

Я продолжаю заниматься моделированием и постройкой роботов. Я уже писал инструкцию по созданию пульта для управления моделями и роботами. Пульт создан на основе старого джойстика от Sega. У данного джойстика есть четыре стрелки и 8 кнопок, достаточно для управления машинкой или небольшим роботом. Управление осуществлялось посредством ИК светодиода. Сегодня я напишу инструкцию по модернизации данного пульта, а именно переоборудование его в Bluetooth пульт. В зависимости от используемого Bluetooth модуля пульт или сам будет подключаться к заранее запрограммированному устройству или можно будет подключаться к пульту. Я опишу оба варианта. Нам понадобится:

— Джойстик от приставки Sega
— Arduino Pro Mini 3.3v 8MHz
— USB-TTL
— 2 Ni-Mn аккумулятора 1.2v 1000mA
— Bluetooth модуль HC-05 или HC-06
— Красный светодиод
— Синий светодиод
— Резистора 2x75Om, 2x5Om, 1x2Om
— Коннектор PLSх5 «мама»
— Термоклей
— Провода
— Отсек для батареек 4xAAA
— Разноцветные провода
— Паяльник, припой, канифоль
— Прямые руки

Шаг 1 Выбор Bluetooth модуля
Для связи необходимо два модуля. Один мы вставим в пульт, а второй будем подключать к машинке или роботу. Существует огромное количество Bluetooth модулей. Они различаются функциями и поддерживаемыми протоколами связи. Примерный список модулей, которые встречаются:
— HC-03, HC-04(HC-04-M, HC-04-S) на чипе BC417143 ;
— HC-05, HC-06(HC-06-M, HC-06-S) на чипе BC417143;
— HC-05-D, HC-06-D;
— HC-07 – модуль с чипом CSR 41C6;
— HC-08 – модуль с ультранизким энергопотреблением и протоколом Bluetooth 4.0;
— HC-09 – самый новый модуль, предназначенный для замены HC-06 и HC-07.

Я остановился на двух модулях HC-05 и HC-06, так как они оптимальны в соотношении цена\функционал. Они поддерживают протокол связи – Bluetooth Specification v2.0+EDR. Радиус действия – до 10 метров (уровень мощности 2). Совместимы со всеми Bluetooth-адаптерами, которые поддерживают SPP. Объем flash-памяти (для хранения прошивки и настроек) – 8 Мбит. Работают на частоте радиосигнала – 2.40 .. 2.48 ГГц. Хост-интерфейс – USB 1.1/2.0 или UART. Они обладаю небольшим энергопотреблением – ток в течение связи составляет 30-40 мА. Среднее значение тока около 25 мА. После установки связи потребляемый ток 8 мА. Эти модули легко найти, они являются самыми распространёнными. Модули очень похожи, а основное отличие между ними в том, что HC-05 может работать как в режиме ведущего (master), так и в режиме ведомого (slave). HC-06 может являться только ведомым устройством. Проше говоря, HC-06 не может сам обнаружить парное устройство и наладить с ним связь, он может лишь подчиниться ведущему. Модули продаются в виде двух спаянных вместе плат. Меньшая из них — заводской модуль. Большая — специальная макетная платка для DIY. Так выглядит меньшая плата с чипом BC417:

А так сами DIY модули HC-05 и HC-06:

Вы можете приобрести модуль без макетной платы. Он стоит немного дешевле, но тогда придется ставить стабилизатор напряжения 3.3 V для модуля. Также расстояние между контактами маленькое и придется помучится, припаивая к модулю провода.
Для установки связи между пультом и роботом или машинкой необходимо настроить два Bluetooth модуля на друг друга. В данном случаем модуль HC-05 мы настроим так, чтобы он находил и подключался к HC-06.

Шаг 2 Настройка HC-06.
Вначале необходимо подключить HC-06 к компьютеру. Сделать это можно подключив модуль через USB-UART переходник. В данном случае подключение, следующее:
Bluetooth – USB-UART
TX – RX
RX – TX
VCC — +5
GND – GND

Если под руками нет USB-UART можно записать в любую Arduino плату следующий скетч:

Подключить по следующей схеме:
Bluetooth – Arduino
TX – pin 2
RX – pin 3
VCC — +5
GND — GND

Затем открываем любую терминальную программу, выбираем com-порт к которому подключен HC-06, скорость по умолчанию 9600, NL и CR не нужен. Если с HC-06 не установлено Bluetooth соединение, модуль находится в режиме ввода AT команд. Если модуль не отзывается попробуйте перегрузить его, отключив плюсовой провод и подключив его снова. И вводим следующие команды:

«AT» — без кавычек, должен прийти ответ «OK».
«AT+ADDR» — этой командой мы узнаем уникальный адрес HC-06, следует записать этот адрес
«AT+BAUD7» — устанавливаем скорость 57600
«AT+RESET» — перегружаем модуль

Следующие команды не обязательно вводить, но на всякий случай лучше их знать:
«AT+NAME » — смена имени устройства, имя вводится латинским буквами, без скобок.
«AT+ORGL» — возвращение модуля к заводским настройка
На этом настройка HC-06 закончена.

Шаг 3 настройка HC-05.
Подключаем модуль аналогично HC-06. Далее открываем любую терминальную программу, выбираем com-порт на котором висит USB-UART или Arduino, по заводским настройка скорость связи 9600, но я встречал и со скоростью 38400, если вы не меняли ее выбираейте 9600, не получиться соединиться меняем на 38400. Также стоит включить параметры NL и CR. Для перевода в режим ввода AT команд нужно нажать кнопку на плате HC-05, после этого вводим следующее:

«AT» — вводится без кавычек должен прийти ответ «OK». Если пришел продолжаем вводить команды дальше.
«AT+ROLE=1» — этой командой мы устанавливаем роль модуля цифрой:
0 — ведомый, 1 — ведущий, 2 — ведомый в цикле*. Должен прийти ответ «+ROLE:1\r\n» или «OK»
«AT+CMODE=0» — модуль в роли ведущего подключается только к тому Bluetooth устройству, адрес которого указан командой «AT+BIND».
«AT+BIND:1234,56,123456» — для установки соединения с вашим HC-06 нужно вписать сюда его адрес. После ввода всех команд модуль находится в роли ведущего (ROLE=1) и установлен режим подключения к фиксированному адресу (CMODE=0), он будет подключаться только к тому Bluetooth устройству, адрес которого указан данной командой. Части адреса вводятся: при установке — через запятую, а при ответе — через двоеточие. Придет ответа: «+BIND:1234:56:789ABC \r\n» или «OK»
«AT+UART=57600,0,0» — устанавливаем скорость 57600 бит/сек, стоп бит представлен цифрой: 0 — один, проверка представлена цифрой: 0 — без проверки

Если вы запутались в настройках модуля или он перестал работать правильно попробуйте следующую команду:
«AT+ORGL» — Модуль сбрасывает следующие настройки IAC=9e8b33, ROLE=0, CMODE=0, UART=38400,0,0, PSWD=1234, NAME=hc01.com.

А затем заново проведите настройку нужных вам параметров.
Таким образом мы создали устойчивую связь между HC-05 и HC-06. При включении модулей HC-05 будет устанавливать соединение с HC-06. По личному опыту могу сказать, лучше вначале включать HC-05, а затем HC-06. Если соединение пропало перегружать нужно оба модуля.

Читайте также:  Как сделать своими руками блокнот для девочек

Шаг 4 Подготовка пульта.
Данный шаг подробно описан в предыдущей инструкции по адресу:

Необходимо выполнить шаги с 1 по 4. Припаивать ИК диод необязательно, хотя и мешать он не будет.

Шаг 5 Подключение Bluetooth модуля.
Я советую в пульт установить HC-06. Так как для изменения настроек модуля нужно будет только залить соответствующий скетч в Arduino Pro Mini. В случае с HC-05 придется разбирать пульт, чтобы нажать на кнопку перевода в режим AT команд. Соединяем все по следующей схеме

Джойстик – Arduino
Стрелка вверх — pin 2
Стрелка вниз – pin 4
Стрелка влево — pin 5
Стрелка вправо — pin 6
Кнопка A — pin 8
Кнопка B — pin 10
Кнопка C — pin 7
Кнопка X — pin 12
Кнопка Y — pin 11
Кнопка Z — pin 9
Кнопка Start — pin 14 (A0)
Кнопка Reset — RST
Общий — GND
Bluetooth – Arduino
TX – pin 16 (A2)
RX – pin 17 (A3)
VCC — + 5
GND – GND

HC-05 подключаем к ваше машинке или роботу которым собираетесь управлять. Варианты подключения и скетчи вы найдете в других моих инструкциях. При написании скетча робота надо установить скорость соединения 57600, и использовать в скетче библиотеку SoftwareSerial.

Шаг 6 Подготовка среды и прошивка.
Для написания и редактирования скетча лучше всего использовать Arduino IDE. Версия Arduino IDE должна быть не ниже чем 1.8. Скачиваем Arduino IDE с официального сайта:

Затем необходимо добавить в Arduino IDE библиотеку. В скетче используется одна библиотека SoftwareSerial.h (для связи с Bluetooth модулем):

Потребуется скачать и установить ее. Установить библиотеку можно распаковав архив и переместив распакованные файлы в папку «libraries», находящуюся в папке с установленной Arduino IDE. Или можно воспользоваться встроенным средством добавления библиотек — не распаковывая скачанный архив, выбрать в среде Arduino IDE меню Скетч – Подключить библиотеку. В верху выпадающего списка выбрать пункт «Добавить .Zip библиотеку». И указать место расположения скачанного архива. После установки библиотеки нужно перезагрузить Arduino IDE.
Прошивается наш пульт также, как и предыдущая версия пульта, через коннектор подключенный к USB-TTL, зарядка тоже через него. При заливке скетча необходимо нажать Reset.

Источник

Делаем еще один джойстик (геймпад) на Arduino

Шла обычная пятница, ничто не предвещало беды…

Но червь «нужно что-то сделать» уже начал свою работу. После прочтения статьи я вспомнил, что у меня в барахле лет 15, если не больше, валяется сеговский геймпад. Забрал я его с твердым намерением сделать геймпад на процессоре AVR (про ардуино я тогда и не слышал, но пару небольших проектов на AVR сделал).

Еще больше утвердила мое намерение статья про MSX, и в пятницу я решил — делаю!

Из закромов был вытащен на белый свет сеговский геймпад в разобранном состоянии. К моему изумлению он был в полном комплекте (ну, если не считать порезанные дорожки и отсутствующий оригинальный контроллер), не хватало только 2-х болтиков.

В качестве контроллера я решил использовать Beetle, так как он был заказан мной когда-то, но пока не испробован, да и не очень понравился «малым количеством портов».

И тут меня ждало разочарование — портов 6, кнопок 10. Горю моему не было предела, но мозг таки нашел решение, для начала я решил попробовать собрать прототип из 2-х кнопок, так как я решил использовать фокус с диодом, чтобы опрашивать 10 кнопок с помощью 6 выводов. Практически окрыленный, я засел за проверку… И тут случилась следующая неприятность — кнопок на джойстике больше, чем 10! В общем это был тот момент, когда нужно было смотреть в документацию, хотя идей было много — например припаять (ага, моим паяльником, который накрывает почти все ножки с одной стороны микросхемы), или поискать просветления в интернете.
Документация же четко сказала, что портов у Beetle на самом деле не 6, а 10, что сделало дальнейший процесс скучным (так я думал). (Использование 8 выводов дает возможность опрашивать 2 * 6 = 12 кнопок, что мне и было нужно)

Схема подключения — матрица 6 х 2, потому как оригинальная плата была разведена удобным мне образом. (Кстати в процессе предыдущей переделки дорожки были порезаны, чтобы подключить клавиатурный контроллер, пришлось восстанавливать, вышло страшненько)

Схема получившегося геймпада:

Быстро накидав пример я убедился что он не работает… Не понял?! Пример то простейший. Подумав, сообразил, что цифровому пину не хватает того сопротивления, что дают резиновые токопроводящие кнопки, немного изменил схему, теперь читается аналоговый сигнал и сравнивается с половиной максимума. Перепаиваю контакты, переписываю программу и… ничего не работает, совсем. Контроллер не определяется, все пропало. Код проверен, и перепроверен, все должно работать! А контроллер не видится ни в какую. Мотивация падает, делаем перерыв.

Через некоторое время безуспешно поигравшись с Beetle, ну все, убил контроллер своим паяльником, с сожалением достаю из закромов Arduino Micro, прошиваю прошивку и снова тишина! Становится понятно, что-то не так с кодом, в конце концов нахожу банальную причину — бесконечный цикл в loop(), исправляю, но зашить то не могу! Оказывается проблема, когда контроллер не видится решается нажатием на резет во время прошивания (или замыканием пинов в моем случае)

В итоге получился сеговский геймпад, проверен, работает, я счастлив: поиграл в Metal Gear, Felix The Cat, Super Mario.



P. S. «Трюк со светодиодом». Конечно не обязательно использовать светодиод, обычный диод лучше подходит, суть простая, вместо двух выводов использовать один, соединенный с разными кнопками через 2 диода:

Источник

Создаём собственный игровой контроллер

Источник вдохновения

На игровых выставках разработчики Objects in Space показывали демо своей игры с контроллером на кокпите огромного космического корабля. Он был дополнен загорающимися кнопками, аналоговыми приборами, световыми индикаторами состояния, переключателями и т.д… Это сильно влияет на погружение в игру:

На сайте игры выложен туториал по Arduino с описанием коммуникационного протокола для подобных контроллеров.

Я хочу создать то же самое для своей игры

В этом примере я потрачу примерно 40 долларов, чтобы добавить красивые, большие и тяжёлые переключатели на кокпит симулятора гонок. Основные затраты связаны с этими самыми переключателями — если бы я использовал простые переключатели/кнопки, то цена была в два раза ниже! Это настоящее оборудование, способное выдерживать 240 Вт мощности, а я буду пускать по ним только примерно 0,03 Вт.

Предупреждение: я решил сэкономить, поэтому оставляю ссылку на дешёвый китайский веб-сайт, где закупаю кучу разных компонентов/инструментов. Один из недостатков покупки компонентов по дешёвке заключается в том, что часто у них нет никакой документации, поэтому в статье я решу и эту проблему.

Читайте также:  Как сделать нитка держатель своими руками

Основные компоненты

Рекомендуемые инструменты

Программное обеспечение

Предупреждение

Я изучал электронику в старшей школе, научился пользоваться паяльником, узнал, что красные провода нужно соединять с красными, а чёрные с чёрными… Вольты, амперы, сопротивление и связывающие их уравнения — вот и всё, чем исчерпывалось моё формальное обучение электронике.

Для меня это был обучающий проект, поэтому в нём могут быть плохие советы или ошибки!

Часть 1. Собираем контроллер!

Работаем с переключателями без документации.

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

Простая двухконтактная кнопка/переключатель

С кнопкой всё просто — в ней нет светодиодов и всего два контакта. Переключаем мультиметр в режим непрерывности/прозвонки () и касаемся щупами разных контактов — на экране будет отображаться OL (open loop, разомкнутая цепь): это означает, что между двумя щупами нет соединения. Затем нажимаем на кнопку, по-прежнему касаясь щупами контактов — на экране теперь должно отобразиться что-то типа 0.1Ω и мультиметр начнёт пищать (сообщая о том, что между щупами присутствует очень низкое сопротивление — замкнутая цепь).

Теперь мы знаем, что при нажатии кнопки цепь замыкается, а при отжатии — размыкается. На схеме это можно обозначить как простой выключатель:

Подключаем переключатель к Arduino

Найдите на плате Arduino два контакта: помеченный GND и помеченный «2» (или любым другим произвольным числом — это контакты ввода-вывода общего назначения, которыми мы можем управлять через ПО).

Если мы подключим переключатель таким образом, а потом прикажем Arduino сконфигурировать контакт «2» как контакт INPUT, то получим цепь, показанную слева (на рисунке ниже). При нажатии кнопки контакт 2 будет напрямую соединяться с землёй / 0V, а при отжатии контакт 2 не будет соединён ни с чем. Это состояние (ни с чем не соединён) называется «floating» (состояние с высоким импедансом) и, к сожалению, это не очень хорошее состояние для наших целей. Когда мы считываем данные с контакта в ПО (с помощью digitalRead(2)), получаем LOW, если контакт заземлён, и непредсказуемый результат (LOW или HIGH), если контакт находится в состоянии floating!

Чтобы исправить это, мы можем сконфигурировать контакт так, чтобы он находился в режиме INPUT_PULLUP, который соединяется с резистором внутри процессора и создаёт схему, показанную справа. В этой цепи при разомкнутом переключателе контакт 2 имеет путь к +5V, поэтому при его считывании результатом всегда будет HIGH. При замыкании переключателя у контакта по-прежнему будет путь с высоким сопротивлением к +5V, а также путь без сопротивления к земле / 0V, который «побеждает», благодаря чему при считывании контакта мы получаем LOW.

Разработчикам ПО порядок может показаться обратным — при нажатии кнопки мы считываем false / LOW, а при отжатии — true / HIGH.

Можно сделать и наоборот, но у процессора есть только встроенные подтягивающие резисторы и нет утягивающих вниз резисторов, поэтому мы будем придерживаться этой модели.

Простейшая программа для Arduino, которая считывает состояние переключателя и сообщает PC о его состоянии, выглядит примерно так, как показано ниже. Вы можете нажать кнопку загрузки в Arduino IDE, а затем открыть Serial Monitor (в меню Tools), чтобы увидеть результаты.

Другие переключатели почти без документации.

Светодиодный переключатель с тремя контактами

К счастью, на основных переключателях моей панели есть пометки трёх контактов:

Я не полностью уверен, как он работает, поэтому мы снова переключим мультиметр в режим непрерывности и коснёмся всех пар контактов при включенном и отключенном переключателе… однако на этот раз мультиметр вообще не пищит, когда мы касаемся щупами [GND] и [+] при «включенном» переключателе! Единственная конфигурация, при которой мультиметр пищит (обнаруживает соединение) — когда переключатель «включен», а щупы находятся на [+] и [lamp].

Светодиод внутри переключателя блокирует измерения непрерывности, поэтому из проведённых выше проверок мы можем предположить, что LED подключен непосредственно к контакту [GND], а не к контактам [+] и [lamp]. Далее мы переключим мультиметр в режим проверки диодов (символ ) и снова проверим пары контактов, но на этот раз важна полярность (красный и чёрный щуп). Теперь если мы соединим красный щуп с [lamp], а чёрный — с [GND], то светодиод загорится, а на мультиметре отобразится 2.25V. Это прямое напряжение диода, или минимальное напряжение, необходимое для его включения. Вне зависимости от положения переключателя, 2.25V от [lamp] к [GND] заставляет LED загореться. Если мы соединим красный щуп с [+], а чёрный — с [GND], то светодиод загорится только при включённом переключателе.

Из этих показаний мы можем предположить, что внутренности этого переключателя выглядят примерно как на схеме ниже:

  1. [+] и [lamp] замыкаются накоротко, когда переключатель включен/замкнут.
  2. Положительное напряжение от [lamp] к [GND] всегда зажигает светодиод.
  3. Положительное напряжение от [+] к [GND] зажигает светодиод только при включенном/замкнутом переключателе.

Честно говоря, о присутствии резистора здесь можно только догадываться. Светодиод должен быть соединён с соответствующим резистором, чтобы ограничивать подаваемый на него ток, или он сгорит. Мой не сгорел и похоже, что работает правильно. На форуме веб-сайта продавца я нашёл пост, в котором говорится об установленном резисторе, поддерживающем работу до 12 В, и это сэкономило мне время на проверку/вычисления подходящего резистора.

Подключаем переключатель к Arduino

Проще всего использовать переключатель с Arduino, проигнорировав контакт [lamp]: подключить [GND] к GND в Arduino и соединить [+] с одним из пронумерованных контактов Arduino, например 3.

Если мы сконфигурируем контакт 3 как INPUT_PULLUP (так же, как и для предыдущей кнопки), то придём к показанному ниже результату. Слева вверху показано значение, которое мы будем получать, выполнив «digitalRead(3)» в коде Arduino.

Когда переключатель включен/замкнут, мы считываем LOW и светодиод загорается! Для использования такого переключателя в данной конфигурации мы можем использовать тот же код Arduino, что и в примере с кнопкой.

Проблемы этого решения

После подключения к Arduino полная цепь выглядит так:

Однако здесь мы можем увидеть, что при замыкании переключателя кроме небольшого ограничивающего ток резистора перед LED (я предполагаю, что его сопротивление 100 Ом) есть и ещё и подтягивающий резистор на 20 кОм, который ещё больше снижает величину тока, текущего через светодиод. Это означает, что хотя цепь и работает, светодиод будет не очень ярким.

Ещё один недостаток этой схемы в том, что у нас нет программного контроля над LED — он включён, когда включён переключатель, и отключен в противоположном случае.

Можно посмотреть, что случится, если мы подключим контакт [lamp] или к 0V, или к +5V.

Если [lamp] подключен к 0V, то светодиод постоянно отключен (вне зависимости от позиции переключателя), а распознавание позиции Arduino всё равно выполняется. Это позволяет нам при желании программно отключать LED!

Читайте также:  Ваз 2109 замена гранаты наружной своими руками

Если [lamp] подключен к +5V, то светодиод постоянно включен (вне зависимости от позиции переключателя), однако распознавание позиции Arduino поломано — с контакта всегда будет считываться HIGH.

Подключаем этот переключатель к Arduino правильно

Мы можем преодолеть описанные выше ограничения (низкий ток/яркость светодиода и отсутствие программного контроля над светодиодом), написав больше кода! Чтобы разрешить конфликт между возможностью управления светодиодом и сломанным из-за него распознаванием позиции, мы можем разделить две задачи по времени, то есть временно отключать LED при считывании контакта датчика (3).

Сначала подключим контакт [lamp] к ещё одному контакту Arduino общего назначения, например, к 4, чтобы можно было управлять lamp.

Чтобы создать программу, которая будет правильно считывать позицию переключателя и управлять светодиодом (мы заставим его мигать), нам достаточно просто отключать светодиод перед считыванием состояния переключателя. Светодиод будет отключаться всего на доли миллисекунд, поэтому мерцание не должно быть заметно:

В Arduino Mega контакты 2-13 и 44-46 могут использовать функцию analogWrite, которая на самом деле не создаёт напряжения от 0V до +5V, а аппроксимирует его при помощи прямоугольной волны. При желании можно использовать её для управления яркостью светодиода! Этот код заставит свет пульсировать, а не просто мерцать:

Подсказки по сборке

Пост и так уже довольно большой, так что я не буду добавлять ещё и туториал по пайке, можете его загуглить!

Однако приведу самые базовые советы:

  • При соединении проводов с большими металлическим контактами сначала убедитесь, что паяльник нагрелся и какое-то время нагревайте и металлический контакт. Смысл пайки заключается в образовании постоянного соединения созданием сплава, но если горячей является только одна часть соединения, то у вас запросто может получиться «холодное соединение», которое выглядит как соединение, но на самом деле не соединено.
  • При соединении двух проводов наденьте сначала на один из них кусок термоусадочной трубки — после соединения трубку надеть будет нельзя. Это кажется очевидным, но я постоянно это забываю и мне приходится использовать вместо трубки изоленту… Протяните термоусадочную трубку подальше от соединения, чтобы она не нагрелась раньше времени. Проверив паянное соединение сдвиньте на него трубку и нагрейте её.
  • Тонкие маленькие соединительные провода, которые я упоминал в начале, хорошо подходят для соединений без пайки (например, при подключении к Arduino!), но довольно хрупкие. После пайки используйте для их закрепления клеевой пистолет и устраните из самого соединения все напряжения. Например, красные провода на показанном ниже снимке при работе можно случайно потянуть, поэтому после пайки я зафиксировал их каплей горячего клея:

Часть 2. Превращаем устройство в игровой контроллер!

Чтобы ОС распознала устройство как игровой USB-контроллер, нужен достаточно простой код, но, к сожалению, также необходимо заменить firmware USB-чипа Arduino другим, которое можно взять здесь: https://github.com/harlequin-tech/arduino-usb.

Но после заливки этого firmware в Arduino устройство становится USB-джойстиком и перестаёт быть Arduino. Поэтому чтобы перепрограммировать его, нужно заново перепрошить исходную firmware Arduino. Эти итерации довольно мучительны — загружаем код Arduino, прошиваем firmware джойстика, тестируем, прошиваем firmware arduino, повторяем…

Пример программы для Arduino, которую можно использовать с этим firmware, показан ниже — он конфигурирует три кнопки в качестве вводов, считывает их значения, копирует значения в структуру данных, ожидаемую этим firmware, а затем отправляет данные. Смыть, намылить, повторить.

Часть 3. Интегрируем устройство с собственной игрой!

Если у вас есть контроль над игрой, с которой должно взаимодействовать устройство, то в качестве альтернативы можно общаться с контроллером напрямую — нет необходимости делать его видимым для ОС как джойстик! В начале поста я упомянул Objects In Space; именно такой подход использовали её разработчики. Они создали простой коммуникационный ASCII-протокол, позволяющий контроллеру и игре общаться друг с другом. Достаточно просто перечислить последовательные порты системы (они же COM-порты в Windows; кстати, посмотрите, как ужасно это выглядит на C), найти порт, к которому подключено устройство с названием «Arduino», и начать считывать/записывать ASCII по этой ссылке.

На стороне Arduino мы просто используем функции Serial.print, которые применялись в показанных выше примерах.

В начале этого поста я также упоминал мою библиотеку для решения этой задачи: https://github.com/hodgman/ois_protocol.

Она содержит код на C++, который можно интегрировать в игру и использовать её в качестве «сервера», и код Arduino, который можно выполнять в контроллере, чтобы использовать его в качестве «клиента».

Настраиваем Arduino

В example_hardware.h я создал классы, чтобы абстрагировать отдельные кнопки/переключатели; например, «Switch» — это простая кнопка из первого примера., а «LedSwitch2Pin» — переключатель с управляемым светодиодом из второго примера.

Код примера для моей панели кнопок находится в example.ino.

В качестве небольшого примера давайте допустим, что у нас есть единственная кнопка, которую нужно отправлять в игру, и один управляемый игрой светодиод. Необходимый код Arduino выглядит так:

Настраиваем игру

Код игры написан в стиле «single header». Для импорта библиотеки включим в игру oisdevice.h.

В едином файле CPP, прежде чем выполнять #include заголовка, напишем #define OIS_DEVICE_IMPL и #define OIS_SERIALPORT_IMPL — это добавит в файл CPP исходный код классов. Если у вас есть собственные утверждения, логгинг, строки или векторы, то существует несколько других макросов OIS_*, которые можно определить перед импортом заголовка, чтобы воспользоваться возможностями движка.

Для перечисления COM-портов и создания соединения с конкретным устройством можно использовать такой код:

Получив экземпляр OisDevice, нужно регулярно вызывать его функцию-член Poll (например, в каждом кадре), можно получать текущее состояние вывода контроллера с помощью DeviceOutputs(), использовать события устройства с помощью PopEvents() и отправлять устройству значения с помощью SetInput().

Пример приложения, делающего всё это, можно найти здесь: example_ois2vjoy/main.cpp.

Часть 4. Что если я хочу части 2 и 3 одновременно?

Чтобы контроллер мог работать в других играх (часть 2), нужно установить собственное firmware и одну программу Arduino, но чтобы контроллер полностью программировался игрой, мы использовали стандартное firmware Arduino и другую программу Arduino. Но что если мы хотим иметь обе возможности одновременно?

Пример приложения, на который я давал ссылку выше (ois2vjoy), решает эту проблему.

Это приложение общается с OIS-устройством (программа из части 3), а затем на PC преобразует эти данные в обычные данные контроллера/джойстика, которые потом передаются в виртуальное устройство контроллера/джойстика. Это означает, что можно позволить своему контроллеру постоянно использовать библиотеку OIS (другое firmware не требуется), а если мы захотим использовать его как обычный контроллер/джойстик, то просто запустим на PC приложение ois2vjoy, выполняющее преобразование.

Часть 5. Завершение

Надеюсь, кому-то эта статья показалась полезной или интересной. Спасибо, что дочитали до конца!

Если вам стало любопытно, то я приглашаю вас поучаствовать в развитии библиотеки ois_protocol! Думаю, будет здорово разработать единый протокол для поддержки всевозможных самодельных контроллеров в играх и стимулировать игры к прямой поддержке самодельных контроллеров!

Источник

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