マイコンを使って動かすミニゲーム機に最近ハマっています。
先日、ESP8266(WeMos D1 Mini)で動かすオープンソースハードウェアの携帯ゲーム機『ESPboy』を作ってみたのですがこれが非常に楽しく・・・
その流れでと言いますか、ESP32で動かすNESエミュレータ(ファミコンソフト)などにも挑戦しているのですが、今回はATtiny85という8ビットAVRマイコンを使ったミニゲーム機『Tiny Joypad』をご紹介したいと思います。(以下記事追記しました!)
ATtiny85はArduinoでも使われているAVRマイコンになりますが、ピンの数が8本しかない非常に小さなマイコンチップです。
この小さなマイコンチップにゲームプログラムを書き込みミニゲームとして動かすのがTiny Joypadです。
多くのゲームデータやTiny Joypadの回路構成も公開されているので、ブレッドボードやユニバーサル基板を使って簡単に組んで遊ぶことが出来ます。
この投稿をInstagramで見る
マイコンで動かすこのようなミニゲーム、非常に面白いですね!
目次
ATtiny85を使ったミニゲーム機『Tiny Joypad』を組んでみる!
ATtiny85はArduinoでも使われているAVRマイコンとなり、ATtinyシリーズの中でも8ピンしかない非常に小さなマイコンチップとなります。
こんな小さなマイコンチップですが、スケッチを書き込むことによりArduinoと同じように動作させることが出来ます。
ATtiny85の基本的な使い方に関しては、こちらの記事で詳しく解説しているので合わせて見て頂ければと思います。
Tiny Joypadの回路構成は非常に簡単です!
抵抗やタクトスイッチ、ディスプレイなどの電子パーツがあればブレッドボードを使って簡単に組むことが出来るのですが、ゲームデータを書き込み正常に動作させるのに結構手間取ったので、最低限ゲームをプレイ出来るようにするまでの手順を順を追ってご紹介したいと思います。
Tiny Joypadは多くの方が作られ楽しまれているようですね。
こちらのサイト様もTiny Joypadに関して多くの記事を書かれています。
参考にさせて頂きました!
Tiny Joypad 回路構成
公式サイトを見るとTiny Joypadの回路構成を確認する事が出来ます。
参考 Tiny JoypadTiny Joypad.com非常にシンプルな構成なので、まずはブレッドボードを使って動かしてみるのがいいかと思います。
ゲームデータもサイトからダウンロードする事が出来ます。(本記事ではゲームデータは別サイトからダウンロードします)
ATtiny85は8ピンしかないミニマイコンなので使えるI/O端子の数が限られています。
上記回路図を見ると、スイッチのON/OFF判定にデジタル入力ではなく抵抗の分圧を使いアナログ入力でボタン判定をしていることが分かります。
上手く工夫されていますね、非常に参考になります!
ブレッドボードで組んでみる
それではブレッドボードで組んでみますが、回路構成は非常に簡単なのでパーツさえあればサクッと組んで試すことが出来ます。
ゲームとしてプレイするにはブレッドボードでは少し操作しにくいので、ユニバーサル基板を使い組んでみるのもいいかと思います。
結構面白いゲーム機なので私はこのようなTiny Joypad互換基板を作り現在発注しています。
パーツ一覧
特殊なパーツはなく入手しやすいものばかりですが、一応必要なパーツ一覧を書いておきます。
ATtiny85
ゲームデータを書き込むのが少し面倒なので複数用意してゲームを書き込んでおくと、チップを入れ替えて遊べるので便利かもしれません。
書き込みの際にチップを外し書込装置と接続する必要があるので、ユニバーサル基板で組む場合は8ピンICソケットも必要となります。
OLEDディスプレイ(128×64 I2Cタイプ)
I2C制御の0.96インチ(128×64)OLEDディスプレイを使います。
ドライバチップはSSD1306で制御するタイプのものです。
タクトスイッチ
タクトスイッチのサイズはお好みで!
写真のものは6mm角のものを使っています。
パッシブブザー(圧電スピーカー)
サイズはお好みで。
写真のものは12mmサイズのものを使いました。
抵抗
抵抗による分圧を使いスイッチ判定をしているので分圧比を計算し抵抗値を変えても問題ないと思いますが・・・上記回路図の値と同じものを使うのがよさそうです。
このような抵抗セットはいくつか持っていますが、セット内容により含まれていない抵抗値もあるので確認して下さい!
ブレッドボードで組むだけなら複数の抵抗を合わせて指定抵抗値を作るのもいいかと思います。
・10kΩ×1
・22kΩ×2
・33kΩ×2
・88kΩ(または82kΩ~91kΩ)×2
その他
ブレッドボードで組むだけなら電池ボックスやスライドスイッチ(電源のON/OFF用)は必要ないと思いますが、このあたりはお好みで!
ATtiny85の駆動電圧は2.7~5.5Vとなっています。
また使っているOLEDディスプレイの駆動電圧も5Vまで対応しているので、ブレッドボード用電源モジュールがあれば便利ですね!
またArduinoの[5V端子]または[3.3V]端子から電源供給するのもいいかと思います。
パーツが用意できたら上記回路図通りに接続するだけです。
こんな感じで組みました。
Tiny Joypad互換基板を設計したので後々これに組み直すために同じ環境となるCR2032ボタン電池での駆動やスライドスイッチも取り付けて動作確認しました。
ボードパッケージのインストール
回路が組めたらArduino IDEを使ってATtiny85にゲームデータを書き込みますが、その前に少し準備が必要です!
Arduino IDEで使う場合、ATtiny85(ATtinyシリーズ)に対応したボードパッケージをインストールしておく必要があります。
またブートローダーの書き込みも必要となってきます。
順を追ってやっていきます。
まずArduino IDEにATtinyボードパッケージのインストールを行います。
Arduino IDEの[環境設定(Preferences…)]から[追加のボードマネージャのURL]に以下URLを追加します。
http://drazzy.com/package_drazzy.com_index.json
他のボードマネージャのURLが記載されている場合は新たな行に追加して下さい!
次に[ツール]→[ボード]→[ボードマネージャ]に進みます。
[ATtiny]で検索するといくつかボードパッケージが出てきますが、ATtiny85に対応したものは[ATTinyCore by Spence Konde]になります。これをインストールして完了です!
ボードパッケージのインストールが出来たのか一応確認しておきます。
[ツール]→[ボード]へと進むと[ATtinyCore]という項目が追加されています。
これでATtinyシリーズのチップにコンパイル&スケッチの書き込みが行えるようになりました。
ブートローダーの書き込み
それではゲームデータを書き込み、実際に動かしてみたいと思いますが・・・
ATtiny85は見ての通りArduinoボードのようにプログラム(スケッチ)を書き込むための装置が付いていません。
そのためプログラムの書き込みには、AVRライタといった書き込み装置が必要となってきます。
私はUSBaspを使ったこのような簡単な書き込み基板を作りましたが、Arduinoが1台あれば書き込み装置として使うことが出来るので今回はその方法で進めていきます。
Arduinoボードを書き込み装置として機能させ、このArduinoを経由してATtiny85にスケッチを書き込むというものです。
Arduinoを書き込み装置として使う準備
まずArduinoを書き込み装置(ライタ)として機能させる準備です。
こちらではArduino Unoを使って行っていきます。
Arduino IDEの[ファイル]→[スケッチ例]→[11.ArduinoISP]→[ArduinoISP]を開きます。
このスケッチを通常作業でArduino Unoに書き込みます。
これで書き込まれたArduino Unoは書き込み装置として機能するようになります。
Arduinoとの接続
先程ブレッドボードで組んだものからATtiny85チップを取り外しArduinoと接続します。
SPIでの接続となり、Arduino Unoとはこのような接続となります。
Arduino Unoでは、D11がMOSI、D12がMISO、D13がSCKとなっています。
ATtiny85の対応した端子と接続します。
Arduino Uno | ATtiny85(ピン番号) |
5V | VCC(8) |
GND | GND(4) |
D11(MOSI) | MOSI(5) |
D12(MISO) | MISO(6) |
D13(SCK) | SCK(7) |
D10 | RESET(1) |
上記回路ではArduinoのRESET端子とGND間に10μFのコンデンサを入れています。
特にこのコンデンサは無くても私の環境では書き込みは行えましたが、書き込みが上手くいかない場合や安定しないようであれば入れて下さい!
スケッチアップロード中に自動リセット機能としてシリアルポートを開く時にArduino Unoがリセットされるのを防ぐためです。
ブートローダーの書き込み
接続ができたらブートローダーの書き込みです。
ボード設定を[ATTinyCore]の中にある[ATtiny25/45/85(No bootloader)]を選択します。
チップは[ATtiny85]、クロックは[8MHz(internal)]、そして書込装置は[Arduino as ISP]を選択します。
またシリアルポートはArduino Unoを経由して書き込みを行うので[Arduino Uno]を選択しておきます。
書き込み装置の設定が出来ました。
これでArduino Unoを経由して接続しているATtiny85にスケッチの書き込みが行えるようになります。
あとは[ブートローダーを書き込む]を選択してブートローダーの書き込みを行います。
[ブートローダの書き込みが完了しました]と表示されれば成功です!
ゲームデータの書き込み
それではメインとなるゲームデータの書き込みです。
Tiny Joypadのサイトからゲームデータをダウンロードできるのですが、ライブラリの問題?ディスプレイの設定?
正常に動作させるのに結構手間取りました。
今回はTiny Joypad用に上手く修正されたゲームデータがGitHubに公開されていたので、これを使って行っていきます。
ゲームデータのダウンロード
以下GitHubサイトからゲームデータをダウンロードします。
参考 cheungbx/gametinyGitHubTiny Joypad用に改変されたゲームデータがいくつか入っています。(内容は公式サイトにあるものと同じです)
試しに[Tiny_space_invaders]というゲームを書き込んでみたいと思います。
フォルダ内のスケッチファイル(拡張子がinoのファイル)を開きます。
コンパイルにはこのライブラリが必要となるのでインストールします。
ライブラリのインストール
[ssd1306xled.h]ライブラリを以下GitHubページからダウンロードします。 参考 ssd1306xledGitHubダウンロードが完了したら、Arduino IDEの[スケッチ]→[ライブラリをインクルード]→[.ZIP形式のライブラリをインストール]へと進み、ダウンロードしたzipファイルを選択してインストールを行います。
ライブラリのインストールは以上です!
ゲームデータの書き込み
それではゲームデータの書き込みです。
書き込みの際の[ボード設定]及び[書込装置の設定]は先程と同じです。
以上で完了です!
動作確認
ゲームデータの書き込みが完了したチップをブレッドボードに組んだ回路に戻します。
電源投入でゲームが起動すれば成功です!
お疲れさまでした!
この投稿をInstagramで見る
ブートローダーの書き込みは最初の1回のみ行えばいいのですが、他のゲームをプレイする際にゲームデータを入れ替える(書き換える)のが結構手間なので、いくつかATtiny85チップを用意して予め書き込んでおくと便利かもしれませんね!
昔あったファミコンのカセットを入れ替えるように、チップを交換すると違うゲームが楽しめるということです。
こんな小さなマイコンチップですがプログラムを書き込みミニゲームがプレイできるのは非常に面白いですね!
AVRマイコンの学習用としてもいいと思います!
他にも探せばゲームデータは多数公開されています。
Attiny Arcade用に作られたものなど一部スケッチ修正作業が必要だったりもしますが、探して動かしてみるのも面白いかと思います。
最後に!
ATtiny85は8ピン端子のうちVCC/GND端子を省くとデジタル・アナログで使える端子はたった6本しかありませんが、Tiny Joypadでは5つのタクトスイッチとスピーカー、I2C接続のディスプレイを接続し上手く工夫して動かしてます。
指に乗るほどの小さなマイコンチップですがスケッチを書き込むことによりArduinoとして動作させることができミニゲームをプレイできる、これは電子工作用途で楽しめますね!
ArduinoやAVRマイコン学習用としても最適だと思います。
ATtinyシリーズのチップは非常に有名で人気があるマイコンなので手元にいくつか持っていましたが、これまであまり使う用途がなく眠っていました。
Tiny Joypadとの出会いで、これはアイデア次第で電子工作で面白く使えそうなマイコンだと感じました。
PICマイコンと並んで人気のあるマイコンなのも納得ですね。
パーツ点数が少なく入手もしやすいパーツばかりで構成されているので、興味ある方はまずブレッドボードで組んで試してみるのがいいと思います。
そこから私のようにハマってしまった人は、ユニバーサル基板で作ったり、付加機能を付けたオリジナルのTiny Joypad互換機を作ってみるのも面白いと思います。
ブレッドボードではやはり操作がしにくいことから、Tiny Joypad互換基板を設計し現在発注しています。
また機会があればご紹介出来ればと思います。
またATtiny85の接続やスケッチ書き込み方法など基本的な内容はこちらの記事でもまとめているので参考にして下さい!
reset端子が入力で使っているのにISPでリセットとして使ってる ? ? と思ったら、、、PB5端子はリセットがかからない範囲でADC入力として使えるんですね(思いもよらなかった)。勉強になります。
[…] […]