Оглавление:

Акселерометр / гироскоп для контроллера Xbox 360: 7 шагов
Акселерометр / гироскоп для контроллера Xbox 360: 7 шагов

Видео: Акселерометр / гироскоп для контроллера Xbox 360: 7 шагов

Видео: Акселерометр / гироскоп для контроллера Xbox 360: 7 шагов
Видео: Встроил гироскоп в Xbox One геймпад 2024, Июль
Anonim
Акселерометр / гироскопический модуль для контроллера Xbox 360
Акселерометр / гироскопический модуль для контроллера Xbox 360

Я играл в Assetto Corsa на своем контроллере Xbox 360. К сожалению, рулевое управление с помощью аналогового джойстика очень громоздкое, и у меня нет места для установки руля. Я попытался придумать, как бы втиснуть в контроллер улучшенный механизм рулевого управления, когда мне пришло в голову, что я могу использовать весь контроллер в качестве рулевого колеса.

Аналоговый стик имеет два потенциометра. Один измеряет вертикальное движение, а другой - горизонтальное. Он пропускает 1,6 В через каждый и измеряет напряжение, возникающее на дворнике, чтобы определить, насколько переместилась ручка. Это означает, что можно управлять движением ручки, подавая определенное напряжение на штифт стеклоочистителя. (дополнительная информация здесь:

Этот мод использует Arduino для вычисления угла по показаниям акселерометра и преобразования его в аналоговое движение стика через ЦАП. Следовательно, он должен работать с любой игрой, в которой аналоговый джойстик используется в качестве входа.

Шаг 1: Вам понадобятся:

Инструменты:

  • Паяльник
  • Припой
  • Припой / оплетка
  • Инструмент для зачистки проводов
  • Отвертка, может быть, Torx, в зависимости от винтов в вашем контроллере (у меня крестовина)
  • Клей (желательно не очень прочный, чтобы его можно было разобрать позже)
  • Переходник с USB на последовательный для программирования Arduino

Материалы:

  • Контроллер Xbox 360 (да!)
  • Arduino Pro Mini (или его клон) (предпочтительно 3,3 В. Если вы используете версию на 5 В, вам, вероятно, понадобится повышающий преобразователь напряжения)
  • Гироскоп / акселерометр MPU-6050
  • ЦАП MCP4725 (два, если вы хотите управлять обеими осями)
  • Какая-то тонкая проволока
  • Макетная плата, чтобы вы могли все протестировать перед пайкой (необязательно, но рекомендуется)

Шаг 2: Разобрать контроллер

Разобрать контроллер
Разобрать контроллер
Разобрать контроллер
Разобрать контроллер
Разобрать контроллер
Разобрать контроллер

Вам нужно удалить семь винтов. Шесть из них очевидны, а седьмой - за наклейкой. Я предполагаю, что его удаление аннулирует вашу гарантию, поэтому действуйте на свой страх и риск. Многие руководства говорят, что вам нужна отвертка Torx, но у меня крейцкопф, поэтому проверьте свой контроллер.

После этого аккуратно подденьте заднюю крышку. Если вы оторвете переднюю часть, кнопки выпадут наружу и, вероятно, разлетятся по всей комнате. Поднимите его снизу. Затем отключите два вибромотора. (тот, у которого небольшой вес, должен быть слева, а тот, у которого большой вес - справа) Выньте плату и снимите резиновые колпачки с аналоговых джойстиков. Они просто справляются.

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

Затем извлеките 14 контактов, удерживающих левый аналоговый джойстик. Затем снимите палку.

Шаг 3: приклейте компоненты на место

Прикрепите компоненты на место
Прикрепите компоненты на место
Прикрепите компоненты на место
Прикрепите компоненты на место

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

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

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

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

Акселерометр находится справа от провода. Он должен быть как можно более плоским и прямым, иначе вам, возможно, придется написать код позже, чтобы компенсировать смещение. Обратите внимание, что на задней части корпуса есть выступающие кусочки пластика, которых следует избегать. Я обнаружил, что вы можете нанести что-то липкое и красочное, например губную помаду, на выступающие кусочки пластика, а затем надеть заднюю крышку, чтобы увидеть, где она оставляет следы.

ЦАП находятся в нижнем левом углу. Здесь достаточно свободного пространства, чтобы разместить два ЦАП, один поверх другого, если вы хотите управлять обеими осями. Приклеивать их не нужно. Они останутся там, где они есть, только с припаянными соединениями. Если вы вставляете карту между ними, убедитесь, что вы разрезали карту, чтобы оставить доступными SCL, SDA, VCC и GND, потому что вы будете получать доступ к ним с обеих сторон.

Если вы используете два ЦАП, не забудьте переключить перемычку адреса и отключить подтягивающие резисторы на одном из них, как описано здесь: https://learn.sparkfun.com/tutorials/mcp4725-digital-to-analog -конвертер-подключение-руководство

Шаг 4: припаяйте провода

Припаиваем провода
Припаиваем провода
Припаяйте провода
Припаяйте провода
Припаиваем провода
Припаиваем провода

Теперь вам нужно все подключить. VCC, GND, SDA и SCL от всех 2/3 устройств должны быть подключены к VCC, GND, A4 и A5 на Arduino соответственно. ЦАП - самая сложная часть. Если у вас их два, вы должны соединить их вместе, а оставив где-нибудь, вы можете подключить питание и линии к акселерометру, сохраняя при этом провода OUT отдельными.

Вывод OUT на ЦАП должен быть подключен к выводу на плате контроллера, который раньше был выводом среднего горизонтального потенциометра для аналогового джойстика. То есть там, где был аналоговый джойстик, вверху есть ряд из трех контактов. Подключите его к среднему. Если у вас есть другой ЦАП, подключите его к вертикальному контакту потенциометра (ряд слева) таким же образом. Вы не сможете добраться до штифтов сзади при замене спускового крючка, поэтому вам нужно провести провод к передней части платы. Вокруг области аналогового стика есть круглая пластиковая «стенка», но, к счастью, в ней есть удобный зазор, через который можно пропустить провода. Убедитесь, что провода не мешают винтовой стойке на передней части корпуса.

Мой первоначальный план состоял в том, чтобы запитать Arduino 5 В от USB-кабеля, подключенного к контакту RAW, но когда я попробовал, это не сработало. Arduino ничего не запустил, и и Arduino, и контроллер отключились через несколько секунд. Тем не менее, я обнаружил, что на двух контактах на передней панели платы рядом с черным периферийным разъемом есть устойчивый выход 3,3 В, предположительно для питания периферийных устройств. Он работает как с VCC, так и с RAW, но я выбрал VCC, потому что это уже подходящее напряжение и потому, что он позволяет мне припаять его к проводу VCC на ЦАП, который уже находится в нижней части платы, и сэкономить на проводах.

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

Все это сложно описать словами, поэтому я включил картинки и грубую диаграмму.

Шаг 5: запрограммируйте Arduino

Теперь вам нужно запрограммировать Arduino. Для этого потребуется переместить USB-кабель на контроллере, чтобы вы могли получить доступ к последовательным контактам на Arduino. Я включил код, который использовал. Для этого требуется библиотека Adafruit MCP4725, которую можно найти здесь:

Как есть, код позволяет вам равномерно перемещаться по всему диапазону движения аналогового джойстика, перемещая контроллер с 90 градусов влево до 90 градусов вправо, и удерживая его посередине, удерживая его ровно.

Он получает угол регулятора путем вычисления арктангенса g-силы оси X, деленной на g-силу оси Z. Это означает, что он работает, если контроллер расположен вертикально, ровно или под любым углом между ними. (дополнительная информация здесь:

Он работает на моем контроллере, но для других контроллеров может потребоваться другое напряжение, что приведет к нарушению согласования. Я думаю, что лучший способ определить диапазон напряжения - это метод проб и ошибок. Многие игры покажут вам ползунок для аналогового движения стика, но самый точный способ, который я нашел для определения движения, - это jstest в Linux. (https://wiki.archlinux.org/index.php/Gamepad#Joystick_API) Он дает вам число от -32, 767 до 32, 767, а не график, так что вы точно знаете, где находится стик. Подключите контроллер и адаптер Arduino USB к последовательному порту, загрузите jstest и попробуйте разные значения DAC, пока не дойдете до верхнего и нижнего пределов диапазона, и запишите каждое из них. Для меня это было 1 593 - 382.

Особый интерес представляет строка 36:

dacvalue = (controllerangle + 2,5617859169446084418) / 0,0025942135867793503208 + 0,5;

Не сразу понятно, что он делает. Проще говоря, он берет угол регулятора (измеренный в радианах в диапазоне от ~ 1,57 до ~ -1,57) и преобразует его в значение между 1, 593 и 382 для ЦАП. Если у вас другой диапазон ЦАП, вам нужно будет изменить эту строку.

Строку можно записать так:

dacvalue = (controllerangle +) / + 0,5;

С числами и быть вам нужно изменить. равен диапазону угла регулятора (пи), деленному на общий диапазон значений DAC. (верхняя граница диапазона минус нижняя часть диапазона). Это позволяет вам изменить напряжение, хотя результаты будут выходить за пределы желаемого диапазона. Вот почему вам нужно. равно умноженному на нижнюю часть диапазона плюс половину диапазона движения контроллера. (pi / 2) Добавление половины диапазона движения гарантирует, что это не отрицательное число, а добавление, умноженное на нижнюю часть диапазона, гарантирует, что он синхронизируется с диапазоном, который вы хотите.

При преобразовании десятичных дробей в целое число C ++ не округляет. Вместо этого он отсекает десятичную дробь, поэтому 9,9 становится 9. Добавление 0,5 в конце гарантирует, что все, что больше половины, переходит к следующему целому числу, поэтому оно округляется.

После того, как вы загрузили свою программу, убедитесь, что она работает с jstest.

Шаг 6: соберите контроллер

Соберите контроллер так же, как вы его разобрали, за исключением левого аналогового джойстика. Теперь он должен работать. Я считаю, что нет заметной задержки, и это намного лучше, чем использование аналогового джойстика. Поскольку он использует акселерометр, на него влияют резкие движения, но вы должны изо всех сил стараться это заметить.

Шаг 7: Возможные улучшения

Есть некоторые улучшения, которые можно сделать. Это включает:

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

Рекомендуемые: