Arduino UnoでTinyJoypad

f:id:haseharu:20211005222627j:plain

ATtiny-85で動かせるゲームを配布しているtinyjoypad.comというサイトがある。

www.tinyjoypad.com

ATtiny-85でやってもいいんだけど、とりあえず動きを試したくて、Arduino Unoで試してみた。

TinyJoypadで使っているSSD1306用ライブラリを落として、

github.com

いくつかあるゲームのソースのうち「Tiny Invaders」を落として、Arduino Unoに書き込んで、

www.tinyjoypad.com

ちょうど手元にあったSSD1306の有機EL 128✕64グラフィックディスプレイへつなげてみると映るようだったので、

akizukidenshi.com

タクトスイッチのボタンの方もつなげてみる。Arduino Unoでの接続時はこちらを参照。

https://doc-10-1k-docs.googleusercontent.com/docs/securesc/pojmq4ree4t67t7fnfp41lsnpef54ouq/gb2c2mhgc5pegei5modurqut6of5fcft/1633444050000/01770547387352383734/03720646434477843549/11rv1jlYhM76hwfIRVyPU7DIqp-NmjuP0?e=view&authuser=0&nonce=a0k3glmaemqe2&user=03720646434477843549&hash=5loi2bd2ij93u0afsv6audt822bjpslp

SCLとSDAの接続箇所に注意が必要。最初接続したときははまらなかったのに、2回目に接続したときは、何も考えずに普通にArduino Uno側のSCLとSDAに接続してしまって「何か急にディスプレイ映らなくなったぞ。なんだろう」と2-3時間はまってしまった。

f:id:haseharu:20211005222547j:plain

ATtiny-85での実装を想定しているので、ピン数が少なくても良いようにボタンを抵抗分圧で処理している。自分は抵抗値を適当に変えてしまったが、プログラム内で以下のように設定しているため、数字を変えてやれば良い。

#define TINYJOYPAD_LEFT  (analogRead(A0)>=750)&&(analogRead(A0)<950)
#define TINYJOYPAD_RIGHT (analogRead(A0)>500)&&(analogRead(A0)<750)
#define TINYJOYPAD_DOWN (analogRead(A3)>=750)&&(analogRead(A3)<950)
#define TINYJOYPAD_UP  (analogRead(A3)>500)&&(analogRead(A3)<750)

抵抗値から抵抗の分圧を計算してもよいが、ボタン押下時にanalogRead(A0)とanalogRead(A3)の値を取得して、シリアルモニターで確認してそれにあわせて値を変えてあげても良いと思う。

if (TINYJOYPAD_RIGHT) 
if (TINYJOYPAD_LEFT)

とかでif文で場合分けをしていた(自分はインベーダー的なものとテトリス的なものしかみていないが)。それぞれのif文でserial.printが簡単かもしれない。インベーター的なそれは右と左しかコントールしないため、上の2つしか場合分けがない。テトリス的なあれには下がある感じ(たしか)でたぶんゲームごとに必要ないボタンは最初からプログラムの方では制御していない感じ。

タクトスイッチはカチカチ感が良くて、持っていない色があるとつい買ってしまうパーツの一つかもしれない。ブレッドボードやArduinoやらラズパイのシールド用基盤、あとディスプレイもつい買ってしまうパーツの一つ。

今回使ったSSD1306のやつも小さくて安くて良さそう、と買っておいたもの(確か)。