Реклама ⓘ
Главная » Компьютерная электроника
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

USB джойстик на PIC-микроконтроллере

В настоящее время большинство современных компьютеров не имеют последовательных и параллельных портов, которые ранее использовались для игр. Все большую популярность среди энтузиастов набирает использование 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 кабель. Фото переделанного джойстика показано ниже:

Устройство готово к работе! Соберите джойстик и подключите к свободному USB порту. При этом он должен правильно определиться ОС Windows. Вы можете откалибровать его и начать использовать для игр, которые поддерживают джойстик.

Заключение

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

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
U1 МК PIC 8-бит
PIC18F2550
1 Поиск в магазине ОтронВ блокнот
X1 Кварцевый резонатор20 МГц1 Поиск в магазине ОтронВ блокнот
C1, C2 Конденсатор22 пФ2 Поиск в магазине ОтронВ блокнот
C3 Конденсатор220 нФ1 Поиск в магазине ОтронВ блокнот
R1 Резистор
10 кОм
1 Поиск в магазине ОтронВ блокнот
R2-R7 Резистор
100 кОм
6 Поиск в магазине ОтронВ блокнот
J10 USB разъем1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

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

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (2) | Я собрал (0) | Подписаться

0
Vinchence #
Смонтировал эту схему в джойстике Cobra R4, предварительно заменив потенциометры на индукционный датчик. При проведении теста в программе joytester2 порадовало отсутствие мёртвых зон, хотя есть по осям шум (нужно продумать среднестатистический опрос АЦП, так как в других прошивках и на родной плате джойстика шума нет).
Ответить
0
демидос #
Маленькая пп, если кому надо. Пока не собрал. Смущает сопротивление верхнего положения POV
Прикрепленный файл: pic joystic.lay6
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

USB-реле (2 канала)
USB-реле (2 канала)
DC-DC регулируемый преобразователь 1.5-37В 2А с индикатором Конструктор: DDS генератор сигналов
вверх