В настоящее время большинство современных компьютеров не имеют последовательных и параллельных портов, которые ранее использовались для игр. Все большую популярность среди энтузиастов набирает использование USB. К сожалению, USB не является самым простым протоколом и зачастую просто отпугивает. Но, на рынке существует несколько решений, которые позволяют легко внедрить USB устройства.
В данном проекте рассматривается использование микроконтроллера PIC с поддержкой USB и компилятора mikroC для преобразования старого джойстика игрового порта так, чтобы его можно было использовать по USB. Одним из преимуществ компилятора mikroC является создание библиотек USB HID, которые позволяют легко создать USB HID устройство. При записи USB кода с использованием компилятора mikroC, изготовленное USB устройство является настоящим HID устройством, которое может использоваться для передачи и получения данных из микроконтроллера PIC. Но существует возможность модифицировать USB дескриптор, генерируемый mikroC так, что можно получить специфическое USB HID устройство, наподобие клавиатуры, мыши, джойстика или планшета графического ввода.
Компилятор
В данном проекте используется компилятор mikroC v8 compiler. Используемые методы сходятся с большинством других компиляторов, которые генерируют HID код.
Джойстик
В данном проекте используется старый джойстик IBM 76H1571, фото показано ниже:
76H1571 – это 4-кнопочный джойстик с колесиком throttle и переключателем видов POV hat. Наиболее интересно, что вы не можете использовать колесико и переключатель одновременно – можно использовать либо один элемент, либо другой. Два ползунковых переключателя на передней стороне джойстика используются для включения и выключения колесика и переключателя POV, поэтому вы можете выбрать тот элемент, который хотите использовать в конкретный момент.
Поскольку с USB интерфейсом не существует ограничений, переделанный джойстик сможет одновременно использовать колесико и переключатель видов. Тогда два переключателя не будут задействованы, так почему бы для них не назначить новые функции?
В заключении хочу указать, что переделанный джойстик имеет следующие характеристики:
- 2-осевой джойстик
- Колесико Throttle
- 4 направленный переключатель видов POV
- 6 кнопок
Дескриптор отчета HID
Когда компилятор генерирует USB HID код, он создает дескриптор, который пересылается в USB хост и указывает, какой тип подключаемого USB устройства. Дескриптор HID устройства несколько отличается, поскольку имеет дополнительный дескриптор, встроенный в него, который определяет тип HID устройства и метод его использования. В данном разделе будет рассмотрен процесс преобразования нашего устройства в джойстик.
Создание дескриптора
На веб-сайте USB IF размещается полезная программа, которая значительно облегчает создание дескрипторов отчета HID. Она называется HID Descriptor Tool и может быть загружена бесплатно со страницы HID Tools page. После загрузки, распакуйте архив и запустите файл Dt.exe.
Используя данную программу можно создать ваш собственный дескриптор отчета для джойстика (или любого другого HID устройства), определить количество осей и кнопок, и указать другие характеристики (педали управления рулем направления, колеса и т.д.). Также данная программа поставляется с шаблонами дескрипторов, которые можно незамедлительно использовать или модифицировать для своих потребностей. Они находятся в той же папке, что и исполняемый файл, и имеют расширение .hid. Шаблон дескриптора джойстика называется joystk.hid, именно его я и использовал. После загрузки появится следующий экран:
На нем красной рамкой выделены важные секции. В них указываются следующие параметры:
- 1 колесико, описываемое 8 битным значением от -127 до 127
- Оси X и Y
- 1 переключатель видов POV, имеющий 4 положения (0-3) и представляющий угол 0-270, описывается 4-битным значением
- 4 кнопки, каждая из которых описывается 1 битом
Как можно заметить, показатель REPORT_SIZE определяет разрядность данных, которые используются для представления параметра и показатель REPORT_COUNT, который определяет количество отчетов, которые пересылаются для представления параметра.
Модификация дескриптора
Просмотрите сноску по модификации дескриптора Modifying the Joystick HID Descriptor.
Добавление дескриптора в ваш код
После создания дескриптора отчета вы должны экспортировать его в код на языке Си. Для этого, нажмите File->Save As (Файл-сохранить как) в меню программы HID Descriptor Tool. В появившемся диалоговом окне измените тип файла на Header File (*.h).
При этом будет создан заголовочный файл C, который можно впоследствии добавить в ваш проект.
Интеграция mikroC
Для добавления заголовочного файла в дескриптор, генерируемый mikroC, потребуется выполнить некоторые действия. Если вы посмотрите на дескриптор mikroC, вы заметите, что каждый байт сопровождается символом ‘,0’ (игнорируя кавычки, это запятая-ноль). Вам потребуется модифицировать дескриптор отчета, который был сгенерирован, включая данные дополнения. В конечном итоге вы должны получить дескриптор следующего вида:
0x05, 0,
0x01, 0, // USAGE_PAGE (Generic Desktop)
0x15, 0,
0x00, 0, // LOGICAL_MINIMUM (0)
0x09, 0,
0x04, 0, // USAGE (Joystick)
0xa1, 0,
0x01, 0, // COLLECTION (Application)
0x05, 0,
0x02, 0, // USAGE_PAGE (Simulation Controls)
0x09, 0,
0xbb, 0, // USAGE (Throttle)
0x15, 0,
0x81, 0, // LOGICAL_MINIMUM (-127)
0x25, 0,
0x7f, 0, // LOGICAL_MAXIMUM (127)
0x75, 0,
0x08, 0, // REPORT_SIZE (8)
0x95, 0,
0x01, 0, // REPORT_COUNT (1)
0x81, 0,
0x02, 0, // INPUT (Data,Var,Abs)
0x05, 0,
0x01, 0, // USAGE_PAGE (Generic Desktop)
0x09, 0,
0x01, 0, // USAGE (Pointer)
0xa1, 0,
0x00, 0, // COLLECTION (Physical)
0x09, 0,
0x30, 0,
/////////////////////////////////////////
// USAGE (X)
0x09, 0,
0x31, 0, // USAGE (Y)
0x95, 0,
0x02, 0, // REPORT_COUNT (2)
0x81, 0,
0x02, 0, // INPUT (Data,Var,Abs)
0xc0, 0, // END_COLLECTION
0x09, 0,
/////////////////////////////////////////////
0x39, 0, // USAGE (Hat switch)
0x15, 0,
0x00, 0, // LOGICAL_MINIMUM (0)
0x25, 0,
0x03, 0, // LOGICAL_MAXIMUM (3)
0x35, 0,
0x00, 0, // PHYSICAL_MINIMUM (0)
0x46, 0,
0x0e, 0,
0x01, 0, // PHYSICAL_MAXIMUM (270)
0x65, 0,
0x14, 0, // UNIT (Eng Rot:Angular Pos)
0x75, 0,
0x04, 0, // REPORT_SIZE (4)
0x95, 0,
0x01, 0, // REPORT_COUNT (1)
0x81, 0,
0x02, 0, // INPUT (Data,Var,Abs)
0x05, 0,
/////////////////////////////////////
0x09, 0, // USAGE_PAGE (Button)
0x19, 0,
0x01, 0, // USAGE_MINIMUM (Button 1)
0x29, 0,
0x04, 0, // USAGE_MAXIMUM (Button 4)
0x15, 0,
0x00, 0, // LOGICAL_MINIMUM (0)
0x25, 0,
0x01, 0,
// LOGICAL_MAXIMUM (1)
0x75, 0,
0x01, 0, // REPORT_SIZE (1)
0x95, 0,
0x04, 0, // REPORT_COUNT (4)
0x55, 0,
0x00, 0, // UNIT_EXPONENT (0)
0x65, 0,
0x00, 0, // UNIT (None)
0x81, 0,
0x02, 0, // INPUT (Data,Var,Abs)
0xc0, 0 // END_COLLECTION
После заполнения дескриптора, на следующем шаге необходимо удалить дескриптор отчета, сгенерированный mikroC и заменить его на ваш. Для этого сначала создайте дескриптор mikroC, используя программу mikroC HID tool, далее откройте его в редакторе.
Фактические данные дескриптора полностью хранятся в массиве DescTables. Нижние 50 или около того записей в массиве являются дескриптором отчета (строки 109-160). Удалите эти строки, и далее вставьте в новый дескриптор в этом месте. Теперь необходимо выполнить следующие модификации с файлом USBdsc.c:
- Измените строку 23, чтобы она соответствовала незаполненному размеру дескриптора отчета (т.е. размеру дескриптора, сгенерированного программой HID tool, без дополнительных нулевых записей 0′, которые необходимо добавить для mikroC – 77 байт в случае дескриптора по умолчанию для джойстика):
- unsigned char const HID_ReportDesc_len = 77;
- Удалите границы массива для DescTables в строке 36:
- unsigned char const DescTables[] = {
Это все, что нужно было сделать. Теперь дескриптор модифицирован и может работать как USB джойстик. Самый простой способ для тестирования – это скомпилировать код для микроконтроллера PIC, подключить к USB порту вашего ПК и убедиться в том, что он правильно распознается ПК. Далее, необходимо войти в Панель управления и открыть диалоговое окно Игровые устройства. Ваш джойстик должен отображаться в списке устройств.
Пересылка данных в ПК
Если микроконтроллер PIC распознается как USB джойстик, тогда наиболее сложная часть проекта завершена. Пересылка данных джойстика в ПК выполняется простым способом. Когда мы ранее создали дескриптор, мы разработали удобный формат данных с точки зрения дескриптора. В результате экспериментов мы получили следующие параметры:
Элемент
Диапазон значений
Колесико
-127 (мин) до 127 (макс)
Ось Х
от -127 до 127
Ось Y
от -127 до 127
POV вверх
0
POV вправо
1
POV вниз
2
POV влево
3
POV нейтральное
4
Кнопка 1
0-1
Кнопка 2
0-1
Кнопка 3
0-1
Кнопка 4
0-1
Колесико, значения X и Y представляют собой 8-битные значения. Но значения переключателя видов POV и кнопок являются 4-битными, поэтому упаковываются в один байт. Формат данных указан ниже:
Положение битов
7
6
5
4
3
2
1
0
Колесико
Ось-Х
Ось-Y
Кнопка 4
Кнопка 3
Кнопка 2
Кнопка 1
Переключатель видов POV hat
Благодаря предварительно определенному формату данных, существует возможность легко записать программный код, который служит в качестве интерфейса некоторых кнопок и потенциометров, и переслать данные в ПК для подтверждения, что программный код работает правильно. Режим работы PIC джойстика можно определить в опциях Игровые устройства диалогового окна панели управления.
Аппаратное обеспечение
После проверки программного кода необходимо выполнить реальное преобразование джойстика. Для этого сначала необходимо разобрать джойстик и вынуть существующую плату и кабель игрового порта:
Настройка переключателей
Далее необходимо выяснить, как все переключатели и потенциометры соединяются вместе проводами. Потенциометры для осей джойстика и колесика легко определить, и соединить вместе для подачи питания, земли и напряжения на микроконтроллер PIC. Немного сложнее разобраться с переключателями, поскольку они зависят от типа джойстика. Проследив дорожки на печатной плате, было выяснено, как подключаются переключатели; смотрите рисунок ниже:
Наиболее интересный элемент – это переключатель видов POV. Вместо 4 отдельных переключателей, переключатель видов POV подключен как аналоговая система, в которой сопротивление через зеленый и оранжевый провод определяет, какая из кнопок нажимается. В таблице ниже указано сопротивление каждого переключателя:
Положение переключателя
Сопротивление (Ом)
Нейтральное
80 кОм
Вверх
200 Ом
Вправо
20 кОм
Вниз
40 кОм
Влево
60 кОм
Потому для определения направления переключателя видов POV, его провода будут подключаться к схеме делителя напряжения, как показано ниже:
При подключении проводов к источнику питания напряжением 5 В, мы получим следующие напряжения:
Положение переключателя
Напряжение (В)
Нейтральное
3,9
Вверх
0,045
Вправо
2,4
Вниз
3,2
Влево
3,7
Электрическая схема
После определения подключения проводов джойстика, мы спроектировали схему, которая будет соединяться со всеми кнопками и потенциометрами, и отправлять данные в ПК. Для этого был использован микроконтроллер PIC18F2550, работающий на частоте 20 МГц. Переключатели подключены к портам PORTB, потенциометры и переключатель видов POV к АЦП порта PORTA. Схема показана ниже:
Макетная плата показана ниже (имеется три проволочные перемычки, нажмите для увеличения изображения):
После создания платы и проведения тестирования, поместите плату в основание джойстика и замените кабель игрового порта на USB кабель. Фото переделанного джойстика показано ниже:
Устройство готово к работе! Соберите джойстик и подключите к свободному USB порту. При этом он должен правильно определиться ОС Windows. Вы можете откалибровать его и начать использовать для игр, которые поддерживают джойстик.
Заключение
С помощью данного проекта можно одновременно убить 2-х зайцев. С одной стороны, проект показывает, как создать USB HID джойстик и переделать ваш старый джойстик на современный или создать свой собственный джойстик. С другой стороны, если вы знаете, как создавать программный код для USB джойстика, то вы сможете создать код для любого HID устройства, поскольку они все похожи, с той лишь разницей, что для каждого устройств понадобится создать дескриптор отчета HID и предусмотреть пересылку данных в ПК.
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
U1
МК PIC 8-битPIC18F25501
X1
Кварцевый резонатор20 МГц1
C1, C2
Конденсатор22 пФ2
C3
Конденсатор220 нФ1
R1
Резистор10 кОм1
R2-R7
Резистор100 кОм6
J10
USB разъем1
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- USB-Joystick-2010-02-22-21-39-23.zip (154 Кб)