Джойстики и другие игровые манипуляторы
Поиск по сайту

Опрос
Кого вы поддерживаете на президентских выборах в США?
Джо Байден
Дональд Трамп

MJoy – USB-контроллер джойстика

MJoy – это USB-контроллер джойстика на основе микроконтроллера AVR ATMega8 от Mindaugas Milasauskas.

Основан на проекте контроллера «USB в RS232» от Igor Cesko.

Введение

Я начал разрабатывать этот контроллер джойстика, вдохновленный необходимостью в простом самодельном джойстике, который мог бы преодолеть ограничения гейм-порта и предоставить большую точность и гибкость для всевозможных проектов. Я реализовал потребность в таком устройстве, поскольку я люблю играть в игру Ил-2 Штурмовик. Для этой игры очевидна необходимость иметь высококачественный джойстик, если Вас не радует быть «мясом». Наиболее массово представленные на рынке джойстики имеют массу недостатков. И есть много парней, которые делают джойстики по своим собственным проектам. Многие эти проекты значительно лучше, чем те, что производятся массово. Для большинства этих проектов необходим контроллер. Использование гейм-порта разрушает все достоинства высокоточной и прецизионной механики. Все это обсуждается во многих форумах по игре Ил-2. Очевидное требование для контроллера джойстика – подключение по шине USB, так что я начал работать в этом направлении. И теперь это здесь...

Исследования

Наиболее хорошо выглядел следующий путь – найти подходящий USB-контроллер и добавить к нему необходимые функции. Но после изучения различных устройств и их возможностей стало очевидным, что разработать такое устройство за разумное время и при разумных затратах простому любителю-самодельщику не так уж просто. Другая возможность была – взять более общий микроконтроллер и встроить в него протокол шины USB, как процедуру прикладного уровня. Поиски в интернете привели меня на страницу Igor Cesko (http://www.cesko.host.sk).

Igor провел хорошее исследование и проделал большую работу по встраиванию протокола USB в микроконтроллер. Итак, Я решил взять его проект за основу и осуществить все, что необходимо для топ-джойстика. Я выбрал контроллер ATMega8, так как он дешев и легкодоступен. Браво, Игорь! :)

Затем настало время для исследования реализации микропрограмм HID (Human Interface Device – Устройство Взаимодействия с Человеком – прим. перев.). После этого понадобилось также поглубже копать в спецификациях USB – так как реализация прерываний USB не была включена устройство Игоря. После интенсивной ежевечерней работы в течение пары недель мне удалось заставить работать этот контроллер.

Аппаратные средства

Аппаратная часть контроллера минимальна для того, чтобы самодельщики-электронщики-любители с небольшим опытом могли бы повторить его и построить супер-джойстик самим. Основной мозг – микроконтроллер ATMega8 в DIP-корпусе с 12MHz кварцевым резонатором. Несколько резисторов и конденсаторов – все, что нужно для того, чтобы он заработал. Схематическая диаграмма показана ниже:

Схематическая диаграмма аппаратной части контроллера

Рис. 1. Схематическая диаграмма аппаратной части контроллера

Соединить контроллер с датчиками и кнопками джойстика очень просто. На моих схемах показаны потенциометры, но это могут быть также и некоторые другие типы датчиков положения оси – магнитные, оптические и другие. Я также работаю над подключением этого контроллера к моему модифицированному шлему UR Gear. (Привет Бораде! :) – прим. перев.) Также я покажу некоторые альтернативные конфигурации аппаратной и программной части джойстика. АЦП-входы в этом проекте получают напряжение от 0 до 5 вольт как полный диапазон. Но возможны и меньшие диапазоны напряжений.

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

Печатная плата – вид сверху

Рис. 2. Печатная плата – вид сверху

Печатная плата – вид сбоку

Рис. 3. Печатная плата – вид сбоку

Печатная плата – вид снизу

Рис. 4. Печатная плата – вид снизу

Один разъем – для USB-коннектора, второй – для программирующего адаптера ISP (как я понял, Atmel-овский программатор для микроконтроллеров – прим. перев.). Я знаю, что контроллер выглядит не очень красиво, но он работает. Я буду очень благодарен тому, кто смог бы создать печатную плату и выслать мне один кусочек. :) (видимо, образец печатной платы? – прим. перев.)

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

Все необходимое программное обеспечение зашито в микроконтроллер. Никаких дополнительных драйверов Windows не нужно. Спасибо HID-классам. Разработка и сборка сделаны с использованием AVR Studio 4. Самые главные части обработки протокола USB остались от микропрограммы Игоря. Были добавлены дополнительные программы: обработки специфического дескриптора HID, обработки прерываний, получение данных джойстика, через АЦП и кнопки и упаковки этих данных в сообщения длиной 8 байт. Некоторые ненужные подпрограммы были удалены.

Версия программного обеспечения, опубликованная здесь, предназначена для одной из возможных конфигураций джойстика. Это 24-хкнопочный джойстик с 6 осями и 8-позиционным хэтом:

  • 2 x 10-битных АЦП для осей X, Y;
  • 1 x 8-битный АЦП для оси Throttle;
  • 1 x 8-битный АЦП для оси Rudder;
  • 1 x 8-битный АЦП для оси Slider;
  • 1 x 8-битный АЦП для оси Dial;
  • 1 x 8-позиционный хэт (использует 4 кнопки);
  • 24 кнопки.

Используются почти все входные ресурсы данных, доступные в микроконтроллере ATMega8 в DIP корпусе. Если у вас есть микроконтроллер ATMega16 или старше, вы может иметь даже больше осей и кнопок. Файл проекта AVR Studio 4 с исходным кодом и собравший двоичный код для этой версии диспетчера – здесь: MJoy_v1.1.zip.

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

Установка

Установка выполняется просто – включите устройство в USB-порт компьютера. Операционная система должна обнаружить устройство и установить его как джойстик. Вы можете найти ваш USB-джойстик среди игровых устройств – он появится как «MJoy»:

Список игровых устройств

Рис. 5. Список игровых устройств

Проверка джойстика

Рис. 6. Проверка джойстика

Тестирование проводилось на компьютерах с Windows 2000 и Windows XP. Этот контроллер не имеет функции автоматической калибровки. Но эта функция может быть добавлена в будущем. В данный момент вам может понадобиться откалибровать этот джойстик, используя стандартную процедуру калибровки джойстика в Windows.

Что нужно, чтобы создать заказную конфигурацию джойстика

Я не копал глубоко реализацию Игоря, так что вы можете прочитать его документацию и провести свои собственные исследования. Я попытаюсь описать свою часть и надеюсь, что это поможет вам в создании собственной конфигурации джойстика. Для этого вы должны быть немного знакомый со сборочными инструкциями (видимо, имеется в виду микроассемблер Atmega? – прим. перев.) микроконтроллеров AVR. Программирование на языках более высокого уровня не пригодно, так как код Игоря содержит некоторое количество времязависимых подпрограмм. Максимальный верхний предел конфигурации – 64 бита для одного пакета данных, который необходимо использовать, чтобы упаковать все данные от вашего заказного контроллера. Это может быть консоль с 64 кнопками для элементов управления полетом, или аналог 8 x 8-битовых осей для управления шагом винта, закрылков или любых сочетаний между ними. Выбирать вам!

Другая возможность – использовать несколько пакетов с другими ID, чтобы пересылать столько фактической информации, сколько вам необходимо. Недостаток в том, что интервал запроса самой низкой скорости пересылки пакетов данных – 10 мс. В том случае, если вы переслали несколько пакетов данных циклическим способом, общий показатель опроса устройства должен уменьшаться. В представленной здесь реализации микроконтроллера есть 2 сообщения, которые возвращаются циклически. В результате этот джойстик имеет период опроса 20 мс.

Перечисление (enumeration) USB-устройств HID

Все USB-устройства начинают работать с Перечисления. После получения информации перечисления операционная система узнает, какие драйверы загрузить, чтобы быть способной использовать устройство. Для HID-устройств Windows имеются встроенные драйверы и никаких специальных драйверов не нужно. Все, что нужно – чтобы устройство возвращало дескрипторы, соответствующие спецификации микропрограмм HID.

Дополнительно к минимальным общим дескрипторам USB-устройства, необходимы дополнительные дескрипторы для минимального HID-устройства: HIDDescriptor и ReportDescriptor. Все эти дескрипторы находятся в конце исходного файла.

ReportDescriptor – основная структура, сообщающая тип данного джойстика и какие данные на входе. Если вы хотите разработать собственную конфигурацию, вы должны ознакомиться с этой структурой и понимать ее работу. Имеется спецификация и несколько примеров, из которых вы можете узнать, как получить то, что вам нужно. Пожалуйста, ознакомьтесь с документацией HID в части дескриптора Reports, чтобы быть способным создать значимую структуру. В утилите HID имеется файлы примеров нескольких часто используемых дескрипторов, которые помогут вам в этом.

В данной реализации, которая определяется, как использующий 2 пакета данных с ID 1 и 2. Размер пакета данных, возвращаемого каждым из них, определяется в JoystickReport1Size и JoystickReport2Size. Эти величины указывают размер каждого пакета данных.

В нашем случае ReportID1 имеет размер 8 байтов. Первый байт хранит ID сообщения. Следующие 7 байт информации хранят сведения о положении осей и хэта. ReportID2 содержит 5 - 1 для ID сообщения + 3 для 24 кнопок. Эти величины используются в подпрограмме ProcJoystickRequest, которая будет обсуждена позже.

После правки ReportDescriptor вы должны обновить величину ReportDescriptorSize до размера, равного структуре ReportDescriptor в байтах. Уделяйте этому особое внимание, когда вы правите ReportDescriptor. Появление ошибки приводит к тому, что джойстик исчезает из списка джойстиков системы. Утилита тестирования HID (честно говоря, не очень понимаю, где ЭТО находится и откуда растет :) – прим. перев.) также полезное средство для расчета размера дескриптора. Он может сообщить размер этого дескриптора, когда вы добавляете все поля в проект. Но, в конце концов, я привык пересчитывать их вручную прямо в процессе.

Также имеется другая важная область в EndpointDescriptor – интервал опроса. Вы можете определить собственную величину в диапазоне от 10 до 255. Это определит частоту опроса. По умолчанию (значение 10 миллисекунд) контроллер проводит опрос 100 раз в секунду. Но также вам необходимо помнить, сколько пакетов данных должен рассчитать ваш джойстик за период опроса.

Если вы создаете собственную конфигурацию, вам нужно также скорректировать области VendorUSBID, DeviceUSBID и DeviceVersion. Вы можете также захотеть изменить строковое имя устройства, но, пожалуйста, оставьте авторские записи в VendorStringDescriptor. Это – для меня и для Игоря.

Сбор данных джойстика и форматирование пакетов данных

Вся входная обработка данных джойстика сделана в подпрограмме ProcJoystickRequest. Вам также может понадобиться модифицировать ее, чтобы она соответствовала ReportDescriptor, если вы создаете джойстик заказной конфигурации. Эта подпрограмма вызывается в свободное время между опросами данных. Сложность ее может повлиять на время опроса. Если она слишком сложная, вероятно, вам придется увеличить период опроса, как описано выше. Также имеет смысл отметить, что инструкции подготовки ввода некоторых АЦП и кнопок готовятся в подпрограмме сброса. Так, если вы изменяете поведение некоторых выводов (микроконтроллера – прим. перев.), обратите на них внимание. Один из важных параметров – показатель деления предварительного делителя частоты АЦП (тут я как-то поплыл :) – прим. перев.). Он определяет, как быстро происходит преобразование АЦП. В данном проекте он равен 64, которые дает частоту 187khz для АЦП. Рекомендуемые разработчиками ATMega значения – вплоть до 200kHz для более точных измерений. В данной версии программное обеспечение считывает величины из всех АЦП вводит и считывает матрицу кнопок, используя все свободные выводы ATMega8. Два ветви обрабатывают Report1 и Report2, которые определяются в ReportDescriptor. Выборка идет в циклическом порядке. Есть процедуры, которые читают 10- или 8-битовые вводы АЦП. Входной параметр для них вводится в temp0, которое равно читаемому номеру вывода Порта C. Другая процедура читает ряды кнопок, используя порт D и выводы порта B. Все результаты заносятся в JoystickBuffer, используя структуру, определенную в ReportDescriptor.

Программирование контроллера

Контроллер программируется с использованием очень простого программатора. Я люблю использовать простые инструментальные средства для простых задач :).

Аппаратная часть программатора

Аппаратная часть очень проста:

Аппаратная часть программатора

Рис. 7. Аппаратная часть программатора

Это немного грязный проект, но это работает, и я не думаю, что нужно что-то еще.

У меня он очень простой. Приклеил его фотки. Он хотя и смешной, но работает. Соединяется с контроллером простым 8-жильным кабелем от локальной сети.

Программатор – вид сверху

Рис. 8. Программатор – вид сверху

Программатор – вид снизу

Рис. 9. Программатор – вид снизу

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

Я использую PonyProg, чтобы программировать контроллер. Вы можете загрузить самую последнюю версию на этом website: http://www.lancos.com/prog.html.

Программа PonyProg настраивается очень просто. Выбирается микросхема и в Setup->Interface Setup... выбирается тип программатора. Скриншоты приклеил.

Программа PonyProg

Рис. 10. Программа PonyProg

Программа PonyProg – I/O port setup

Рис. 11. Программа PonyProg – I/O port setup

License and Copyrights

All information in this published document and all source codes is free for non commercial use.

All presented programs and source codes are under GPL licence (for non commercial use).

Copyright © Mindaugas Milasauskas 2004, Lithuania, www.mindaugas.com

Copyright © Ing. Igor Cesko 2003, Slovakia, www.cesko.host.sk

(Это я уж переводить не стал... – прим. перев.)

Оригинал статьи на английском: http://www.mindaugas.com/projects/MJoy/

Mindaugas Milasauskas
Igor Cesko

Перевод: Андрей Морин aka M@troskin

Опубликовано: 6 июня 2008 г.

Copyright © 2003–2024 Maxim Shalumov. All rights reserved. Server: HPE ProLiant MicroServer
Rambler's Top100 Рейтинг@Mail.ru