Pro Micro と OLED に関しては詳細な別記事があるのでそちらにも目を通しておいてください。
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 Micro で Arduboy 互換機を作るかが重要になってきます。5V 版で作るとオリジナルと同じ動作になりますが電池の持ちは悪いです。3.3V 版で作ると電池は持ちますが、ゲーム速度が遅くなります (後述しますがスケッチの転送にもコツが必要です)。特に理由がなければ 5V 版を作るのがいいでしょうね。
スライドスイッ チは小さめのものがいいでしょう。
3色 LED ですが、私は実装しませんでした。5mm の LED はこの筐体には少々大きいのです (入れられない事はありませんが...)。
部品代は全部で 2,000円弱といった所でしょうか?
今、作るなら...?
今作るなら、Pro Micro ではなく Adafruit Itsy Bitsy 32u4 を使う事をオススメします。
こちらは Pro Micro と違い、D11~D13 及び A4 / A5 も使えるため、(後述しますが) ライブラリの改変が必要ありません 。基板サイズも Pro Micro よりわずかに 3mm 長いだけです。
Pro Micro のクローンと比べるとちょっと高めなので...お財布と要相談ですね。
各部詳細
ボタンのアサインなど外観の詳細です。
配線は以下のようになっています。
左上の部品は昇圧 DCDC コンバータです。ボタンは GAME POKE MIX の基板から配線を引き出しています。
ピンアサインは以下のようになっています。
RED_LED
10
(NC)
GREEN_LED
11
(NC)
BLUE_LED
9
(NC)
TX_LED / LED_BUILTIN_TX
30
24
RX_LED / LED_BUILTIN_RX
17
17
UP_BUTTON
A0
A0
DOWN_BUTTON
A3
A3
LEFT_BUTTON
A2
A2
RIGHT_BUTTON
A1
A1
A_BUTTON
7
7
B_BUTTON
8
8
(NC)
14
RESET
RESET
PIN_SPEAKER_1
5
5
PIN_SPEAKER_2
13
(NC)
RST
6
6
DC
4
4
CS
12
2
PIN_SPI_SCK / SCK
15 (SCK)
15 (SCK)
PIN_SPI_MOSI / MOSI
16 (MOSI)
16 (MOSI)
RAW
GND
3色 LED はオミットされています。
TX LED のピンアサインが違いますが、どうせ見えません (^^;A
Pro Micro は D11~D13 が使えない ため、OLED の CS が 12->2 へ変更されています。
オリジナルのスピーカーは D5 (-) と D13 (+) に接続され、電位差で鳴っているようですが、Pro Micro は D11~D13 が使えない ため、D5 (+) と GND に接続しています。
C ボタンが実装されています。
RESET ボタンが実装されています。
左上の S/P ボタンには結線していません。
配線はすべて AWG30 のジュンフロン線 で行いました。手持ちのワイヤーストリッパー HOZAN P-967 でギリギリ剥けますが、本当は HOZAN P-963 でやるべきなのでしょうね。
電池ボックスにハンダ付けする場合には、金具を外してハンダ付けしてから戻す ようにしないとケースが焦げて臭いです。
ケースに余裕があれば (GAME POKE MIX 筐体を使わないのなら) Da Vinci 32U や Arduino Micro を使うといいでしょう...ライブラリの修正が必要なくなりますので。
3色 LED を実装したいのなら、以下の配線も行ってください。
RED_LED
10
10
GREEN_LED
11
3
BLUE_LED
9
9
Arduboy の 3 色 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 のボードを追加していなければボードマネージャから追加しておきます。スケッチの転送で、ちょっとしたコツがいる場合があります。
ボードは SparkFun Pro Micro を選択する
この互換機では Pro Micro を使っているので、基本的にボードは SparkFun Pro Micro にします。プロセッサで 5V / 3.3V を選択できる事に注意してください。
3.3V 版ではメモリ不足になる
3.3V 版の Pro Micro (または 3.3V の ATMega32U4 搭載 Arduino 互換機) を使った場合、メモリ不足でスケッチが転送できない事があります。メモリ不足の場合には ボードを "Arduino Leonardo" 等に変更するか、プロセッサを "ATMega32U4 (5V, 16MHz)" に変更してみてください。
但し、これをやってしまうと次回のスケッチ転送がちょっと面倒になります。
リセットスイッチを活用する
Pro Micro の記事 でも書きましたが、ダブルクリックによるリセット が必要になる事があります。リセットスイッチさえ付けていれば 慌てる必要はありません。
See Also:
セットアップ (その2)
Arduboy の本物と互換機の両方を持っているとライブラリの管理が面倒になります。条件コンパイル できるように環境を構築しましょう。
クローンボードの追加
IDE にクローンボードを追加します。
Pro Micro のボードを追加していなければボードマネージャから追加しておきます。
Arduboy のボードを追加していればボードマネージャから削除 しておきます。
Pro Micro の boards.txt を開きます。デフォルトでは %LOCALAPPDATA%\Arduino15\packages\SparkFun 以下にあるハズです。
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}
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カッターでやると簡単です。紙やすりで削ってそこへジュンフロン線をハンダするのですが、フラックスがあるとハンダの乗りがいいです。
最終的な内部の構造はこんな感じになります。黄色のカプトンテープのトコは電源用スライドスイッチ取り付け用です。カプトンテープは OLED や Pro Micro の絶縁にも使っています。
スライドスイッチを取り付けた様子です。これにて完成!
実際に動作している様子はこちら。プレイしているのは TEAM a.r.g. の Sirène 。
VIDEO
See Also:
5V 版作成時の Togetter まとめ
ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。