TinyJoypadを作る(電子工作)

プラモデルの電飾(PICマイコン)を始めたことで電子工作にハマりつつある今日この頃…

AVRマイコンである”ATTINY85-20PU”を使い開発されている”Daniel Champagne”氏のTinyJoypadを作ってみようと思います。


オリジナルでは電源を3Vのボタン電池としていますが、今回USBから電源を供給するため5Vで製作します。

そのため少し改変した回路図とプログラムについては説明しますが、基本的な製作方法は”Daniel Champagne”氏のホームページで確認できるのでそちらを参照してください。

https://www.tinyjoypad.com/tiny-joypad


必要な部品

AVRマイコンATTINY85へプログラムを書き込むには前提としてArduinoUno等が必要です。
個人的におススメなのはELEGOO製の互換機です。
オリジナルに比べて非常に安いので本格的に使わないのならこれで事足ります。



以下は必要な部品です。
秋月電子で全て揃います。(秋月電子だいちゅき)

ATTINY85-20PU http://akizukidenshi.com/catalog/g/gI-09573/
ICソケット8P http://akizukidenshi.com/catalog/g/gP-00017/
Cタイプユニバーサル基板 http://akizukidenshi.com/catalog/g/gP-09855/
タクトスイッチ http://akizukidenshi.com/catalog/g/gP-03651/
47㎌電解コンデンサ http://akizukidenshi.com/catalog/g/gP-10596/
スライドスイッチ http://akizukidenshi.com/catalog/g/gP-08790/
10kΩカーボン抵抗 http://akizukidenshi.com/catalog/g/gR-07838/
20kΩカーボン抵抗 http://akizukidenshi.com/catalog/g/gR-07842/
128x64 ドライバSSD1306 OLED http://akizukidenshi.com/catalog/g/gP-12031/
電子ワイヤ http://akizukidenshi.com/catalog/g/gP-06756/
基板用マイクロUSB電源コネクタ http://akizukidenshi.com/catalog/g/gC-10398/
圧電スピーカー http://akizukidenshi.com/catalog/g/gP-04118/

※コンデンサの容量は10㎌が推奨されています。47㎌の採用に特に理由は無し。

OLEDはAmazonにも同じようなものが売っています。
ちなみに自分はBanggoodで買いました。



回路図

早速回路図を作りました。


作者様のファイルをダウンロードすると同じような回路図が添付されていますが、今回電圧を5Vで製作することと、指定の抵抗値を持っていなかったので少し改変することにしました。※コンデンサの容量が10㎌となっていますが47㎌の間違いです(別に10㎌で問題ないが)

少し解説

回路図左下のタクトスイッチ4つはそれぞれ「左右は1ピン(PB5)」「上下は2ピン(PB3)」で読み取りを行っています。

ここでの説明は左右に絞りますが、上下も同じ仕組みです。

タクトスイッチは仕様上「押していない時はオフ」「押している時だけオン」となっている為、押していない時はGNDと繋がっていないので全ての電圧が1ピンにかかります。
ということはこの時1ピンでは5Vを読み取れます。

続いてタクトスイッチを押したときにどうなっているかというと、例えばRight(右)のタクトスイッチを押します。
タクトスイッチ側の10kΩの抵抗を通してGNDに電気が流れて行く訳ですが、VCC側にも10kΩの抵抗があるので「抵抗分圧」とよばれる現象によって1ピンには2.5Vの電圧がかかるようになります。

Left(左)のタクトスイッチを押すとタクトスイッチ側に20kΩの抵抗があるので1ピンには3.33…Vの電圧がかかるようになります。

こののように「抵抗分圧」を利用することで
  • 5V=何も押していない
  • 2.5V=右のタクトスイッチを押している
  • 3.33…V=左のタクトスイッチを押している
ということを電圧によって読み取ることが出来ます。

組み立てる

あとは配置を考えてはんだ付けしていくだけです。

で、早速完成形⇩


I2Cかつ1306ドライバのディスプレイに限られますが、ディスプレイの不良品判定にも使えるので完全に固定してしまわずにピンソケットで抜き差し可能にしておきました。

圧電スピーカーはディスプレイの下に隠れています。

ちなみに手持ちに20kΩの抵抗が無かったので10kΩ2個直列で代用しています。

裏側です⇩


シンプルで配線も楽な部類だと思います。

起動してみる

作者様のホームページを参考にATTINY85に「Tiny Space Invaders attiny85」を書き込んでみました。

電源オン!


起動しました!!

早速遊んでみましたが動作がおかしい…
自機が右を押せば右に、左を押しても右に進みます…


原因は分かっていて、指定の抵抗値と違う抵抗を使用しているからです。
ということなのでプログラムを書き換えていきます。


電圧の読み取りには"analogRead"というものが使われています。
シンプルにアナログピンの電圧を読み取り、0~1023の変数で表すというもの。

例えば5Vだと”1023”になります。
その他の電圧の変数を求めるにはまず5Vを1023で割ります。

5÷1023=0.0048875855327468

変数1あたり0.0048875855327468Vということが分かりました。

後は読み取りたい電圧”2.5V”と”3.33…V”をそれぞれ0.0048875855327468で割ってあげるだけ。

右を押したときの2.5V=変数511
左を押したときの3.33V=変数681

ということが分かりました。

先ほどの変数値を頭においてまずはオリジナルのプログラムを見てみます。

if ((analogRead(A0)>=750)&&(analogRead(A0)<950)) {if (VarPot>5) {VarPot=VarPot-6;}}
if ((analogRead(A0)>500)&&(analogRead(A0)<750)) {if (VarPot<108) {VarPot=VarPot+6;}}

1行目が左を押したときのコード
2行目が右を押したときのコードです。

解説すると、
1行目は変数値が750以上かつ950より小さい時に実行
2行目は変数値が500より大きくかつ750より小さい時に実行

先ほどの”2.5V=変数511”と”3.33V=変数681”が両方とも二行目の右を押したときの変数値内に収まってしまっていることが分かります。

なので、右を押しても左を押しても自機が右に進んでしまう状態の説明がつきます。


ではプログラムの数値を自分の環境に合わせて書き換えていきます。

if ((analogRead(A0)>=600)&&(analogRead(A0)<950)) {if (VarPot>5) {VarPot=VarPot-6;}}
if ((analogRead(A0)>400)&&(analogRead(A0)<600)) {if (VarPot<108) {VarPot=VarPot+6;}}

1行目、左を押したときの変数値681が治まるように600以上かつ950より小さいに書き換え。
2行目、右を押したときの変数値511が治まるように400より大きくかつ600より小さいに書き換え。

以上のように書き換えてもう一度起動してみました。


無事誤作動することなく自機が動きました!

それにしてもカワ(・∀・)イイ!!

今回はインベーダーで試してみましたが、他にも現在12個のゲームを公開されています。

マイコンをカセット代わりに差し替えて遊ぶのも良さそうですね。

0 件のコメント :

コメントを投稿