Как я хакнул контроллер Nintendo Joy-Con

Автор оригинала: Matteo Pisani
  • Перевод

Хирургическая имплантация ёмкостного трекпада с технологией 3D-Touch на место оригинального аналогового джойстика




В 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 мм.

И работа уже кипит:



См. также:

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 17

    +2

    Это восхитительно. Я как пользователь Свича переодически ловящий дрифт, купил бы такую реализацию, пусть даже джойконы разряжались бы в два раза быстрее. Отличная работа.


    Простите, пишу комментарием так как не могу поставить плюс, нет кармы.

      0

      Не дрифт, а дрейф.

      0

      Плёнка Kapton — это обычный каптоновый скотч, не?

      +1
      Я офигел, когда он прочитал, что парень заменил два ЦАПа одним сдвоенным, чтобы сэкономить место, но поставил Arduino Pro Mini. К счастью, это оказался прототип.

      И с его «любимым производителем печатных плат» у него видимо очень хорошие отношения — он заказал трафарет для нанесения паяльной пасты для прототипа устройства, который будет сделан в одном экземпляре и содержит всего 5 компонентов.
        +1
        Идея очень классная, но реализация конечно… Как всегда без огромной ардуины никуда. Это делается на одном самом дешевом чипе stm32 в котором уже есть 2х канальный цап. И еще я уверен, что в разъеме для стика есть питание как минимум 3.3v, без питания переменные резисторы работать не будут.
          0

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

            0
            Не факт, что оно ограничено по току чем-то кроме сопротивления самого джойстика. Но даже если и так, можно использовать транзистор для управления питанием. Или найти другую такую точку, где питание появляется при включении джойкона и исчезает при выключении и его достаточно для управления транзистором…
            0
            Даже со входами для емкостных кнопок есть, для которых можно круглую плату сенсора развести. Но всё равно в целом это кривой костыль и весь «хак» заключается в механической замене одного пассивного компонента целым ворохом соплей. Настоящим хаком был бы совместимый контроллер, разработанный с нуля.
            0
            Интересно будет почитать как делали платы в KiCad
              0

              Гугл полон мануалов. Прекрасная среда. Сейчас дорисовываю свою версию Nixie clock.

              0
              На последнем видео заметен инпут лаг при калибровке. У оригинала он тоже есть?
                0

                Почему левый стик, а не правый для прицеливания?

                  0

                  Мне кажется это потому, что левый ломается чаще.

                  0

                  Насколько этот joycon удобен в плане эргономичности?

                    0

                    Очень сильное колдунство

                      0
                      Осталось только придумать джойконы, которые будут общаться с клавиатурой и мышкой по bluetooth. Ну или можно вкорячить в них небольшой дисплей, чтобы играть в doom на джойконе, пока ждёшь загрузку игры на свиче.

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

                      Самое читаемое