Arduboy 互換機 (Arduboy Clone)

Arduboy 互換機を作ってみました。



部品購入

いきなりですが完成品です (3.3V 版 / 5V 版)。

Arduboy 互換機を作るのに必要な部品は以下の通りです。

用途 部品名
メインボード Pro Micro
ディスプレイ 0.96 inch OLED ディスプレイ (SPI)
筐体 GAME POKE MIX
乾電池駆動 昇圧 DCDC コンバータ
電源スイッチ (任意) スライドスイッチ
3色 LED (任意) 3色 LED, 抵抗

Pro MicroOLED に関しては詳細な別記事があるのでそちらにも目を通しておいてください。

GAME POKE MIX は元々クレーンゲームのプライズだったようです。探せば 250 円前後で入手できます。品番は HAC5788、JAN コードは 4580278047878 です。クレーンゲームのプライズなので、未開封新品でも中古として売られているかもしれません。POP Station (SY-3040) と同じ物のようですね。

GAME POKE MIX は筐体として最適で、0.96 inch OLED が丁度収まりますし(要加工)、電池 BOX とスイッチも手に入ります。スピーカー (圧電素子) も付いているので、Arduboy 互換機を作るにはうってつけです。 唯一残念なのは、右側の 4 つあるように見えるボタンは実は 1 個で、どれを押しても同じという点です (これ以外のボタンはすべて独立しています)。

昇圧 DCDC コンバータは乾電池駆動のために必要です。また、5V 版と 3.3V 版、どちらの Pro MicroArduboy 互換機を作るかが重要になってきます。5V 版で作るとオリジナルと同じ動作になりますが電池の持ちは悪いです。3.3V 版で作ると電池は持ちますが、ゲーム速度が遅くなります (後述しますがスケッチの転送にもコツが必要です)。特に理由がなければ 5V 版を作るのがいいでしょうね。

スライドスイッチは小さめのものがいいでしょう。

3色 LED ですが、私は実装しませんでした。5mm の LED はこの筐体には少々大きいのです (入れられない事はありませんが...)。

部品代は全部で 2,000円弱といった所でしょうか?



各部詳細

ボタンのアサインなど外観の詳細です。


配線は以下のようになっています。


左上の部品は昇圧 DCDC コンバータです。ボタンは GAME POKE MIX の基板から配線を引き出しています。

ピンアサインは以下のようになっています。

Function Definition Arduboy Clone
LED R RED_LED 10 (NC)
LED G GREEN_LED 11 (NC)
LED B BLUE_LED 9 (NC)
LED TX TX_LED / LED_BUILTIN_TX 30 24
LED RX RX_LED / LED_BUILTIN_RX 17 17
Button UP UP_BUTTON A0 A0
Button DOWN DOWN_BUTTON A3 A3
Button LEFT LEFT_BUTTON A2 A2
Button RIGHT RIGHT_BUTTON A1 A1
Button A A_BUTTON 7 7
Button B B_BUTTON 8 8
Button C (NC) 14
Reset RESET RESET
Speaker 1 PIN_SPEAKER_1 5 5
Speaker 2 PIN_SPEAKER_2 13 (NC)
Display Reset RST 6 6
Display D/C DC 4 4
Display SPI CS CS 12 2
Display SPI SCLK (CLK) PIN_SPI_SCK / SCK 15 (SCK) 15 (SCK)
Display SPI Data In (MOSI) PIN_SPI_MOSI / MOSI 16 (MOSI) 16 (MOSI)
Battery Box (+) RAW
Battery Box (-) GND

ケースに余裕があれば (GAME POKE MIX 筐体を使わないのなら) Da Vinci 32U や Arduino Micro を使うといいでしょう...ライブラリの修正が必要なくなりますので。

3色 LED を実装したいのなら、以下の配線も行ってください。

Function Definition Arduboy Clone
LED R RED_LED 10 10
LED G GREEN_LED 11 3
LED B BLUE_LED 9 9

Arduboy3 色 LED は PWM を要求しますので、ピンアサインを変える場合には注意してください。また、適切な抵抗を付けるのをお忘れなく。

See Also:



セットアップ

使い方は Arduboy ともちろん同じなので、事前にArduboy ライブラリを導入しておく必要があります。

ライブラリの修正 (Arduboy Library 1.1)

Arduboy Library 1.1 の場合には core.h を書き換える必要があります。ライブラリマネージャで追加した場合、ライブラリは "%HOMEPATH%\Documents\Arduino\libraries" 以下に格納されていると思います ([ファイル | 環境設定] の "スケッチブックの保存先" を確認してください)。

#ifdef ARDUBOY_10

#define CS 2
#define DC 4
#define RST 6

#define RED_LED 10
#define GREEN_LED 3
#define BLUE_LED 9
#define TX_LED 24
#define RX_LED 17

  ...

#define PIN_SPEAKER_1 5
#define PIN_SPEAKER_2 5

ライブラリの修正 (Arduboy Library 2)

Arduboy Library 2 なら Arduboy2Core.h を書き換える必要があります。ライブラリマネージャで追加した場合、ライブラリは "%HOMEPATH%\Documents\Arduino\libraries" 以下に格納されていると思います ([ファイル | 環境設定] の "スケッチブックの保存先" を確認してください)。

// ----- Arduboy pins -----
#ifdef ARDUBOY_10

#define PIN_CS 2        // Display CS Arduino pin number
#define CS_PORT PORTD   // Display CS port
#define CS_BIT PORTD6   // Display CS physical bit number

#define PIN_DC 4        // Display D/C Arduino pin number
#define DC_PORT PORTD   // Display D/C port
#define DC_BIT PORTD4   // Display D/C physical bit number

#define PIN_RST 6       // Display reset Arduino pin number
#define RST_PORT PORTD  // Display reset port
#define RST_BIT PORTD7  // Display reset physical bit number

  ...

#define RED_LED 10   /**< The pin number for the red color in the RGB LED. */
#define GREEN_LED 3 /**< The pin number for the greem color in the RGB LED. */
#define BLUE_LED 9   /**< The pin number for the blue color in the RGB LED. */

ライブラリの修正 (TEAM a.r.g. のゲーム)

TEAM a.r.g. のゲームの場合には、Arglib.h を書き換える必要があります。

#ifdef AB_DEVKIT
#define CS 6
#define DC 4
#define RST 12
#else
#define CS 2
#define DC 4
#define RST 6
#endif

修正は主に OLED のピンアサイン変更によるものです。

スケッチの転送

スケッチ転送の際にはスイッチを OFF にするか、電池を抜いて USB ケーブルを接続します。Pro Micro のボードを追加していなければボードマネージャから追加しておきます。スケッチの転送で、ちょっとしたコツがいる場合があります。

See Also:



セットアップ (その2)

Arduboy の本物と互換機の両方を持っているとライブラリの管理が面倒になります。条件コンパイルできるように環境を構築しましょう。

クローンボードの追加

IDE にクローンボードを追加します。

  1. Pro Micro のボードを追加していなければボードマネージャから追加しておきます。
  2. Arduboy のボードを追加していればボードマネージャから削除しておきます。
  3. Pro Micro の boards.txt を開きます。デフォルトでは %LOCALAPPDATA%\Arduino15\packages\SparkFun 以下にあるハズです。
  4. Arduboy 用の定義を追加します。
    ##############################################################
    ######################### Arduboy ############################
    ##############################################################
    
    arduboy.name=Arduboy
    
    arduboy.upload.tool=arduino:avrdude
    arduboy.upload.protocol=avr109
    arduboy.upload.maximum_size=28672
    arduboy.upload.maximum_data_size=2560
    arduboy.upload.speed=57600
    arduboy.upload.disable_flushing=true
    arduboy.upload.use_1200bps_touch=true
    arduboy.upload.wait_for_upload_port=true
    
    arduboy.bootloader.tool=arduino:avrdude
    arduboy.bootloader.low_fuses=0xff
    arduboy.bootloader.high_fuses=0xd8
    arduboy.bootloader.extended_fuses=0xcb
    arduboy.bootloader.unlock_bits=0x3F
    arduboy.bootloader.lock_bits=0x2F
    
    arduboy.build.mcu=atmega32u4
    arduboy.build.f_cpu=16000000L
    arduboy.build.vid=0x2341
    arduboy.build.pid=0x8036
    arduboy.build.usb_product="Arduboy"
    arduboy.build.board=AVR_ARDUBOY
    arduboy.build.core=arduino:arduino
    arduboy.build.variant=arduino:leonardo
    arduboy.build.extra_flags=-DARDUBOY_10 {build.usb_flags}
    
    ##############################################################
    ###################### Arduboy Clone #########################
    ##############################################################
    
    arduboy_clone.name=Arduboy Clone
    
    arduboy_clone.upload.tool=avrdude
    arduboy_clone.upload.protocol=avr109
    arduboy_clone.upload.maximum_size=28672
    arduboy_clone.upload.maximum_data_size=2560
    arduboy_clone.upload.speed=57600
    arduboy_clone.upload.disable_flushing=true
    arduboy_clone.upload.use_1200bps_touch=true
    arduboy_clone.upload.wait_for_upload_port=true
    
    arduboy_clone.bootloader.tool=avrdude
    arduboy_clone.bootloader.unlock_bits=0x3F
    arduboy_clone.bootloader.lock_bits=0x2F
    arduboy_clone.bootloader.low_fuses=0xFF
    arduboy_clone.bootloader.high_fuses=0xD8
    
    arduboy_clone.build.board=AVR_PROMICRO
    arduboy_clone.build.core=arduino:arduino
    arduboy_clone.build.variant=promicro
    arduboy_clone.build.mcu=atmega32u4
    arduboy_clone.build.usb_product="Arduboy Clone"
    arduboy_clone.build.vid=0x1b4f
    arduboy_clone.build.extra_flags=-DARDUBOY_CLONE {build.usb_flags}
    
    ############### Arduboy Clone 5V / 16MHz #####################
    
    arduboy_clone.menu.cpu.16MHzatmega32U4=ATmega32U4 (5V, 16 MHz)
    
    arduboy_clone.menu.cpu.16MHzatmega32U4.build.pid.0=0x9205
    arduboy_clone.menu.cpu.16MHzatmega32U4.build.pid.1=0x9206
    arduboy_clone.menu.cpu.16MHzatmega32U4.build.pid=0x9206
    arduboy_clone.menu.cpu.16MHzatmega32U4.build.f_cpu=16000000L
    arduboy_clone.menu.cpu.16MHzatmega32U4.build.extra_flags=-DARDUBOY_CLONE {build.usb_flags}
    
    arduboy_clone.menu.cpu.16MHzatmega32U4.bootloader.extended_fuses=0xCB
    arduboy_clone.menu.cpu.16MHzatmega32U4.bootloader.file=caterina/Caterina-promicro16.hex
    
    ############### Arduboy Clone 3.3V / 8MHz ####################
    
    arduboy_clone.menu.cpu.8MHzatmega32U4=ATmega32U4 (3.3V, 8 MHz)
    
    arduboy_clone.menu.cpu.8MHzatmega32U4.build.pid.0=0x9203
    arduboy_clone.menu.cpu.8MHzatmega32U4.build.pid.1=0x9204
    arduboy_clone.menu.cpu.8MHzatmega32U4.build.pid=0x9204
    arduboy_clone.menu.cpu.8MHzatmega32U4.build.f_cpu=8000000L
    arduboy_clone.menu.cpu.8MHzatmega32U4.build.extra_flags=-DARDUBOY_CLONE -DARDUBOY_SET_CPU_8MHZ {build.usb_flags}
    
    arduboy_clone.menu.cpu.8MHzatmega32U4.bootloader.extended_fuses=0xFE
    arduboy_clone.menu.cpu.8MHzatmega32U4.bootloader.file=caterina/Caterina-promicro8.hex
    
    ##############################################################
    ##################### Arduboy Dev Kit ########################
    ##############################################################
    
    arduboy_devkit.name=Arduboy DevKit
    
    arduboy_devkit.upload.tool=arduino:avrdude
    arduboy_devkit.upload.protocol=avr109
    arduboy_devkit.upload.maximum_size=28672
    arduboy_devkit.upload.maximum_data_size=2560
    arduboy_devkit.upload.speed=57600
    arduboy_devkit.upload.disable_flushing=true
    arduboy_devkit.upload.use_1200bps_touch=true
    arduboy_devkit.upload.wait_for_upload_port=true
    
    arduboy_devkit.bootloader.tool=arduino:avrdude
    arduboy_devkit.bootloader.low_fuses=0xff
    arduboy_devkit.bootloader.high_fuses=0xd8
    arduboy_devkit.bootloader.extended_fuses=0xcb
    arduboy_devkit.bootloader.unlock_bits=0x3F
    arduboy_devkit.bootloader.lock_bits=0x2F
    
    arduboy_devkit.build.mcu=atmega32u4
    arduboy_devkit.build.f_cpu=16000000L
    arduboy_devkit.build.vid=0x2341
    arduboy_devkit.build.pid=0x8036
    arduboy_devkit.build.usb_product="Arduboy DevKit"
    arduboy_devkit.build.board=AVR_ARDUBOY_DEVKIT
    arduboy_devkit.build.core=arduino:arduino
    arduboy_devkit.build.variant=arduino:leonardo
    arduboy_devkit.build.extra_flags=-DAB_DEVKIT {build.usb_flags}
    
  5. Arduino IDE を再起動すると Arduino / Arduboy Clone / Arduboy DevKit というボードが出てきます。

ライブラリの修正 (Arduboy Library 1.1)

core.h に 赤字の部分を追記します。ライブラリマネージャで追加した場合、ライブラリは "%HOMEPATH%\Documents\Arduino\libraries" 以下に格納されていると思います ([ファイル | 環境設定] の "スケッチブックの保存先" を確認してください)。


#define PIN_SPEAKER_1_BITMASK _BV(5)
#define PIN_SPEAKER_2_BITMASK _BV(4)

#endif


#if defined(ARDUBOY_CLONE)

#define CS 2
#define GREEN_LED 3
#define TX_LED 24
#define PIN_SPEAKER_2 5

#endif


// OLED hardware (SSD1306)

#define OLED_PIXELS_INVERTED 0xA7 // All pixels inverted
#define OLED_PIXELS_NORMAL 0xA6 // All pixels normal

ライブラリの修正 (Arduboy Library 2)

Arduboy2Core.h に 赤字の部分を追記します。ライブラリマネージャで追加した場合、ライブラリは "%HOMEPATH%\Documents\Arduino\libraries" 以下に格納されていると思います ([ファイル | 環境設定] の "スケッチブックの保存先" を確認してください)。

#define RAND_SEED_IN_PORTF
#define RAND_SEED_IN_BIT PORTF1
// Value for ADMUX to read the random seed pin: 2.56V reference, ADC1
#define RAND_SEED_IN_ADMUX (_BV(REFS0) | _BV(REFS1) | _BV(MUX0))

#endif

// ----- Arduboy Clone pins -----
#ifdef defined(ARDUBOY_CLONE)

#define PIN_CS 2        // Display CS Arduino pin number
#define GREEN_LED 3  /**< The pin number for the greem color in the RGB LED. */

#endif
// -----------------------


// --------------------

// OLED hardware (SSD1306)

#define OLED_PIXELS_INVERTED 0xA7 // All pixels inverted
#define OLED_PIXELS_NORMAL 0xA6 // All pixels normal

ライブラリの修正 (TEAM a.r.g. のゲーム)

TEAM a.r.g. のゲームの場合には、Arglib.h に赤字の部分を追記します。

#ifdef AB_DEVKIT
#define CS 6
#define DC 4
#define RST 12
#else
#define CS 12
#define DC 4
#define RST 6
#endif

#ifdef defined(ARDUBOY_CLONE)

#define CS 2

#endif

// compare Vcc to 1.1 bandgap
#define ADC_VOLTAGE _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1)

これで条件コンパイルできるようになりました。

Arduboy Clone を選んだ時はプロセッサで 5V / 3.3V を選ぶ事もできます。



ギャラリー

GAME POKE MIX の広告です。360個 (または 180個) 単位で仕入れる必要があるようですね (w

オリジナルの状態の GAME POKE MIX です。LCD ゲーム機です。

分解した状態です。

LCD 固定枠を少し削ると OLED をはめ込めます。GAME POKE MIX のプラスチックは硬い (= 割れやすい) ので注意。ネジ穴もすぐに割れてしまい、バカ穴になってしまいます。OLED のピンヘッダは最終的には取り払っています。OLED の固定はホットボンドで行っています。

元々のゲームチップは不要なので、金切狭でカットし、ここへ Pro Micro を入れます。


ボタンはパターンを追って信号線を引き出しておきます。赤はパターンカット (要テスター確認)、水色は GND です (すべて結線)。左上の灰色のボタンだけは変な所から信号線を引き出す必要があります。パターンカットはPカッターでやると簡単です。紙やすりで削ってそこへジュンフロン線をハンダするのですが、フラックスがあるとハンダの乗りがいいです。

最終的な内部の構造はこんな感じになります。黄色のカプトンテープのトコは電源用スライドスイッチ取り付け用です。カプトンテープは OLEDPro Micro の絶縁にも使っています。

スライドスイッチを取り付けた様子です。これにて完成!

実際に動作している様子はこちら。プレイしているのは TEAM a.r.g. の Sirène

See Also:



5V 版作成時の Togetter まとめ


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: