В данной статье мы рассмотрим изготовление своими руками (DIY) портативной игровой консоли с помощью платы Arduino Pro Micro и пакета Arduboy. Arduboy представляет собой 8-битную программируемую игровую систему размером с кредитную карту, разработанную компанией Nintendo Gameboy. Система разработки игр Arduboy основана на крайне популярной сейчас платформе с открытым исходным кодом под названием Arduino. Система достаточно проста в освоении и позволяет разрабатывать собственные игры и делиться ими с игровым сообществом. Оригинальный игровой пакет Arduboy основан на микроконтроллере ATmega32U4 и OLED дисплее с разрешением 128×64 пикселов. Таким образом, для реализации нашего проекта нам понадобится основанный на Arduino микроконтроллер ATmega32u4 и 6-контактный OLED дисплей с интерфейсом SPI.
Также авторы проекта (ссылка на оригинал в конце статьи) изготовили печатную плату для данного проекта портативной игровой консоли с помощью компании NextPCB, которая уже более 15 лет специализируется на производстве печатных плат. Также данная компания оказывает услуги по поставке компонентов, разработке прототипа печатной платы, контролю качества и многие другие.
Необходимые компоненты
- Плата Arduino Pro Micro (купить на AliExpress).
- OLED дисплей с интерфейсом SPI (купить на AliExpress).
- Тактильные кнопочные переключатели – 6 шт.
- Зуммер (купить на AliExpress).
- Регулятор напряжения 7805 (купить на AliExpress).
- Ползунковый переключатель (Slide Switch) SPDT типа.
- Аккумулятор 18650 – 2 шт.
- Держатель для аккумуляторов 18650.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Схема проекта
Схема портативной игровой консоли на основе платы Arduino и Arduboy представлена на следующем рисунке.
Схема проекта была нарисована в симуляторе EasyEDA. Схема содержит плату Arduino Pro Micro, модуль OLED дисплея с интерфейсом SPI, регулятор напряжения и ряд кнопок.
Схема запитывается от двух элементов 18650, соединенных последовательно. Напряжение на их выходе составляет 7,4 В, поэтому в схеме мы применили регулятор напряжения на основе микросхемы 7805, который понижает это напряжение до значения 5V, необходимого для питания платы Arduino pro micro и других компонентов схемы. Полная схема соединений проекта представлена в следующей таблице.
Arduino pro micro | OLED дисплей |
Vcc | Vcc |
GND | GND |
D15 | SCL |
D16 | SDA |
D4 | DC |
D2 | RES |
Arduino pro micro | Кнопки |
A0 | UP |
A3 | Down |
A1 | Right |
A2 | Left |
D7 | A |
D8 | B |
Arduino pro micro | Зуммер |
D5 | Положительный контакт |
D6 | GND |
Как видите, схема соединений несложная.
Изготовление печатной платы для портативной игровой консоли
Если вы владеете навыками проектирования печатной платы, то вы можете сделать это в любом удобном для себя редакторе.
Но если у вас нет желания заниматься этим, то можете скачать готовые Gerber файлы для изготовления печатной платы данного проекта игровой консоли. Для этого выполните следующую последовательность шагов:
Шаг 1. Перейдите на сайт https://www.nextpcb.com/, зарегистрируйтесь на нем если вы посещаете его в первый раз. На главном экране сервиса нажмите на кнопку ‘Quote now’ (заказать сейчас).
Шаг 2. В следующем открывшемся окне загрузите Gerber фалы вашего проекта и заполните детали, необходимые для изготовления печатной платы: ее размеры, число слоев и число экземпляров печатной платы, которое вам необходимо.
Шаг 3. В следующем окне выберите время изготовления, страну доставки и метод доставки. От последних двух параметров будет зависеть финальная стоимость печатной платы.
На заключительном шаге выполняется финальная проверка (Checkout). На этом этапе сервис NextPCB детально проверяет ваши Gerber файлы на наличие ошибок. И если эта проверка прошла успешно, только тогда вы перенаправляетесь в окно оплаты заказа.
Разумеется, вы можете использовать любой другой сервис изготовления печатных плат, который вам нравится.
Сборка портативной игровой консоли
Авторы проекта получили готовую печатную плату через несколько дней после заказа. Как вы можете видеть из представленных ниже рисунков, качество изготовления печатной платы весьма достойное.
После того, как авторы проекта убедились в том, что все дорожки и посадочные места (footprints) на печатной плате в порядке, они приступили к сборке конструкции проекта. Печатная плата проекта со всеми припаянными к ней компонентами представлена на следующих рисунках:
Разработка программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим основные этапы его создания.
Для того, чтобы иметь возможность играть в игры Arduboy с помощью платы Arduino Pro Micro, мы первым делом должны добавить пакет Arduboy Homemade в Arduino IDE. Этот пакет содержит все библиотеки Arduboy с поддержкой всех альтернативных дисплеев.
Чтобы установить пакет Arduboy откройте Arduino IDE и выберите в ее меню пункт File > Preferences.
Затем скопируйте и вставьте представленный ниже URL в поле Additional Boards Manager URLs и нажмите OK.
https://raw.githubusercontent.com/MrBlinky/Arduboy-homemade-package/master/package_arduboy_homemade_index.json
Затем выберите пункт меню Tools > Boards > Board manager и в текстовом поле наберите там «homemade» или «Arduboy homemade». Затем нажмите на Arduboy Homemade package и затем на кнопку Install.
Таким образом, мы добавили Arduboy package в Arduino IDE и теперь мы можем скачивать и играть в наши любимые Arduboy игры на нашей игровой консоли. Теперь перейдите на официальный сайт платформы и скачайте любую игру Arduboy. После этого откройте файл с расширением .ino из папки с игрой. Затем перейдите в пункт меню Tools и выберите там следующие параметры:
Board: Arduboy
Bootloader: Cathy3K
Core: Arduboy optimized core
После этого выберите порт, к которому подключена плата Arduino micro и нажмите upload.
Тестирование работы проекта
После загрузки кода в плату Arduino и вставления элементов 18650 в конструкцию проекта вы должны увидеть как OLED дисплей начнет показывать заставку (demo) игры. Кнопка A используется для запуска и остановки игры, а кнопка B используется для атаки (Attack).
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#include "Globals.h" #include "Draw.h" #include "Sprites.h" #include "Items.h" itemsManager iM; #include "Animations.h" animationManager aM; #include "Player.h" playerTank pT; #include "Projectiles.h" projectileManager pM; #include "Enemys.h" enemyManager eM; #include "Map.h" mapManager mM; #include "Spawn.h" spawnManager sM; #include "Buttons.h" #include "Checks.h" void setup() { #ifdef USE_SERIAL Serial.begin(57600); Serial.println(F("MicroTank!")); #endif #ifdef ESP8266 ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, false, false); // this function must be called or the esp will crash with the first call arduboy.setExternalButtonsHandler(getButtons); #endif arduboy.begin(); arduboy.setFrameRate(GAME_FRAMES); // some start tone sound.tone(200, 200, 300, 200); arduboy.fillScreen(WHITE); sM.init(); pT.init(); //eM.add(100, 30, ENEMY_MINE, 0); //eM.add(100, 30, ENEMY_ROCKET, 0); //arduboy.display(); //delay(60000); } void playMode() { checkItemsCatch(); checkItemsSpawn(); checkEnemyChrush(); checkProjectiles(); mM.update(); sM.update(); pM.update(); iM.update(); eM.update(); aM.update(); pT.update(); checkSlowmo(); checkSpecialAttack(); } void menuMode() { mM.drawMap(); pT.drawTankShop(); } void playGame() { #ifdef DEBUG_FRAME_TIME uint32_t start = millis(); #endif prepareThings(); updateGameButtons(); if (isPlayMode) { playMode(); } else { menuMode(); } // needs to be after the drawMap pT.drawCornerInfo(); #ifdef DEBUG_FRAME_TIME // pirnt time for a frame to screen arduboy.fillRect(0, 0, 26, 7, BLACK); //drawNumbers(0, 0, millis() - start); //drawNumbers(0, 0, eM.count()); //drawNumbers(0, 0, sM.difficulty); #endif } void loop() { if (!(arduboy.nextFrame())) return; arduboy.pollButtons(); arduboy.fillScreen(WHITE); if (isStartAnimation) { playAnimation(); } else { playGame(); } arduboy.display(); gameFrames++; } |