TinyJoyPad
TINY JOYPAD
https://www.tinyjoypad.com/tiny-joypad
回路図もプログラムも公開されているATtiny85で製作されているゲーム機です。魅力的なゲームも公開されてます。
ATtiny85からLGT8F328P(ATmega328)へ
まえから、作ってみたかったのですが、もしかすると、Arduinoでも可能では?と思ってやってみたらうまく行きました。
使用するもの
・0.96 inch OLED ディスプレイ(SSD1306 128×64 I2C)
・LGT8F328P (Arduino 互換機)
・自作ゲームパッド (タクトスイッチ)
・圧電スピーカー
接続図
ATtiny85 =>本来のTinyJoyPadの接続
LGT8F328P =>今回作成するもの
| OLED | LGT8F328P | ATtiny85 | |
| 1 | GND | GND | GND | 
| 2 | VCC | VCC | VCC | 
| 3 | SCL | A5(PC5) | PB2 | 
| 4 | SDA | A4(PC4) | PB0 | 
OLED ディスプレイとの接続。標準的なA5,A4に変更しました。もしピン変更しないのなら、10,8ピンに接続すればライブラリーの修正なしに表示できます(できました)。
| Gamepad | LGT8F328P | ATtiny85 | |
| 1 | UP | 2 | A3 | 
| 2 | DOWN | 4 | A3 | 
| 3 | LEFT | 6 | A0 | 
| 4 | RIGHT | 7 | A0 | 
| 5 | B BUTTON | A1 | - | 
| 6 | A BUTTON | A0 | 1 | 
| 7 | GND | GND | GND | 
ゲームパットの接続。本来のTinyJoyPadは、抵抗を使って1ピンに2つ接続してましたが、今回は、1キー1ピンに変更しました
| Speaker | LGT8F328P | ATtiny85 | |
| 1 | (+) | 9 | 4 | 
| 2 | (-) | GND | GND | 
スピーカーのピンも変更しました。
ライブラリの修正
OLED ディスプレイとの接続のピンを変更したので、それに対応するようにssd1306xledライブラリを変更します。
1つめ
ssd1306xled.h
// -----(+)--------------->	// Vcc,	Pin 1 on SSD1306 Board
// -----(-)--------------->	// GND,	Pin 2 on SSD1306 Board
#ifndef SSD1306_SCL
#define SSD1306_SCL		PB2	// SCL,	Pin 3 on SSD1306 Board
#endif
#ifndef SSD1306_SDA
#define SSD1306_SDA		PB0	// SDA,	Pin 4 on SSD1306 Board
#endif
#ifndef SSD1306_SA
#define SSD1306_SA		0x78	// Slave address
#endif
↑ 修正前
↓ 修正後
// -----(+)--------------->	// Vcc,	Pin 1 on SSD1306 Board
// -----(-)--------------->	// GND,	Pin 2 on SSD1306 Board
#ifndef SSD1306_SCL
#define SSD1306_SCL		PC5	// SCL,	Pin 3 on SSD1306 Board
#endif
#ifndef SSD1306_SDA
#define SSD1306_SDA		PC4	// SDA,	Pin 4 on SSD1306 Board
#endif
#ifndef SSD1306_SA
#define SSD1306_SA		0x78	// Slave address
#endif
2つめ
ssd1306xled.cpp
//original 修正前
//#define DIGITAL_WRITE_HIGH(PORT) PORTB |= (1 << PORT)
//#define DIGITAL_WRITE_LOW(PORT) PORTB &= ~(1 << PORT)
//modified 修正後
#define DIGITAL_WRITE_HIGH(PORT) PORTC |= (1 << PORT)
#define DIGITAL_WRITE_LOW(PORT) PORTC &= ~(1 << PORT)
void SSD1306Device::ssd1306_init(void)
{
//original 修正前
//DDRB |= (1 << SSD1306_SDA);	// Set port as output
//DDRB |= (1 << SSD1306_SCL);	// Set port as output
//modified 修正後
DDRC |= (1 << SSD1306_SDA);	// Set port as output
DDRC |= (1 << SSD1306_SCL);	// Set port as output
ゲーム用のスケッチを修正
ゲームパットの接続ピン、スピーカーのピンは、ゲーム本体(ゲームスケッチ)のほうに書かれてるのでそちらも変更します。こちらは、遊びたいゲーム毎に修正する必要があります。
1つめ
//original 修正前
void setup() {
SSD1306.ssd1306_init();
pinMode(1,INPUT);
pinMode(4,OUTPUT);
pinMode(A0,INPUT); 
pinMode(A3,INPUT);
}
↑ 修正前
↓ 修正後
//modified 修正後
void setup() {
SSD1306.ssd1306_init();
pinMode(9,OUTPUT);
pinMode(2,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
pinMode(7,INPUT_PULLUP); 
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
}
「INPUT」でなくて「INPUT_PULLUP」にすると、抵抗なしに直接ピンを接続できるので便利です。
2つめ
//original 修正前
#define TINYJOYPAD_LEFT  (analogRead(A0)>=750)&&(analogRead(A0)<950)
#define TINYJOYPAD_RIGHT (analogRead(A0)>500)&&(analogRead(A0)<750)
#define TINYJOYPAD_DOWN (analogRead(A3)>=750)&&(analogRead(A3)<950)
#define TINYJOYPAD_UP  (analogRead(A3)>500)&&(analogRead(A3)<750)
#define BUTTON_DOWN (digitalRead(1)==0)
#define BUTTON_UP (digitalRead(1)==1)
↑ 修正前
↓ 修正後
//modified 修正後
#define TINYJOYPAD_LEFT  (digitalRead(6)==0)
#define TINYJOYPAD_RIGHT (digitalRead(7)==0)
#define TINYJOYPAD_DOWN (digitalRead(4)==0)
#define TINYJOYPAD_UP  (digitalRead(2)==0)
#define BUTTON_DOWN (digitalRead(A0)==0)
#define BUTTON_UP (digitalRead(A0)==1)
//sound pin 4=>9
#define digitalWrite(x,y) digitalWrite(x+(x==4)*5,y)
キー判定部分が、#defineで定義されてるので、それを修正します。
スピーカーは、4ピンから9ピンに変更したのですが、直接書き換えるのは面倒なので、「#define digitalWrite(x,y) digitalWrite(x+(x==4)*5,y)」で対応してます。
※注意
一部のゲームは、#defineで定義してなくて、直接書かれてるので、直接その部分を修正する必要があります。ただし、似たようなロジックで変更できます。
ハードウエア部分は・・
SLIMBOY - Arduboy2 port to Arduino Nano and I2C display
https://github.com/harbaum/Arduboy2
これと全く同じ構成です。

