OBONO’s Diary

へっぽこプログラマの戯言

自作 Arduboy

数年前に以下の記事を見て、
いつか自分も Arduboy 互換機の製作をやってみたいな~と思ったものの、なかなか決心できずにいた。

そんな折、以下の記事を見て、
心の中の自分が「今こそチャレンジの時だ」と囁いてきたのである。

部品の入手

冒頭の怪しいゲーム機は Amazon でも扱っていたので、さっさと入手。

118 種類のゲームはどれもこれもイマイチな感じだったので、気兼ねなく改造できそうだ。

次に、国内の通販サイトで Arduino Micro 互換機を探してみるも、ちょっとコンパクトなものしか見つけられない。かつての先人たちは、ピンアサインを変えたり、IC から直接線を引っ張り出したりしていたのだが、あまりそういう事はやりたくない。
あと、画面は実機よりも大きいモノにしたかったので、同解像度の OLED で大きさが 2.4 インチの SSD 1309 を探すのだが、こちらはいくつかのサイトで見つけられるものの、妙に値段が高いんだよなぁ。

海外の通販サイトを巡ってみたら、Ali Express という中国の通販サイトで Arduino Micro 互換機も OLED も良さそうな部品を発見。お値段も送料込みでお手頃だ。

ちょっと不安ではあったが、覚悟を決めて2月24日に注文する。10日ほど経った3月7日に Arduino Micro 互換機が到着し、さらに2週間空いて3月24日に OLED SSD 1309 が到着した。
注文から時間がかかったのは流通経路の問題であり、品物自体は問題無さそう。中国だから不安だとかいう偏見は払拭した方が良さそうだ。

というわけで、3月中に主要な部品は揃ったのだが、部品が届くのを待っている間に別の事を始めてしまったので、自作 Arduboy 製作に取り掛かるのは5月までおあずけ。
f:id:OBONO:20190514225241j:plain

設計

怪しいゲーム機を分解してみたところ、ボタンの基板はこんな感じだった。
f:id:OBONO:20190611220658j:plain
左手側の十字ボタンはそれとして、右手側の4つのボタンは2つずつで共通になっている。Arduboy はもともと右手のボタンは2つしかないので、まったく問題なし。
その他に START ボタン、SOUND ボタン、RESET ボタンがある。せっかくなので、RESET ボタンで実際にリセットできるようにして、残りのボタンは適当なピンに繋げる事にしよう。
せっかく自作するのだから、去年 Arduboy コミュニティ界隈で話題になった Flash Cart にも対応したら、いろいろ楽しそうだな。あ、やべ。フルカラー LED を確保しないとイカン。抵抗も必要だ。

いろいろ考えた結果、回路図はこんな感じになるのかな。
f:id:OBONO:20190620084633p:plain
Arduino と周辺の部品を直接はんだで繋いでしまうと、万が一、何かやらかしてしまった場合に何かと面倒そうなので、間にコネクタを挟んで、取り外しし易いようにしておこう。

そんなわけで、早速 Arduboy 互換機に線材をはんだ付けする。
f:id:OBONO:20190608150438j:plain
こんだけピンがあると、線材を付けるだけでも一苦労ですな。
あと、Lチカ用の LED は、はんだをモリモリ付けて引き剥がしておいた。これをやらないと D13 ピンが正しく動かないと思われるので。

OLED に画面出力

まずは、実際に画面が出るのかどうかを確認すべく、ブレッドボードを使って Arduino と OLED を接続。
f:id:OBONO:20190608192740j:plain
おおっ、出た出た!! …って、なんか画面が変だぞ。どういう事だ!? Twitter で現状を呟いてみたところ、

早速ヒントがもらえた。Twitter ってスゴイ。紹介してもらった記事を応用し、OLED に送るコマンドとして 0x8D, 0x14 を渡しているのを 0xE3, 0xE3 に変えてやれば、確かに表示は正常になる。ただ、それだと純正 Arduboy では逆に表示されなくなってしまう。
いろいろ調べた結果、最終的に ~/Arduboy/src/core/core.cpp を以下のように変更することにした。

   // Display On
   0xAF,     
 
+  // Set Page 0, Column 0 as Start Address
+  0xB0, 0x00, 0x10,
+
   // set display mode = horizontal addressing mode (0x00)
   0x20, 0x00,  

これで、純正 Arduboy でも、SSD 1309 でも同一のバイナリで問題なく画面が表示されるようになった。やったね。バイナリサイズが3バイト増えてしまうが、まぁ大したことは無かろう。

フルカラー LED 小基板の作成

Arduboy の特徴でもあるフルカラー LED。実機だと RGB 3色とも 220Ω の抵抗を挟んでいるようなのだが、せっかくなのでこの記事を参考にそれっぽい値の抵抗を挟むことにした。
f:id:OBONO:20190619235631p:plain
まずは、部品を確保。OSTAMA5B31A という型番の代物。抵抗は適宜。
f:id:OBONO:20190610225824j:plain
ユニバーサル基板を適当な大きさにカットして、いざはんだ付け。
f:id:OBONO:20190610232743j:plain
できたー!! …って、実はこの写真では抵抗を間違えてはんだ付けしちゃってるんだよね。この後、やり直すハメに。はぁ…

基板のカットと改造

さて、いよいよ元のゲーム機の基板を分断する。カッターを何度も何度も引いて、パキッと3分割する。
f:id:OBONO:20190611222439j:plain
真ん中の基板はもはや不要なのでゴミ箱行き。液晶は何かに使えるかもしれないので、大事に取っておく。

先人に倣って、ボタン側の基板をやすりでゾリゾリ…っと、マズイ、削りすぎた。
f:id:OBONO:20190612000410j:plain
とりあえず、基板の端から線を引っ張り出したいのだが、自分の腕前ではどうやってもうまくいかない。仕方がないので、パターンの途中の表面を削ってそこから線を引っ張る事にした。それにしても、酷い仕上がりだな…
f:id:OBONO:20190612233517j:plain
線を反対側の面にまわして、2×5 のピンヘッダを付ける。ついでに、スピーカーに繋がっていた線を外して、ピンヘッダを直結する。
f:id:OBONO:20190613074107j:plain

次に、電源スイッチ側の基板からも線を引っ張り出す。こちらもパターンの途中の表面を削って、そこから線を引っ張るつもりだったが、この位置だと基板をネジ止めしたときに線がケースとの間に挟まってしまう。なので、ここではなく、スイッチの部品が基板にはんだ付けされているところに直接線を繋げる事にした。
f:id:OBONO:20190617001315j:plain
線を反対側の面にまわして、こちらはピンソケットを付ける。
f:id:OBONO:20190617001414j:plain

動作確認

さて、Arduino 側の線にもピンソケットを付けて、
f:id:OBONO:20190613214512j:plain
OLED、ボタン基板、LED 小基板、スピーカーに繋ぐと、
f:id:OBONO:20190613214718j:plain
おおっ、動く。動くぞおぉぉぉぉーーーっ!!! LED も光るし、ボタンで操作できるし、音も鳴る。これは感動だ。

と、ここで問題が発生。このままだと Arduino やその他諸々がゲーム機筐体の中に納まらない事が判明。特に問題なのが、ピンヘッダとピンソケットと繋げた際の幅よりも、筐体内の厚み方向の空間の幅の方が狭いという事実。これはつまり、ピンヘッダは横に向ける必要があるということだ。
OLED から出ているピンは、途中で 90° 近く曲げて無理矢理横にした。ボタン基板から引っ張った線に付けたピンは明らかに位置が悪いので、線を筐体の下側からまわすようにして、1×10 のピンヘッダに付け替えた。
f:id:OBONO:20190614003920j:plain
あと、Arduino から伸びている線材が無駄に長いので、必要最低限の長さに切った上で、改めてピンソケットを付ける。それでも、筐体に納まる気配が無かったので、Flash Cart 用の配線を外すことにした。う~ん、無念。

あと、OLED について、点灯しているドットが多かったり、頻繁に画面更新があったりすると、画面が妙に暗くなってしまうという症状が発生。これは 3V3 から電源供給しているのがマズいのかな。とりあえず、VCC から供給するように変更することである程度症状が改善したものの、完全ではない。
加えて、表示が妙にゆらゆらしていたり、横方向に対して点灯しているドットの量に差があるとゴーストっぽいものが出てしまったり (この症状は、純正 Arduboy でも出る)、イマイチ画面表示が安定しない印象。これは、SSD 1306 ではなく SSD 1309 を選んだのが良くなかったのかな。こちらの症状については、現状で諦める事にする。

ケースの加工

気を取り直して、ケースの加工にとりかかる。

まずは、画面の窓の部分。
f:id:OBONO:20190611234111j:plain
赤い太線の部分を削り取ることで OLED が良い感じに収まるようになるのだが、それだけだと窓が小さくて画面が隠れてしまうので、赤い細い線のところまで窓を広げる。
f:id:OBONO:20190619152138j:plain
筐体上部には、フルカラー LED のための穴をあける。
f:id:OBONO:20190617093104j:plain
筐体右側面には、USB 接続が接続できるように、Arduino の端っこを少しだけはみ出させるための穴をあける。
f:id:OBONO:20190617093045j:plain
どれも、カッターとヤスリで強引に加工したのだが、普通はこういう時どんな工具を使えば楽なのかな…まぁいいや。

完成

ということで、最終的にはこんな感じになって、
f:id:OBONO:20190617003236j:plain
部品のコネクタを繋ぎ、フルカラー LED や Arduino 基板を然るべき位置に固定し、
f:id:OBONO:20190617093024j:plain
蓋を閉めて、ネジ止めし、
f:id:OBONO:20190617094125j:plain
ようやく完成!! いや~、長かったよ本当に。
f:id:OBONO:20190617094351j:plain

最終的な回路図はこんな感じ。
f:id:OBONO:20190620084637p:plain
あ、写真には写ってないけど、電池から VIN に繋がってる線の間に 5V 昇圧回路を挟んでおいた。

感想

とにかく疲れた。もうこんな事は二度とやらない。
電子工作がそんなに得意なわけじゃないのに、こういう事に手を出したのがそもそものマチガイなんだよなぁ。行き当たりばったりに作業した結果、どれ程の時間が無駄になってしまったか。

でもまぁ、成果物がリアルな物として手元に存在するってのは、それはそれで満足ではある。それなりの達成感は得られた。
文才が無い故、ブログにまとめるのもなかなか大変ではあったが、この乱文が誰かの役に立てば幸いである。