Сборка клона Arduboy размером с кредитную карту: Arduino Nano + I2C OLED
Компоненты и расходные материалы
- Arduino Nano R3 — 1 шт.
- Графический OLED 128x64 (I2C) — 1 шт.
- Зуммер (buzzer) — 1 шт.
- Тактильные кнопки верхнего нажатия — 6 шт.
- RGB светодиод общий катод — 1 шт.
- Резистор 220 Ом — 3 шт.
- Резистор 10 кОм — 1 шт.
Необходимые инструменты и оборудование
- 3D-принтер
- Паяльник
О проекте
Arduboy — миниатюрная игровая система размером с кредитную карту. Изначально оснащена классической 8-битной игрой, перепрограммируется из библиотеки открытых игр. Основана на микроконтроллере ATmega32U4 и OLED-дисплее 128x64. Проект открытый — можно учиться программировать и создавать свои игры.
Представленная ниже консоль построена на Arduino Nano и I2C-версии OLED-дисплея, которые легче найти и дешевле. Необходимые библиотеки и код:
https://github.com/harbaum/Arduboy2
Если есть 3D-принтер, можно напечатать корпус (STL-файлы на том же сайте). Питание — литий-ионный аккумулятор 3.7V, работает отлично.
Протестировано множество игр — все работают отлично:
- ArduBreakout
- Pinball
- Shadow-Runner
- Snake
- VIRUS-LQP-79
- Nineteen43
- и многие другие...
Схема подключения приведена ниже. В качестве примера привожу код игры ArduBreakout, но можно скачать любую совместимую игру с сайта Arduboy.
Код: ArduBreakout Game
/* Breakout Copyright (C) 2011 Sebastian Goscik
* Modifications by Scott Allen 2016
* GNU Lesser General Public License v2.1 or later
*/
#include <Arduboy2.h>
#define EE_FILE 2 // блок EEPROM для хранения рекордов
Arduboy2 arduboy;
BeepPin1 beep;
const unsigned int FRAME_RATE = 40;
const unsigned int COLUMNS = 13;
const unsigned int ROWS = 4;
int dx = -1, dy = -1; // начальное движение мяча
int xb, yb; // позиция мяча
boolean released = false; // мяч выпущен игроком
boolean paused = false; // игра на паузе
byte xPaddle; // позиция ракетки
boolean isHit[ROWS][COLUMNS]; // массив кирпичей
boolean bounced = false; // защита от двойного отскока
byte lives = 3; // жизни
byte level = 1; // уровень
unsigned int score = 0; // счёт
unsigned int brickCount; // сбито кирпичей
boolean pad, pad2, pad3; // буферы кнопок
boolean oldpad, oldpad2, oldpad3;
char text_buffer[16];
boolean start = false; // в меню или в игре
boolean initialDraw = false;
char initials[3]; // инициалы для рекорда
// Границы мяча и кирпичей для коллизий
byte leftBall, rightBall, topBall, bottomBall;
byte leftBrick, rightBrick, topBrick, bottomBrick;
byte tick;
void setup() {
arduboy.begin();
beep.begin();
arduboy.setFrameRate(FRAME_RATE);
arduboy.initRandomSeed();
}
void loop() {
if (!(arduboy.nextFrame())) return;
beep.timer();
// Титр и рекорды до нажатия FIRE
while (!start) {
start = titleScreen();
if (!start) start = displayHighScores(EE_FILE);
}
// Начальная отрисовка уровня
if (!initialDraw) {
arduboy.clear();
level = 1; newLevel(); score = 0; initialDraw = true;
}
if (lives > 0) {
drawPaddle();
// Пауза по FIRE
pad = arduboy.pressed(A_BUTTON) || arduboy.pressed(B_BUTTON);
if (pad && !oldpad && released) { oldpad2 = false; pause(); }
oldpad = pad;
drawBall();
if (brickCount == ROWS * COLUMNS) { level++; newLevel(); }
} else {
drawGameOver();
if (score > 0) enterHighScore(EE_FILE);
arduboy.clear(); initialDraw = false; start = false; lives = 3; newLevel();
}
arduboy.display();
}
// ... (остальные функции: movePaddle, moveBall, drawBall, drawPaddle,
// drawGameOver, pause, Score, newLevel, pollFireButton, displayHighScores,
// titleScreen, enterInitials, enterHighScore, playTone, playToneTimed)
// Полный код доступен в репозитории Arduboy2
3D-модели корпусов
Архив с STL-файлами: 3d_parts_ThLGvJvWga.rar
Схемы
Схемотехнический диаграмм подключения компонентов к Arduino Nano.
Производственный процесс
- Бесшовная I2C-интеграция Arduino и Raspberry Pi 2 для IoT-проектов с датчиками
- Сборка портативной игровой консоли-клона Arduboy на Arduino Micro с проектированием PCB
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Монитор температуры и реальные часы на Arduino Due с TFT-дисплеем 3.2"
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
- Управление двумя шаговыми двигателями через джойстик на Arduino Nano — простой урок (Visuino)
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- Клеточный автомат «Жизнь» Конвея на Arduino Nano с OLED 128x64
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25