【後編】ArduBoyを試作する【Gamepad,Speaker】

  • 投稿 : 2020-04-19

前編からの続き

必要なもの・0.96 inch OLED ディスプレイ(SSD1306 128×64 I2C)・LGT8F328P-SSOP20 (Arduino 互換機)・自作ゲームパッド (タクトスイ

お部屋でモバイル

前回は、画面の表示までです。その状態でもゲームの画面を表示することは可能だと思います。今回で完成で、ゲームパットとスピーカーをつけます。ピン配置を変更してるのでソースの変更も必要です。

使用するもの

・0.96 inch OLED ディスプレイ(SSD1306 128×64 I2C)
・LGT8F328P-SSOP20 (Arduino 互換機)
・自作ゲームパッド (タクトスイッチ)
・圧電スピーカー

ArduBoyライブラリの変更

「#ifdef SLIMBOY」を目安に、修正箇所を探すとよいかも。

Arduboy2Core.h

\Arduboy2-master\src\Arduboy2Core.h

3か所修正します。

↓ LED関係のピン番号指定 A5

#ifdef SLIMBOY
#define RED_LED A5   /**< The pin number for the red color in the RGB LED. */
#define GREEN_LED A5 /**< The pin number for the greem color in the RGB LED. */
#define BLUE_LED A5   /**< The pin number for the blue color in the RGB LED. */

#define RED_LED_PORT PORTC
#define RED_LED_BIT PORTC5

#define GREEN_LED_PORT PORTC
#define GREEN_LED_BIT PORTC5

#define BLUE_LED_PORT PORTC
#define BLUE_LED_BIT PORTC5

#else

↑ LED関係のピン番号指定 A5

LED関係。いろいろ変更してみたが、これ以外だとうまく行かないので・・。これでOKだとは思えないが・・。

↓ ゲームパッドのピン番号指定 6 7 2 4 A0 A1

#ifdef SLIMBOY
#define PIN_LEFT_BUTTON 6
#define LEFT_BUTTON_PORT PORTD
#define LEFT_BUTTON_PORTIN PIND
#define LEFT_BUTTON_DDR DDRD
#define LEFT_BUTTON_BIT PORTD6

#define PIN_RIGHT_BUTTON 7
#define RIGHT_BUTTON_PORT PORTD
#define RIGHT_BUTTON_PORTIN PIND
#define RIGHT_BUTTON_DDR DDRD
#define RIGHT_BUTTON_BIT PORTD7

#define PIN_UP_BUTTON 2
#define UP_BUTTON_PORT PORTD
#define UP_BUTTON_PORTIN PIND
#define UP_BUTTON_DDR DDRD
#define UP_BUTTON_BIT PORTD2

#define PIN_DOWN_BUTTON 4
#define DOWN_BUTTON_PORT PORTD
#define DOWN_BUTTON_PORTIN PIND
#define DOWN_BUTTON_DDR DDRD
#define DOWN_BUTTON_BIT PORTD4

#define PIN_A_BUTTON A0
#define A_BUTTON_PORT PORTC
#define A_BUTTON_PORTIN PINC
#define A_BUTTON_DDR DDRC
#define A_BUTTON_BIT PORTC0

#define PIN_B_BUTTON A1
#define B_BUTTON_PORT PORTC
#define B_BUTTON_PORTIN PINC
#define B_BUTTON_DDR DDRC
#define B_BUTTON_BIT PORTC1
#else

↑ ゲームパッドのピン番号指定 6 7 2 4 A0 A1

ゲームパッドのピン配置です。ここを修正すると、Arduboy2Core.cppのほうも修正する必要があります。

↓ スピーカー関係のピン番号 9、17

#ifdef SLIMBOY
#define PIN_SPEAKER_1 9 /**< The pin number of the first lead of the speaker */
#define PIN_SPEAKER_2 17 /**< The pin number of the second lead of the speaker */

#define SPEAKER_1_PORT PORTB
#define SPEAKER_1_DDR DDRB
#define SPEAKER_1_BIT PORTB1

#define SPEAKER_2_PORT PORTC
#define SPEAKER_2_DDR DDRC
#define SPEAKER_2_BIT PORTC3

#else

↑ スピーカー関係のピン番号 9、17

スピーカー関係のピン配置です。

Arduboy2Core.cpp

\Arduboy2-master\src\Arduboy2Core.cpp

ゲームパッドのピン配置関連です。bootPins()関数の部分を変更します。

void Arduboy2Core::bootPins()
{
#ifdef SLIMBOY
  // Port C INPUT_PULLUP
  PORTC |= _BV(A_BUTTON_BIT) |
           _BV(B_BUTTON_BIT);
  DDRC &= ~(_BV(A_BUTTON_BIT) |
	    _BV(B_BUTTON_BIT));

  // Port D INPUT_PULLUP
  PORTD |= _BV(LEFT_BUTTON_BIT) |
           _BV(RIGHT_BUTTON_BIT)  | 
           _BV(UP_BUTTON_BIT)     |
           _BV(DOWN_BUTTON_BIT);
 
  DDRD &= ~(_BV(LEFT_BUTTON_BIT) |
           _BV(RIGHT_BUTTON_BIT)  | 
           _BV(UP_BUTTON_BIT)     |
           _BV(DOWN_BUTTON_BIT));   
#else

LED関係は使わないので、記述からも削除しました。

EEPROM.update 関係

LGT8F328Pというボードは、調べる限りでは、EEPROMをサポートしてないようです。ボードを「Arduino Pro or Pro Mini」にすると、エラーなくコンパイルが通りますが、どうもこの部分が動作してないように思います。

ということで、コメントアウト(コメント化)することにしました。もし必要なら、保存方法を考えて別のロジックにかきかえればよいかと思います。

Arduboy2.cpp(114): //    EEPROM.update(EEPROM_AUDIO_ON_OFF, eeVal);
Arduboy2.cpp(1096): //  EEPROM.update(EEPROM_UNIT_ID, (uint8_t)(id & 0xff));
Arduboy2.cpp(1097): //  EEPROM.update(EEPROM_UNIT_ID + 1, (uint8_t)(id >> 8));
Arduboy2.cpp(1131): //    EEPROM.update(dest, done ? 0x00 : name[src]);
Arduboy2.cpp(1146): //  EEPROM.update(EEPROM_SYS_FLAGS, flags);
Arduboy2.cpp(1159): //  EEPROM.update(EEPROM_SYS_FLAGS, flags);
Arduboy2.cpp(1172): //  EEPROM.update(EEPROM_SYS_FLAGS, flags);
Arduboy2Audio.cpp(46): //  EEPROM.update(EEPROM_AUDIO_ON_OFF, audio_enabled);

上記の8か所をコメントアウトします。

コメントアウト前(修正前)

    EEPROM.update(EEPROM_AUDIO_ON_OFF, eeVal);

コメントアウト(修正後)

//  EEPROM.update(EEPROM_AUDIO_ON_OFF, eeVal);

行頭に「//」をつけると、その部分はコメント扱いになります。

※補足
EEPROM.write()はサポートされてるようなので、 EEPROM.write()に置き換えてやると良いのかも。

コンパイル時のボード指定

今後は、ボードに「LGT8F328P-SSOP20」を指定してコンパイルすることにします。その方がたぶん動作も安定するでしょう。

ゲームパッドの接続

GamepadLGT8F328P
1UP2
2DOWN4
3LEFT6
4RIGHT7
5B BUTTONA1
6A BUTTONA0
7GNDGND

ソース変更とペアーです。両方合わせてください。

ゲームパッドの動作確認

ArduBoy2ライブラリのサンプルスケッチButtonsで動作確認します。

画面中央の文字が、カーソル移動で上下左右、A/Bの端で上下移動します。それで動作確認してください。

スピーカーの接続

SpeakerLGT8F328P
1(+)9
2(-)GND

スピーカーの動作確認

ArduboyTonesライブラリのサンプルスケッチ ArduboyTonesTestを使って動作確認します。

画面の表示に従って。Bボタンなどを押して、音が確かになるかどうかを確認します。

完成したので、ゲームを動かしてみる

picovadershttps://github.com/boochow/picovaders上記から入手して、Arduino IDEで読み込んでコンパイルして書きこみます。

お部屋でモバイル

ちゃんと動作しました

スポンサーリンク