[Перевод] Как я хакнул контроллер Nintendo Joy-Con
Хирургическая имплантация ёмкостного трекпада с технологией 3D-Touch на место оригинального аналогового джойстика
![[Перевод] Как я хакнул контроллер Nintendo Joy-Con [Перевод] Как я хакнул контроллер Nintendo Joy-Con](https://habrastorage.org/getpro/habr/post_images/4e5/e46/160/4e5e46160fc4b3bdc8a1b93895617311.jpg)
В 2020-м году во время пандемии бывает скучно, и отсутствие возможностей творческого развития усложняет жизнь. Однако когда у вас есть набор инструментов с большим количеством электроники, на множество старых вещей, лежащих у вас на столе, можно взглянуть по-новому. Так и произошло с моим Nintendo Switch – ведь раньше у меня не было возможности разобрать контроллер Joy-Con. Прекрасная возможность поковыряться в его внутренностях.
Дайте-ка я сначала посмотрю в интернете, не возникло ли у кого безумной идеи заменить старый добрый аналоговый джойстик ёмкостным трекпадом? Не возникло.
Макгайвер одобряет.
Фаза 0
Я привык сначала делать наброски в блокноте. Вот мой первый набросок того, как я представлял Joy-Con с ёмкостным трекпадом вместо традиционного аналогового джойстика.
Лучший пункт из всех преимуществ в списке – отсутствие дрифта. Если вы читаете этот текст, вы наверное, знаете, что у некоторых контроллеров Joy-Con есть такая проблема, как дрифт джойстика [самопроизвольное движение управляемого джойстиком курсора на экране без физических перемещений самого джойстика / прим. перев.]. А если его заменить, то и дрифта не будет.

Фаза 1
Во-первых, вряд ли вы можете считать себя нёрдом, если вам не кажутся красивыми полупрозрачные штуки ядовито-зелёного цвета. Поэтому пара кликов на сайте Джеффа Безоса – и ко мне едет новая одёжка для Joy-Con. Разобрать корпус джойстика несложно – самое сложное это орудовать маленьким пинцетом, когда у вас большие руки.

Аналоговый джойстик – вещь несложная. Это двухканальный потенциометр и нажимающаяся кнопка – и всё это соединено с платой через 5-контактный FPC-разъём с шагом в 0,5 мм. Я заказал подходящий плоский кабель, выводящий сигналы со схемы.
Потом я снова собрал Joy-Con и проверил его работу в комплекте со Switch, чтобы убедиться, что всё работает нормально.

Ок, мне нужно заменить аналоговый потенциометр на цифровой.
Фаза 2
Чтобы всё было чисто и красиво, я нарисовал в KiCad схему для пары компонентов, загрузил их размеры и разработал для них специальные платы.

Я решил проверить несколько видов цифровых потенциометров с разной стоимостью и эффективностью, а также несколько разъёмов для плоских кабелей (один для входящих данных с аналогового джойстика, один для выходящих данных с ёмкостного трекпада).

Через неделю я получил посылку от любимого производителя печатных плат. Распределил паяльную пасту, поработал паяльным феном – и платы были готовы.
Настало время испытаний.

Фаза 3
Естественно, для координации всего этого зоопарка мне понадобились Arduino, макетная плата и куча монтажных проводов.
В тестах участвовали:
- Микроконтроллер.
- Два 12-битных цифро-аналоговых преобразователя (подключаются через I2C).
- 5-контактный FPC-разъём с шагом 0,5 мм для аналогового джойстика.
- Гибкий плоский кабель для 5-контактного FPC-разъёма с шагом 0,5 мм.
- 12-контактный FPC-разъём с шагом 0,5 мм для ёмкостного трекпада.
- Гибкий плоский кабель для 12-контактного FPC-разъёма с шагом 0,5 мм.
- Цифровой ёмкостной трекпад с технологией 3D-Touch (подключаются через I2C).
Среди всех испытанных мною цифровых потенциометров я выбрал наиболее подходящий, а заодно и дешёвый. Первый шаг – проверить, что все компоненты правильно подсоединены, получают питание и отзываются. Я залил в плату стандартный код i2c_scanner, и всё прошло удачно.

Несколько строк кода позволило инициализировать DAC и ёмкостной трекпад на шине I2C, а потом я начал подыскивать эффективную стратегию эмуляции потенциометрами движения аналогового джойстика по осям X и Y.
Поскольку разрешение DAC составляет 12 бит, они принимают значения от 0 до 4095, и я разбил этот диапазон на шаги по 10.

На консоли Switch я запустил утилиту калибровки джойстика из настроек, чтобы посмотреть, произойдёт ли что-нибудь.
Ёмкостной трекпад – интересный электронный компонент, расположенный в очень небольшом и универсальном корпусе. Как ни странно, он обладает удивительно большим разрешением 2048 x 1535 x 63 (X x Y x Z) — да-да, 63 уровня чувствительности к нажатию.
Естественно, следующим шагом была настройка подходящего отображения, чтобы соответствовать разрешению потенциометров. Метод map у Arduino позволяет очень быстро решить такую задачу.

Метод pushStick() эмулирует нажатие кнопки, пользуясь тем, что соответствующий контакт на Joy-Con работает по замкнутому циклу.

Итоговый результат работы первого прототипа выглядел многообещающе.
Фаза 4
Ну теперь осталось только взлететь со всей этой ерундой. Следующим шагом я решил сделать боле компактное и портативное решение по сравнению с первым прототипом.
Я решил перейти с Uno на PRO MINI – более мелкую версию, а также сделать печатную плату, которую можно будет расположить рядом со всеми разъёмами и цифровыми потенциометрами. В процессе оптимизации я понял, что можно заменить два одноканальных DAC одним двухканальным, и сэкономить место на плате.
Нарисовал в KiCad новую схему, и тщательно разместил все компоненты.

Фаза 5
Курьер принёс мне всё вовремя – все эти зелёные сокровища и некоторые другие компоненты.


Пришло время пайки.

Проверка мультиметром.

Фаза 6
Pro Mini нужно питание – все миллиамперы я украл прямо с основной платы, со свободной плошадки.

Идея была в том, чтобы приклеить мою плату прямо на заднюю часть Joy-Con при помощи двустороннего скотча, сделать отверстие в пластиковом корпусе и пропустить через него провода.


Фаза 7
У ёмкостного трекпада не было корпуса, поэтому мне пришлось разработать для него корпус. Для таких случаев отлично подходит Tinkercad – добавляем и вычитаем простейшие геометрические фигуры, и задача решается без лишних проблем.

Нарезка на слои при помощи Cura, ждём несколько минут, и 3D-принтер рожает новую деталь.

Подошла идеально с первого раза. Выбранный мною пластик FILOALFA отлично сохранил механические свойства.
Фаза 8
Поскольку Pro Mini питается напрямую от батарейки Joy-Con, я решил добавить переключатель, который может отключать мой имплантат, когда он не используется, экономя немного энергии.

Для безопасности я закрыл всю электронику плёнкой Kapton, чтобы не закоротить её потными руками.

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

В работе:
Что дальше
Планирую дальнейшую миниатюризацию всей схемы, чтобы сделать плату меньшего размера, и разместить её прямо внутри контроллера Joy-Con вместо небольшой коробочки аналогового джойстика размерами в 19×16×4 мм.
И работа уже кипит:

Кэтрин Ньютон надеется на создание фильма «Человек-муравей 4» после провала третьей части
Игры для Steam Deck теперь можно хранить на дискетах
Sidesshow Collectibles открыла предзаказ на статую суперзлодея Красного Омеги из вселенной Marvel
Вышел первый трейлер фильма Такаси Миикэ «Плохой лейтенант: Токио»
Для Splatoon Raiders вышел первый патч с исправлением десятков ошибок
Режиссер Гарет Эдвардс не будет снимать продолжение фильма «Мир Юрского периода: Возрождение», сообщают СМИ
Как Nintendo Switch и Steam Deck разрушили рынок портативных консолей, и почему всех это устраивает
Разработчики ремейка Silent Hill 2 устранили основные проблемы версии для PS5