クレジットカードサイズのArduboyクローンをArduino NanoとI2C OLEDで自作する
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| グラフィックOLED 128×64(I2C接続) | 1 |
| ブザー | 1 |
| タクトスイッチ(上面操作タイプ) | 6 |
| RGBディフューズドLED(共通カソード) | 1 |
| 抵抗 221Ω | 3 |
| 抵抗 10kΩ | 1 |
必要な工具と機械
- 3Dプリンター(汎用)
- はんだごて(汎用)
プロジェクト概要
Arduboyはクレジットカードサイズのミニチュアゲーム機です。クラシックな8ビットゲームがプリインストールされ、オンラインのオープンソースゲームライブラリから再プログラミング可能です。Arduboyはオープンソースなので、コーディングを学び、自作ゲームを作ることもできます。オリジナル版はATmega32U4マイクロコントローラーと128×64ピクセルのシリアルOLEDディスプレイをベースにしています。
ここで紹介するコンソールは、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ゲーム
/* 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リポジトリの完全なコードを参照してください。
※コード全文は長いため主要部分のみ掲載。完全版はGitHubリポジトリから入手可能です。
カスタムパーツとエンクロージャ
3Dプリント用パーツ: 3d_parts_ThLGvJvWga.rar
回路図
回路図はプロジェクトページに掲載されています。
製造プロセス
- ArduinoとRaspberry Pi 2のI2C連携でIoTセンサープロジェクトを実現
- Arduboyクローンで作る自作携帯ゲーム機 – PCB設計から実装まで
- Arduino UNOとOLEDディスプレイでクラシックPongゲームを自作:ステップバイステップチュートリアル
- Arduino Dueと3.2インチTFTで作る温度監視付きリアルタイムクロック
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- Arduino MegaとNextion HMIで作る高機能ウェザーステーション
- Arduino Nanoとジョイスティックで2軸ステッピングモーターを制御:Visuinoで簡単プログラミング
- ArduinoとNokia 5110ディスプレイで自作電圧計:ステップバイステップガイド
- Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
- Arduino Nanoで作る携帯型ガイガーカウンター
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保