Блог товарища Nihirash

22.04.2018

Джойстик Atari CX40 и правильно примененная Ардуинка

Собственно, из Америки джойстик(клон от Retrobits) так и не дошел уйдя в никуда - купил с рук в Москве, но купил не просто, а оригинальный Atari CX40.

На спектруме он работает как часы(в kempston-порт и предполагалось подключать такие джойстики), но меня внезапно посетила мысль о том, что у меня лежит без дела Arduino Leonardo, а его можно использовать как USB-HID устройство, собственно с его помощью я подключил к компьютеру джойстик от Atari.

Что нам требуется?

  1. Сам джойстик
  2. DB9-male разъем
  3. Arduino Leonardo(Амперка Iskra Neo и возможно еще какой либо клон), либо Arudino Micro
  4. Вот эта библиотека
  5. Немного терпения

Собственно, документация в библиотеке исчерпывающая - но кому лень читать на английском могут прочитать краткий гайд.

  • Устанавливаете Arduino Ide свежей версии.
  • Скачиваете библиотеку с ссылки, указанной выше и запускаете файл deploy(если у вас Windows- deploy.bat, иначе - deploy.sh) - это установит библиотеку в вашу систему.
  • Подключаете к Arduino гнездо под джойстик. Описание контактов гнезда есть на wiki. Землю к земле, а куда я подключил направления - можно прочитать в исходном коде.
  • Создаете скетч по следующим кодом:
#include <Joystick.h>
/**
 * Ничего не умеем, только 2 оси и одна кнопка
 */
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 1, 0, true, true, false, false, false, false, false, false, false, false, false);

/**
 * У меня подключен стандартный джойстик от атари:
 * 13 - вверх
 * 12 - вниз
 * 11 - влево
 * 10 - вправо
 * 9 - кнопка
 */
void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(13, INPUT_PULLUP);
  Joystick.begin();
  /**
   * Отцентрирую сразу, иначе нужно джойстиком по обеим осям руками подвигать, чтобы работал ровно
   */
  Joystick.setXAxis(511);
  Joystick.setYAxis(511);
}

const int pinToButtonMap = 9;
int lastButtonState[5] = {0, 0, 0, 0, 0};

void loop() {
  for (int index = 0; index < 5; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
        switch (index) 
        {
          case 0: 
            Joystick.setButton(0, currentButtonState);
            break;
          case 1:
            Joystick.setXAxis(currentButtonState ? 1023 : 511);
            break;
          case 2:
            Joystick.setXAxis(currentButtonState ? 0 : 511);
            break;
          case 3:
            Joystick.setYAxis(currentButtonState ? 1023 : 511);
            break;
          case 4:
            Joystick.setYAxis(currentButtonState ? 0 : 511);
            break;
        }
      
      lastButtonState[index] = currentButtonState;
    }
  }
}

Компилируем, и...в вашей системе уже появилось игровое устройство "Arduino Leonardo".

Если хочется переименовать имя устройства, то в папке, где установлена ваша среда для разработки под Arduino ищем путь hardware/arduino/avr и там файл boards.txt.

Вот в этом файле ищем строку, которая начинается на leonardo.build.usb_product= и в кавычки прописываем свое название устройства.