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で定義してなくて、直接書かれてるので、直接その部分を修正する必要があります。ただし、似たようなロジックで変更できます。
ハードウエア部分は・・
ArduBoy・Arduboy https://arduboy.com/Arduboyは、オープンソースのゲーム開発・共有プラットフォームです。本体はクレジットカード大のサイズのゲーム
SLIMBOY - Arduboy2 port to Arduino Nano and I2C display
https://github.com/harbaum/Arduboy2
これと全く同じ構成です。
コメントを残す