아두이노 나노와 I2C OLED로 신용카드 크기 Arduboy 클론 만들기
부품 및 소모품
| 부품 | 수량 |
| 아두이노 나노 R3 | 1 |
| 그래픽 OLED, 128x64 (I2C) | 1 |
| 부저 | 1 |
| 택타일 스위치 (상단 작동) | 6 |
| RGB 디퓨즈드 공통 캐소드 LED | 1 |
| 저항 221 옴 | 3 |
| 저항 10k 옴 | 1 |
필수 도구 및 장비
프로젝트 개요
Arduboy는 신용카드 크기의 미니어처 게임기입니다. 클래식 8비트 게임이 기본 설치되어 있으며, 온라인에서 오픈소스 게임 라이브러리를 다운로드해 재프로그래밍할 수 있습니다. Arduboy는 오픈소스라 코딩을 배우고 자신만의 게임을 만들 수 있습니다. 원본은 ATmega32U4 마이크로컨트롤러와 128x64 픽셀 직렬 OLED 디스플레이 기반입니다.
아래 소개할 콘솔은 아두이노 나노와 I2C 버전 OLED 디스플레이로 구성되어 있으며, 더 쉽게 구할 수 있고 저렴합니다. 필요한 라이브러리와 코드는 다음에서 다운로드할 수 있습니다:
https://github.com/harbaum/Arduboy2
3D 프린터가 있다면 콘솔을 장착할 수 있는 박스 옵션의 .STL 파일도 다운로드 가능합니다. 자세한 조립 가이드도 같은 사이트에 있습니다. 3.7V 리튬이온 배터리 하나로 구동되며 꽤 잘 작동합니다.
이 콘솔로 많은 게임을 테스트했는데 모두 훌륭하게 작동합니다:
- ArduBreakout
- Pinball
- Shadow-Runner
- Snake
- VIRUS-LQP-79
- Nineteen43
- 그 외 다수...
회로도는 아래에 나와 있습니다. 예제로 ArduBreakout 게임 코드를 제시하지만, 이 콘솔 버전과 호환되는 다른 게임도 Arduboy 사이트에서 다운로드할 수 있습니다.
소스 코드
ArduBreakout 게임
/* Breakout Copyright (C) 2011 Sebastian Goscik
* Modifications by Scott Allen 2016
* GNU Lesser General Public License v2.1 또는 이후 버전
*/
#include <Arduboy2.h>
// EEPROM에 하이스코어 저장용 블록
#define EE_FILE 2
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; // 플레이어가 공을 발사했는지
boolean paused = false;
byte xPaddle; // 패들 X 위치
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();
// 타이틀 화면 루프
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();
// 일시정지 처리
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();
}
// ... (이하 이동, 충돌, 점수, 하이스코어, 사운드 등 전체 게임 로직 구현)
// 전체 코드는 GitHub 저장소 참조: https://github.com/harbaum/Arduboy2
커스텀 파트 및 인클로저
- 3D 프린트 부품:
3d_parts_ThLGvJvWga.rar
회로도
회로도 이미지 참조