「ぼくのかんがえたさいきょうのデジタルインベーダーゲーム」Arduino版

先日公開した「ぼくのかんがえたさいきょうのデジタルインベーダーゲーム」ですが、PICマイコンを使ったことと、ハンダ付けする場所が多かったりして「夏休みの工作」としてはちょっとハードルが高くなってしまったような気がするので、今更ですがArduino+ブレッドボードで作って見ました。
電卓ゲームArduino版

実は自分はArduinoIDEでまともなアプリケーションを開発するのは初めてで、ArduinoIDEの文化にはちょっと違和感がありました。
・ライブラリへの依存度が高く、また割り込みタイマーハードウェアの競合など暗黙の了解が多い
・性能を出しきるような完成度の高いアプリを作ろうと思うと、結局自分でハードウェアを叩いたりしなくてはならない。
・IDEのバージョン変更が結構頻繁で、しかもフォルダ構成など表に出ない部分での変更が多いので、ネット上の古い情報が役立たないことがある(これはまあどのマイコンでも同じようなもんですが)

しかし、Arduinoは現時点では情報量が多く、何よりも格安でマイコン電子工作を始めるための土台として確実だと思います。
何かしたいと思うことをすぐさま実現できるようにArduino用には各種の拡張シールドをコネクタに挿し、ライブラリをダウンロードしてスケッチをコピペするだけで使える準備が出来ているのですから、手書きで回路図を描いたり部品をバラで集めてはんだごてでちまちまやって、アセンブラで頭をひねらせていた古い世代の自分からすれば、うらやましい時代になりました。


[回路図というか接続図]
電卓ゲームArduino版配線図


[主な部品]
・Arduino本体aitendo びんぼうでいいの
今回は激安の互換品を使いましたが、もちろん本家のArduinoでもいいし、互換ボードでもかまいません。ATmega168以上の8bit AVRが搭載されているArduino互換ボードなら多分動くでしょう。もし初めてならば、ハンダ付けなどの必要が無い純正品のほうがいいかも。
・7セグメントLEDモジュールaitendo 4桁7セグLED表示器 [ZDS4-G369SRB-7.7]×2個
今回は激安品を使いましたが、合計8桁分のダイナミック表示用、カソードコモンの7セグメントLEDモジュールがあれば、配線次第で使えます。
アノードコモンタイプでも使うことが出来ますが、ピン出力の論理を反転(セグメント出力は1でオンから0でオン、桁出力は0でオンから1でオン)するようにスケッチの変更が必要です。
・圧電サウンダ
圧電スピーカーとも呼ばれるもので、発振機を内蔵しているブザーではなくて、ただの発音素子のほうです。今回はArduinoのピンから直接駆動するので、インピーダンスの小さいダイナミックスピーカーは使えません。
・カーボン抵抗1/4W 1kΩ×8
普通のリードタイプの抵抗器です。
・プッシュスイッチ×3
PIC版ではロータリーエンコーダを使いましたが、入手性を考えて普通の押しボタンでUP/DOWNということにしました。ブレッドボードに挿せるタイプのタクトスイッチを使えば、ハンダ付けも不要です。


[解説のようなもの]
今回はブレッドボードを使いました。LEDへの配線数が多くて地道な作業になります。
電卓ゲームArduino版ブレッドボード
小さいボードしか持って居なかった上にケーブルが短いので混雑しています。画像はあまり参考にしないでください(笑)

電源は5V、ATmega328PのI/Oに流せる電流は1ピンあたり40mAなので、1セグメントあたり最大でも5mAに抑える必要があります。
今回使用したLEDはVf=約1.8V、3mA程度で十分な明るさがあるので、電流制限抵抗は(5V-1.8V)/3mA = 1066Ωとなりますが、近い値で手持ちのなかから1kΩとしました。
もし青色や白色のLEDで動作させたい場合には、Vf=3.5Vとして計算、(5V-3.5)/3mA = 500Ωとなりますので、抵抗を470Ωから560Ω程度に変更します。お使いになるLEDのスペックシートをよく読んで、電流を流し過ぎないように注意してください。


[スケッチ]
ArduinoIDEは1.0系の1.0.5-r2を使いましたが、恐らく最新のArduinoIDE(1.6.x)でも動作するのではないかと思います。
割り込み処理をするために当初はMsTimer2ライブラリを使っていましたが、サウンド発生用のtone関数がTimer2で競合してしまうため、TimerOneライブラリを使って割り込み処理をかけるようにしました。

tone関数を使って音階を奏でているのですが、どうもノイジーな音になってしまっています。恐らく割り込み処理の優先度の関係?でそうなるのでしょうが、ライブラリの内部でどう処理されているのかは勉強不足で把握しておりませんので、現状はこれで勘弁してください。

ゲームのルールや内容については「ぼくのかんがえたさいきょうのデジタルインベーダーゲーム」を参照してください。

なお、このスケッチ並びに製作記事を参考にされたことによる全ての事象について、私は一切の責任は負いません。[At Own Your Risk]

ソースコードの表示にはGitHub:Gistを利用しています。
スポンサーサイト

テーマ : 電子工作
ジャンル : 趣味・実用

「ぼくのかんがえたさいきょうのデジタルインベーダーゲーム」

猛暑が続いているなか、外に出ると熱射病でやられそうなので、部屋にこもって自称・夏休みの工作などをしてました。

元ネタはその昔、CASIOが販売していた名作・ゲーム電卓シリーズ第一弾の「デジタルインベーダー」で、これを7セグメントLEDとマイコンで再現してみよう、というものです。

当初のコンセプトではなるべくパーツを少なく安くして、初心者でも再現できるようにArduinoコンパチ系で作ろうかと思ったのですが、手持ちのパーツの関係や、自分がArduinoに不慣れなのでついついPICを使ってしまいました。
今後は自分自身の勉強もかねて、Arduino互換バージョンも作ってみようかな?と検討しています。
※追記:Arduino版も作りました!

デジタルインベーダー箱入れ デジタルインベーダー箱開け デジタルインベーダー基板裏


【回路図】
デジタルインベーダー回路図


【主要な部品】

・MCU:PIC16F1938-I/SP
ICSPを完全に分けたので28ピンの石になりましたが、ピン割り当てを工夫すれば20ピン以上のI/Oが使える石ならば利用可能です。シングルモードPWMを1chだけ使っていますがあとは単なるデジタルI/Oなので、PIC16F1938にとっては役不足ともいえます。手持ちの都合です。

・7セグメントLED:ZDS4-G369SRB-7.7
aitendoで特価30円で販売していた7セグメント4桁、カソードコモンのモジュールです。配線と電流制限抵抗を変更すれば他の7セグメントLEDでも使えます。(青色や白色だと電源電圧が不足するので、電池を一本増やして4.5Vにする必要あり)

・デジタルトランジスタ:RN1201
サウンド出力用です。部品点数を極力減らすという目的で、バイアス抵抗が内蔵されているデジトラRN1201を使ってみました。ベースに4.7kΩ程度の抵抗を挟んでやれば2SC1815や2N3904でも代用できます。

・圧電サウンダ(圧電スピーカー)
圧電サウンダ
PWM出力を使って音を出すために使用します。 3Vでは電圧が低くて音量が不足するため、4.7mHのインダクタを並列にして誘導電圧によって音を大きくしています。インダクタがない場合は10kΩ程度の抵抗でも大丈夫です(音は小さくなります)
今回の回路では100mAほど流せるトランジスタを使ったので、小型のダイナミックスピーカーやイヤホンを使うことも出来ます。その場合はインダクタを使わず、DC成分をカットするように100uF程度の電解コンデンサを直列に接続します。ただし消費電力は増えます。

・ロータリーエンコーダ:24クリックタイプ
ロータリーエンコーダ
オリジナルのデジタルインベーダーでは電卓のキーを一回押すたびに数字が一つ進むという方式でしたが、今回は入力装置に制限がないのでロータリーエンコーダをジョグダイヤル的に利用し、右回転で数字の加算、左回転で数字の減算が出来るようにして見ましたので、新感覚の操作性になっています。


【解説のようなもの】
・表示
7セグメントモジュールはカソードコモンのダイナミック表示専用なので、8セグメントにPORTAの8ビット、8桁のドライブにPORTCの8ビットを割り当てます。
本来は、シンク側となる桁ドライブにはドライバトランジスタを入れて十分に電流が吸い込めるようにすべきですが、8桁となると部品点数が増えてしまって配線も面倒ですので、I/Oで直接ドライブしてしまうようにしました。
8bitPICのデジタルI/Oのシンク電流の絶対最大定格は25mAとなっていますので、1桁8セグメントを全点灯させた場合、1セグメントあたりの電流を3mA程度に抑える必要があります。
電源は1.5V乾電池を2個で3V、LEDのVfを実測したところ3mAを流したときに約1.78Vでしたのでそれをもとに(3-1.78)[V] / 0.003 [A] = 406[Ω]という電流制限抵抗の計算になりますが、実際にはI/Oポートの出力電圧は電源電圧より少し低くなるのでそれを加味して、手持ちの中から330Ωを選択しました。

※こういった定格ギリギリにする場合、ソフトウェア製作中に間違ってシンク側のポートが全部ONの状態になって許容電流を超えてしまわないように、注意が必要です。

・サウンド
今回はPWMの出力を使って、ソフトウェアに負荷をかけずに音程を制御することを考えてみました。
ただしPICのPWMでは周波数を細かく制御することはできませんので、簡単に出せる音程の範囲は2オクターブ半程度になりました。
定数のテーブルに音程と音符の長さを列挙することでフレーズを演奏できるようにしました。面倒くさかったのでテンポの指定やループ演奏機能はありませんが、休符を入れなくても音符の切れ目をつくることができるようにタンギング機能をつけました。

・ゲーム
オリジナルのカシオの名作、ゲーム電卓デジタルインベーダーのゲーム内容については「電子ゲームの世界:デジタルインベーダー」ほか、ネット上に色々と情報がありますので検索してみてしてください。

当初は、オリジナルのデジタルインベーダーの仕様に沿って、サウンドなども模倣をしていたのですが、どうせ完全に同じものには出来ないし、折角なので自分の趣味で色々とアレンジをしてみました。
(ゲームモードは二つ)
10進数モード(0から9まで)と16進数モード(0から9に加えてA~Fまで、16の倍数でUFOが出現)
ワンキーで照準を操作していたオリジナルでは16進では難しすぎますが、ロータリーエンコーダを使ったので難易度は下がります。
(ステージごとにインベーダーの数と残り弾薬数が異なる)
ステージごとに「インベーダーの数」と「残り弾薬数」が変わります。例えば残り弾薬が5に対してインベーダー数が5、という緊張感のあるステージや、インベーダー数が80という持久戦ステージを用意しました。
その他にも細かい点が異なりますが、基本的には照準となる左端の数字をインベーダーの数字に合わせてボタンを押して攻撃する、シールドは三回まで、などはオリジナルと変わりません。


ゲーム部分も完成したので箱に入れて自分でテストプレイしてみたところ、ケースの剛性が低いことと、タクトスイッチを押すときの音がうるさくて気になってしょうがないこととが発覚しました(笑)ので、電子工作はしっかりケースに入れるとこまで考えておくのが電子工作なんだなあ、と改めて反省しました。

今後改良するとしたら…
・圧電サウンダはオンボードでもよかった
・スイッチやロータリーエンコーダ、電池ボックスもまとめてオンボードでいいかも
・突起物を減らして全体をコンパクトに
・スリープモードもつけよう
・ヘッドホン端子つけよう
・LED以外の表示器も使ってみよう

てな感じでした。自己満足こそが全て!

[ソースコード]
なお、このソースコード並びに製作記事を参考にされたことによる全ての事象について、私は一切の責任は負いません。[At Own Your Risk]

ソースコードの表示にはGitHub:Gistを利用しています。

テーマ : 電子工作
ジャンル : 趣味・実用

最近の記事
プロフィール

Bonezine

Author:Bonezine
狭い視野で浅はかな発想と奇異な日常を語ります。本気にしちゃだめだよ。

最近のコメント
月別アーカイブ
カテゴリー
最近のトラックバック
ブログ内検索
RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる