DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
Компоненты и материалы
- SparkFun Pro Micro 5V/16MHz (или Arduino Leonardo / любой ATmega32U4) — 1 шт.
- Тактильные кнопки 12 мм — 12 шт.
- Печатная плата (самостоятельная травля, PDF маски в прикрепленных файлах) — 1 шт.
- Резисторы 10 кОм — 12 шт. (подтяжка)
- Перемычки
- Компоненты от UTSOURCE.net (спонсор проекта)
Инструменты
- 3D-принтер (для корпуса)
- Дрель/шуруповерт
- Хлорное железо (для травли платы)
- Паяльник
Программное обеспечение
- Arduino IDE
- Autodesk Fusion 360 (моделирование корпуса)
О проекте
Проект DIY Gaming USB Controller — дешевой USB-геймпад на базе ATmega32U4 с кнопками и (в следующей версии) аналоговыми стиками. Подходит для игр вроде NFS, GTA, Half-Life, Little Fighter 2 и т.д.
Два форм-фактора: V1 — раскладка PS1/SNES (только кнопки), V2 — раскладка Xbox с аналоговыми стиками (в разработке). Здесь описывается V1.
Схема и печатная плата
12 кнопок в pull-down конфигурации к пинам Pro Micro. Схема проверена на макетке, затем спроектирована PCB в OrCad Cadence. Маска верхнего слоя печатается на глянцевой бумаге, переносится утюгом на фольгированный текстолит (метод LUT), травится в хлорном железе, сверлятся отверстия.
Корпус
Корпус спроектирован в Fusion 360 и напечатан на 3D-принтере. Все компоненты устанавливаются внутрь.
Код (загрузка в Pro Micro)
Важно: перед загрузкой тщательно проверьте схему и PCB на прозвонке — ошибки в заземлении вызывают ложные нажатия, что затрудняет перепрошивку.
#include <Keyboard.h>
int WPin = 2; // UP
int SPin = 3; // DOWN
int APin = 4; // LEFT
int DPin = 5; // RIGHT
int UPLpin = 7; // Q (upper left)
int UPRpin = 9; // E (upper right)
int Xpin = 14; // X
int Apin = 10; // I
int Ypin = 15; // Y
int Bpin = 16; // B
void setup() {
pinMode(WPin, INPUT_PULLUP);
pinMode(SPin, INPUT_PULLUP);
pinMode(APin, INPUT_PULLUP);
pinMode(DPin, INPUT_PULLUP);
pinMode(UPLpin, INPUT_PULLUP);
pinMode(UPRpin, INPUT_PULLUP);
pinMode(Xpin, INPUT_PULLUP);
pinMode(Apin, INPUT_PULLUP);
pinMode(Ypin, INPUT_PULLUP);
pinMode(Bpin, INPUT_PULLUP);
Keyboard.begin();
}
void loop() {
if (digitalRead(WPin) == LOW) { Keyboard.write('W'); delayMicroseconds(1); }
if (digitalRead(SPin) == LOW) { Keyboard.write('S'); delayMicroseconds(1); }
if (digitalRead(APin) == LOW) { Keyboard.write('A'); delayMicroseconds(1); }
if (digitalRead(DPin) == LOW) { Keyboard.write('D'); delayMicroseconds(1); }
if (digitalRead(UPLpin) == LOW) { Keyboard.write('q'); delayMicroseconds(1); }
if (digitalRead(UPRpin) == LOW) { Keyboard.write('e'); delayMicroseconds(1); }
if (digitalRead(Xpin) == LOW) { Keyboard.write('x'); delayMicroseconds(1); }
if (digitalRead(Apin) == LOW) { Keyboard.write('i'); delayMicroseconds(1); }
if (digitalRead(Ypin) == LOW) { Keyboard.write('y'); delayMicroseconds(1); }
if (digitalRead(Bpin) == LOW) { Keyboard.write('b'); delayMicroseconds(1); }
}
Тестирование
- Откройте Блокнот, нажимайте кнопки — должны появляться соответствующие символы.
- Или используйте любой онлайн-тестер клавиатуры.
- Если всё работает — запускайте игру и играйте!
Дальнейшие улучшения (V2)
- Добавление аналоговых джойстиков для полноценного управления (как Xbox).
- Новая PCB с раскладкой Xbox One Controller.
Оставайтесь на связи, задавайте вопросы в комментариях!
Производственный процесс
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Tetris на Arduino Nano: самостоятельная сборка 16×8 LED-матрицы на 74HC595
- Умная бутылка для воды на Arduino: мониторинг и напоминания в реальном времени
- Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
- Arduino Home Controller с Alexa: умный дом голосовым управлением
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
- Умная перчатка для перевода жестов в текст (язык жестов)
- 1D Pong на Arduino и ленте WS2812: пошаговое руководство
- Arduino DMX-512 Tester Controller – Полный набор деталей для надежного управления освещением