Аркадный игровой автомат

Мы уже рассказывали о том, как сделать игровую приставку в стиле «лихих 90-х» на базе Raspberry Pi. Настало время прокачать эту идею и собрать настоящий игровой автомат, который составит достойную конкуренцию «Капитану Крюку».

Видеообзор

Что понадобится?

Как это работает?

В основе игрового аппарата - Raspberry Pi. На ней установлен образ Retro Pie, который служит для эмуляции старых консолей.

Среди разнообразия образов таких игр, они называются ROM-ами, мы нашли версию Battle Citty для игровых автоматов. Основное отличие такого образа от привычных «Танчиков» в том, что для запуска игры нужно кинуть монетку в монетоприемник. Только после этого эмулятор запустит игру.

Изображение мы выведем на кинескоп старого телевизора. Для управления используем пару Iskra Neo — они будут считывать сигналы с NES-овских джойстиков и посылать их на Raspberry по USB.

Как собрать джойстик?

Пультом управления будут старые джойстики от NES. Такие до сих пор можно найти в магазинах видеоигр. Чтобы разобрать джойстик, нужно открутить 4 винта с обратной стороны корпуса.

Внутри плата с контактными площадками и контроллер обрабатывающий нажатия.

Чтобы не расшифровывать данные с чипа, можно подпаяться к площадкам напрямую и передавать сигнал о нажатии каждой клавиши

Другие концы проводов прикручиваются в клеммники Screw Shield установленного на Iskra Neo.

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

Исходный код

Прошейте плату Iskra Neo кодом программы.

keyboard.ino
// Подключаем библиотеки для эмуляции HID устройств
#include "Keyboard.h"
#include "Mouse.h"
 
// Укажем пины к которым подключены кнопки джойстика
const int upButton = 2;
const int downButton = 3;
const int leftButton = 4;
const int rightButton = 5;
const int fireButton = 6;
const int startButton = 8;
const int selectButton = 9;
 
void setup() {
// Инициализируем пины на вход с притяжкой к плюсу
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(startButton, INPUT_PULLUP);
  pinMode(fireButton, INPUT_PULLUP);
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(leftButton, INPUT_PULLUP);
  pinMode(rightButton, INPUT_PULLUP);
  Keyboard.begin();
}
void loop() {
  // Если нажата кнопка вверх− эмулируем нажатие клавиши ↑.
  if (digitalRead(upButton) == LOW) {
    Keyboard.press(0xDA);
  } else {
    Keyboard.release(0xDA);
  }
  // Если нажата кнопка вниз− эмулируем нажатие клавиши ↓.
  if (digitalRead(downButton) == LOW) {
    Keyboard.press(0xD9);
  }else {
    Keyboard.release(0xD9);
  }
  // Если нажата кнопка влево− эмулируем нажатие клавиши ←.
  if (digitalRead(leftButton) == LOW) {
    Keyboard.press(0xD8);
  }else {
    Keyboard.release(0xD8);
  }
  // Если нажата кнопка вправо− эмулируем нажатие клавиши →.
  if (digitalRead(rightButton) == LOW) {
    Keyboard.press(0xD7);
  }else {
    Keyboard.release(0xD7);
  }
  // Если нажата кнопка выстрела− эмулируем нажатие клавиши 'x'.
  if (digitalRead(fireButton) == LOW) {
    Keyboard.press("x");
  }else {
    Keyboard.release("x");
  }
}

Подключение к телевизору

Перед тем, как вывести изображение через коаксиальный видеовыход, его нужно активировать. Для этого на SD-шке с образом откройте файл config и раскомментируйте строки удалив символ #

#hdmi_force_hotplug=1
#sdtv_mode=2

Подключив телевизор через коаксиальный кабель, можно вывести изображение на кинескоп.

Сборка корпуса

Для боковых стенок подойдет лист фанеры толщиной 12 мм. Такой толщины хватит для придания необходимой жесткости корпуса автомата. Конечно можно вырезать детали электролобзиком, но проще сделать это на ЧПУ станке по готовым файлам для резки.

Ниже приведен эскиз векторного файла боковых стенок для резки на станке ЧПУ.

Остальные элементы можно вырезать из фанеры потоньше. 8-9 мм будет в самый раз. Эти детали будут крепится между боковыми стенками.

На корпусе предусмотрены смотровые окна, через которые будет видна электронная начинка автомата. В лицевых панелях сделаны отверстия для экрана телевизора и установки монетоприёмника. Смотровые окна нужно закрыть прозрачным акрилом. Этот материал отлично режется лазерным плоттером.

Детали корпуса удобно соединять с помощью деревянных реек и межсекционных стяжек. В результате получится надежная и прочная конструкция, которую не сложно разобрать для хранения или транспортировки. Осталось закрепить телевизор и покрасить корпус.

Подсветка

Для подсветки подойдут цветные адресуемые светодиодные плашки WS2811. Как и адресные ленты, каждая такая плашка может загораться всеми цветами радуги. Для игрового автомата это самое то!

Для питания плашек нужен мощный блок питания. Блок на 12 Вольт и 6 Ампер подойдет в самый раз. К этому же блоку подключится и монетоприемник, которому для работы нужны те же 12 Вольт.

Для управления подсветкой понадобится WiFi Slot. Можно взять другой контроллер, но здесь уже есть слоты для тройка модулей и не придётся возиться со шлейфами и переходниками. Перед сборкой цепи, прошейте плату примером из библиотеки Neopixel.

Через драйвер светодиодных лент управляющая плата получает питание и отправляет данные на светодиодные секции для изменения цвета и яркости их свечения.

Настройка Retropie

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

При первом запуске система просит подключить устройство ввода. Подключив клавиатуру нужно нажать и удерживать пару секунд любую клавишу, чтобы обнаружить её.

После этого можно приступать к назначению кнопок джойстика на клавиши клавиатуры.

Управления вверх, вниз, влево и вправо назначим на стрелки. Select назначим на клавишу x. Кнопки джойстика А и В назначим на клавиши с и v. Чтобы пропустить пункты назначения кнопок которые не будут использоваться нужно несколько секунд удерживать зажатой любую клавишу клавиатуры. В конце назначим кнопке Hot key клавишу клавиатуры e и подтвердим назначения клавишей с.

Соберем всё воедино

Разместите все компоненты в корпусе и подключите как показано на рисунке Для работы монетоприёмника, пин к которому он подключается, нужно притянуть к земле. Сделать это можно резистором на 10 кОм.