TinyJoyPadをArduino nanoで実現する

  • 投稿 : 2020-04-22

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 LGT8F328PATtiny85
1GNDGNDGND
2VCCVCCVCC
3SCLA5(PC5)PB2
4SDAA4(PC4)PB0

OLED ディスプレイとの接続。標準的なA5,A4に変更しました。もしピン変更しないのなら、10,8ピンに接続すればライブラリーの修正なしに表示できます(できました)。

GamepadLGT8F328PATtiny85
1UP2A3
2DOWN4A3
3LEFT6A0
4RIGHT7A0
5B BUTTONA1-
6A BUTTONA01
7GNDGNDGND

ゲームパットの接続。本来のTinyJoyPadは、抵抗を使って1ピンに2つ接続してましたが、今回は、1キー1ピンに変更しました

SpeakerLGT8F328PATtiny85
1(+)94
2(-)GNDGND

スピーカーのピンも変更しました。

ライブラリの修正

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で定義してなくて、直接書かれてるので、直接その部分を修正する必要があります。ただし、似たようなロジックで変更できます。

ハードウエア部分は・・

ArduBoy・Arduboy https://arduboy.com/Arduboyは、オープンソースのゲーム開発・共有プラットフォームです。本体はクレジットカード大のサイズのゲーム

某氏の猫空

SLIMBOY - Arduboy2 port to Arduino Nano and I2C display
https://github.com/harbaum/Arduboy2

これと全く同じ構成です。

スポンサーリンク