# /usr/bin/torunar

Arduinopad: геймпад из портативной консоли

Некоторое время назад досталась мне в подарок консоль Retro Games Controller от китайской компании ThumbsUp.

Девайс был укомплектован двумя сотнями встроенных игр, питался от трех батареек ААА и подключался к телевизору обычными «тюльпанами» — сферическая plug'n'play консоль в вакууме. Сами игры качеством не отличались — из 200 игр годной можно назвать с натяжкой всего одну. Общее представление об устройстве можно составить из этого видео:

Консоли светила участь пылиться на полке, если бы не одно «но»: на удивление удобный контроллер. Решив, что такая годнота пропадать не должна, я начал искать способы подключения ее к ПК.

Поиски спецификации консоли и информации о ее перепрошивке ни к чему не привели — очевидно, никто таким еще не занимался, и я был пионером. Беглый осмотр внутренностей консоли подсказывал, что просто так ее к ПК не подключить — плата представляла из себя кусок текстолита с единственным чипом и контактными площадками под кнопки. Единственным выходом в такой ситуации было использование конвертера, который преобразовал бы аналоговые сигналы от элементов управления в цифровые.

Почитав, как такую задачу решают взрослые солидные дяди с техническим багажом, я решил использовать плату Arduino Leonardo. Основным ее преимуществом было то, что она играет роль human interface device при подключении к ПК — то есть ведет себя как мышь или клавиатура. Вдобавок, этим бы я закрыл давний гештальт сделать что-нибудь на базе Arduino.

Монтаж

Разобрав консоль, я первым делом прозвонил плату мультиметром и разметил, какие кнопки с каким выводами связаны.

Плата

Итого: 8 кнопок (A, B, Reset, Select и четырехпозиционная крестовина) + земля = 9 контактов.

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

Продавцы во всех радиотехнических магазинах либо предлагали мне плоские шлейфы, либо разводили руками. Первоначально я планировал использовать витую пару с экраном для подключения ­— в ней как раз было восемь жил, а экран использовался бы для подключения земли. Однако я решил посовещаться с отцом, радиоинженером со стажем, и он меня от этой мысли отговорил — витая пара с экраном была слишком жесткой и негибкой для геймпадного провода. Он же и подсказал решение: кабель DVI-I, внутри которого 18 контактных жил + земля + экран.

Дербаним провод на жилы и припаиваем к плате:

Дербаним провод на жилы Припаиваем к плате

Конец провода, который будет вставляться в Arduino, тоже дербаним. Т.к. коннектора для шлейфа под рукой не оказалось, то пришлось смакгайверить контакты из скрепок и термоусадки:

Я у мамы инженер

Система в сборе:

Система в сборе

Прошивка

Мало собрать консоль — нужно еще и написать прошивку, с которой она будет работать.

Благо, написать для Arduino Leonardo эмулятор нажатий клавиш — дело плевое. Arduino IDE обладает всей необходимой функиональностью для разработки и заливки прошивки на устройство: это и редактор кода, и компилятор и программатор.

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

За пару часов я набросал максимально простой скетч для платы. Эмулируется нажатие следующих клавиш:

  • Крестовина — стрелки;
  • A — Z;
  • B — X;
  • Reset — Escape;
  • Start — Enter.

Исходный код скетча: https://github.com/torunar/arduinopad

Контроллер в действии