スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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

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

元ネタはその昔、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フィード
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。