- ATtiny85で動かすミニゲーム機TinyConsoleの製作その① [ケース・基板設計]
- ATtiny85で動かすミニゲーム機TinyConsoleの製作その② [基板実装・ゲームデータの書き込み]
- ATtiny85で動かすミニゲーム機TinyConsoleの製作その③ [修正ケースが来ました]
ATtiny85で動かすオープンソースプロジェクト『Tiny Joypad』をカスタムさせて、100均で売ってそうなミニゲーム機を自作する試みです。
上記前回の記事では基板及びケースの設計から発注までをご紹介しました。
今回はパーツの実装やゲームデータの書き込み方法などを見ていきたいと思います。
この投稿をInstagramで見る
目次
【Tiny Joypad】ATtiny85で動かすミニゲーム機TinyConsoleの製作
パーツの実装
基板が届いたのでパーツを実装していきます。
基板の製造はJLCPCBに発注しました。
このサイズの基板であれば送料(OCS NEPを選択)と合わせても500円ほどと格安で作ることが出来ます。
基板データ(ガーバーファイル)や使用パーツリスト、発注方法などは前回の記事で書いているので参考にして下さい。
それではパーツの実装です。
0805サイズのパーツをベースにしているので手はんだでの実装も十分可能ですが、ATtiny85(SMD)や充電チップ(MCP73831)など小さなICチップが含まれているので慣れていないと少し難しいかもしれません。
今回ステンシルも一緒に発注していたので、リフローによる実装で行いました。
リフローによる実装なので電源スイッチやOLEDディスプレイ、ピンヘッダーといったスルーホールパーツ以外の裏面の表面実装パーツは全て一気に実装してしまいます。
実装にはミニリフロー装置MHP50を使いました。
PD電源が使え作業スペースの邪魔になりにくい、非常に便利なリフロー装置です。
PCBのパーツ実装でMHP50やMHP30は一台持っていると便利です!
MHP50に関しては後日MHP30の記事に追記しておきます。
綺麗に実装出来ました。
ほんと便利なリフロー装置です。
最後に残りのパーツの実装です。
基板のみで遊ぶ場合は問題ないのですが、ケースに収納して使いたい場合はディスプレイモジュールのピンヘッダーに付いているハウジング(樹脂部分)を外す必要があります。(ケースと干渉するため)
ディスプレイモジュールの裏面にはパーツが実装されているので、本基板と重ねるとこのように少し浮いた状態になります。
はんだ付け後、不要なピンヘッダー先端はカットして下さい。
充電&電源操作
バッテリーホルダーにLIR2032ボタン電池を挿入し電源スイッチをオンにするとゲームが立ち上がりますが、まだプログラムを書き込んでいないのでこの時点では画面には何も表示されません。
先に基本的な使い方です。
電源スイッチがオンの状態(ゲームプレイ)でUSB端子にケーブルを挿してもLEDは点灯しませんが、オフの状態ではLEDが点灯します。
充電中を示すインジケーターランプとなり、充電が完了するとLEDは消灯します。
この投稿をInstagramで見る
本基板はボタン電池CR2032で動作させることも出来ますが、CR2032は一次電池(充電不可)となるため充電には対応していません。
CR2032と同サイズのLIR2032は充電できる二次電池となるので、USB端子からの充電機能を使用する場合はLIR2032電池を使用して下さい!
Arduino IDEの環境構築
それではArduino IDEを使いゲームデータを書き込んで動かしてみたいと思いますが、その前に少し準備が必要です。
コアで使用しているATtiny85にプログラムを書き込むには、対応したボードパッケージ[ATtinyCore]をArduino IDEにインストールしておく必要があります。
またブートローダーの書き込み(ヒューズの書き込み)も必要となってきます。
順を追ってやっていきます。
- ATtinyCoreボードパッケージのインストール
- ブートローダーの書き込み(ヒューズの書き換え)※初回書き込み時のみ
- ゲームデータの書き込み
この一連の流れはこちらの記事でも詳しくまとめています。
あわせて見て頂ければと思います。
基板を作るのは大変だけど、ブレッドボードで組んで遊んでみたいという方にも参考になると思います。
①ATtinyCoreボードパッケージのインストール
まずArduino IDEでATtinyシリーズのチップへの書き込みを行えるように対応したボードパッケージをインストールします。
Arduino IDEの[基本設定(Preferences…)]から[追加のボードマネージャのURL]に以下URLを追加します。
次に[ボードマネージャ]に進み[attiny]で検索するといくつか候補が出てきます。
ATtiny85に対応したボードパッケージは[ATTinyCore by Spence Konde]になります。
これをインストールして完了です。
一応確認しておきます。
[ツール]→[ボード]へと進むと[ATtinyCore]という項目が追加されています。
これでATtinyシリーズのチップにコンパイル&スケッチの書き込みが行えるようになりました。
本基板ではATtiny85を使っているのでこれを指定して書き込むことになります。
②ブートローダーの書き込み(ヒューズの書き換え)※初回書き込み時のみ
Tiny Joypadに対応したゲームデータをATtiny85に書き込み動かす場合ブートローダーは必要ないのですが、初めての書き込みではヒューズビットを書き換えるために行っておきます。
書き込みにはAVRプログラマが必要になります。
AVRプログラマは安価で売られているUSBaspがあると便利です。
ArduinoやAVRマイコンを扱うことが多い方は一台持っていると役立つと思います。
AVRプログラマをお持ちでない場合、Arduinoを経由して書き込むことも出来ます。
こちらではArduinoとUSBaspを使った2通りの書き込み方法を見ていきます。
Arduinoを使った接続
ArduinoをAVRプログラマとして使用する場合、Arduino IDEに標準で用意されている[ArduinoISP]スケッチを使います。
Arduino IDEの[ファイル]→[スケッチ例]→[11.ArduinoISP]→[ArduinoISP]を開きます。
これをArduino(こちらではUnoを使います)に書き込みます。
これで書き込まれたArduino UnoをAVRプログラマとして使うことが出来ます。
Arduinoと本基板とをこのように接続します。
Arduino | 本基板 |
5V | VCC |
GND | GND |
D10 | RST |
D11 | MOSI |
D12 | MISO |
D13 | SCK |
Arduinoを使った書き込み
接続が出来たらブートローダーの書き込みです。
ボード設定を[ATTinyCore]の中にある[ATtiny25/45/85(No bootloader)]を選択します。
チップは[ATtiny85]、クロックは[8MHz(internal)]、そして書込装置は[Arduino as ISP]を選択します。
またシリアルポートはArduino Unoを経由して書き込みを行うのでそれを選択しておきます。
あとは[ブートローダーを書き込む]をクリックして書き込みを行います。
[ブートローダの書き込みが完了しました。]と表示されれば成功です!
USBaspを使った接続
同じ作業をUSBaspを使って行ってみます。
接続は対応した端子が合うように向きを合わせて差し込むだけなので簡単です!
USBaspは安価なAVRプログラマですが、ISPによる書き込みに特化したものなので一台持っていると便利です。
USBaspを使った書き込み
ボードの設定等は先程と同じですが、書き込み装置に[USBasp(ATTinyCore)]を選択して下さい。
あとは同様に[ブートローダーを書き込む]を選択して書き込みを行います。
テストプログラムで動作確認
Tiny JoypadはディスプレイにSSD1306が使われており、ゲームデータを動かすのに[ssd1306xled.h]ライブラリのインストールが必要となります。
インストールがまだの方は以下サイトからダウンロードしてArduino IDEにインストールしておきます。
ダウンロードが完了したら、Arduino IDEの[スケッチ]→[ライブラリをインクルード]→[.ZIP形式のライブラリをインストール]へと進み、ダウンロードしたzipファイルを選択してインストールを行います。
これで必要なライブラリのインストールの完了です。
それではゲームデータの書き込みです。
ゲームデータは本家サイト以外にも多数あるようですが、こちらのゲームデータを使ってみたいと思います。
Arduboyから移植されたものなど、Tiny Joypad用に改変されたゲームデータがいくつか入っています。(本家サイトで公開されているものとほぼ同じ内容です)
参考 cheungbx/gametinyGitHubまずはじめにテストプログラム[Test_ATtiny]を書き込んでみます。
接続方法&書き込み設定は先程のArduinoまたはUSBaspでブートローダーを書き込んだ時と同じです。(書き込み装置の選択が変わってきます)
書き込みは[スケッチ]→[書き込み装置を使って書き込む]から行います。
このテストプログラムは各操作ボタンを押したときのADCの値を確認するというものです。
Tiny Joypad用に作られたゲームは以下値が取得された時にボタンが押された判定を行います。
ボタンを押した際にこの範囲内に入っていないとゲームをプレイする際にボタンが押された判定がされず動かない場合があります!
- 上ボタン(A3):500~750
- 下ボタン(A3):750~950
- 右ボタン(A0):500~750
- 左ボタン(A0):750~950
- アクションボタン(PB1):0 or 1
私が実装した基板では上下スイッチの値が低い値となっていました。
特に上ボタンの値が上記範囲よりも低い410前後くらいの値になっていたので、ゲームをプレイする際に上ボタンだけ反応しないといった具合でした。
上下左右ボタンは抵抗の分圧によるADCの値を取得して判定しているのですが、同じ値の抵抗を実装しているのになぜズレているのかな?
現在の数値から上記規定範囲に収まるように抵抗値を変えてもよかったのですが・・・チップ抵抗を外して取り替えるのは手間なのでゲームプログラム側で修正することにしました。
もしテストプログラムを動かし上記範囲内に収まっていない場合は、以下ゲームデータを書き込む際に参考にして下さい!
ゲームデータの書き込み
それでは最後にゲームデータの書き込みです。
先ほどダウンロードしたゲームデータの中にある[tinypacman]というゲームを例に書き込んでみます。
先ほどのテストプログラムで取得されるADCの値がズレていたのでプログラムを修正し書き込みます。(上記範囲内に収まっている場合は修正の必要はありません!)
ボタンが押された判定をしている部分はこのあたりです。
私が実装した基板では上ボタンを押したときの値(A3)が既定値(500~750)よりも低い410前後だったので、このままでは押された判定がされないので400~750の範囲で判定されるように修正しました。
あとは書き込みです。
接続や書き込み設定は先程と同じで、[書き込み装置を使って書き込む]から書き込みます。
ゲーム画面が表示され全てのスイッチ操作が正常に行われていれば完了です!
お疲れ様でした。
他のゲームデータの書き込み方法も同様の手順で行って下さい!
ケースデータの設計ミス
ミニサイズの基板なのでこのままでも可愛いのですが、ケースも作っていたので基板を収納したいところなんですが・・・、ここで基板とケースとの干渉があることが分かりました!
届いた時は綺麗にケース内に基板を収めることが出来たので安心して実装していたのですが・・・
実装後の基板では、はんだ付けしたパッド部分がケースと干渉しているようです!
設計時にCAD上で干渉部分の確認は何度もやったのですが、実装後このパッド部分にはんだの盛り上がりができるためケースと干渉していました。
CAD上でははんだの盛り上がりまでは確認することが出来ないわけですが・・・完全に詰めが甘かった感じです。
この部分を修正し自宅の3Dプリンタで造形し直したものでは問題ないようですが、再度JLC3DPに発注し問題なければケースデータの方もダウンロード出来るようにしておきます。
ケース修正して完成!
100均で買えそうなミニゲーム機を1000円くらいかけてガチで作る楽しみ😊
得られた知識はお値段以上。今の自分のCADスキルでは実際に機能するものはこのサイズが限界かな!
JLC3DPでもう一度綺麗なケース作って完成品としよう📝 https://t.co/BRrAFHMjRV pic.twitter.com/1krUgSy6v1
— ガジェット大好き!! (@smartphone_jp1) October 2, 2024
最後に!
PCBの設計もそうなのですが、このサイズとなるとケースの設計も難しくなり製作は結構大変でしたがCADのスキルアップにも繋がり非常に楽しい製作でした。
ケースの設計はミスしてしまいましたが、JLC3DPで製造する3Dプリントパーツを使えば安価で自宅の3Dプリンタでは造形が難しくなってくるサイズや形状のものも綺麗に仕上げることが出来るので今後の設計の幅も広がってきそうな感じを受けます。
何かの参考になればと思います。
- ATtiny85で動かすミニゲーム機TinyConsoleの製作その① [ケース・基板設計]
- ATtiny85で動かすミニゲーム機TinyConsoleの製作その② [基板実装・ゲームデータの書き込み]
- ATtiny85で動かすミニゲーム機TinyConsoleの製作その③ [修正ケースが来ました]
[…] […]
[…] […]