今回製作したものはAT90S4414と加速度センサ、LEDドットマトリックス・ディスプレイを使用したボール転がしゲーム機です。試作基板とケースに組み込んだものを写真1と2に示します。■ 加速度センサADXL202
写真1
写真2
ゲームは図2のように、小箱の中でボールを転がすイメージです。ボールは小箱の傾斜により転がりますが、このゲーム機では傾斜量をセンサで検出し、ボールの運動をシミュレートし、図2のようにLEDマトリックスの中を光点がボールのように移動します。このように光点が移動するだけではゲーム性が弱いので、LEDマトリックス上にランダムにターゲットを点灯させ、ボールがターゲットに衝突すればターゲットが消滅し、次のターゲットが表示されるようにしました。LEDマトリックスの数を増やすほどリアルなボールの動きを再現できます。このような用途にはLEDを駆動できる能力を持った単純なI/Oポートが多数必要となります。このような用途にはAVRマイコンAT90S4414が打って付けです。AT90S4414は32本のI/Oポート持っていますが、13本のI/Oポートを持つPIC16F84と同程度の価格で販売されています。
図1 ゲームのイメージ
加速度センサにはアナログ・デバイセズ社のADXL202を用いました。このセンサは直交する2軸の加速度を検出することができます。これは秋月電子通商でチップ単品、あるいは表示キットの形で販売されています。図2にセンサのブロック図を示します。測定レンジは±2g(1g=9.8m/s2)、分解能は0.005gで、DC〜500Hzまでの周波数応答(コンデンサCxとCyにより変更可能)を持っています。作動電源範囲が2.7V〜5.25Vと広く、消費電流も0.6mAと少なく、サイズも10mm×10mm程度と、乾電池駆動には最適です。加速度はアナログ出力の他に、図2のようにパルスのデューティ比から得られるようになっています。加速度の検出方向は図3のAx及びAy方向です。■ 回路
図2 ADXL202のブロック図
図3 ADXL202の加速度検出方向
図4に全回路図を示します。LEDドットマトリックス・ディスプレイには5×7ドット構成の三洋SLA-8784を6個使用しました。LEDはAT90S4414のI/Oピンを29本使用し直接駆動します。あと加速度センサからの信号を入力するのにI/Oピンを2本、効果音を出すための圧電サウンダ(FDK EE24K-37F110-3V)に1本使用し、32本のI/Oピンは全て使い果たしました。加速度センサのRSET端子には100kΩととりつけました。これによりパルス周期(図2のT2)は約0.8msとなります。また、Cx及びCy端子には0.1μFのコンデンサを取り付け、バンド幅を50Hzとしています。■ 製作
図4 回路図
加速度センサADXL202はハーフピッチのサーフェイスマウント・タイプであることから、ピッチ変換基板上に取り付けてあります(写真2参照)。ピッチ変換基板はユニバーサル基板上に接着剤で固定しました。LEDドットマトリックス・ディスプレイの座標軸を図5のように決めましたので、加速度センサはLEDドットマトリックス・ディスプレイに対して図5のように取り付ける必要があります。■ プログラム
図5 加速度センサ取り付け方向
図6に使用したプログラムのフローチャートを、 リスト1(LED15x14.asmをZIPにて圧縮)にプログラムリストを示します。■ ゲームの手順チップの初期化後、タイマ/カウンタ0により約2.0msec毎の割り込みを発生させます。AT90S4414のクロックは4MHz(周期0.25μ秒)としたので、プリスケーラを1/64、タイマ初期値を128とすることで、128×64×0.25μ秒=2.048m秒となります。割り込み処理ルーチン内における動作はJMODEレジスタにより制御されます。電源投入後約3.5秒間は初期動作(JMODE=16〜31)となり、その後JMODE=31,32で初期加速度を測定し、以後ゲーム処理(JMODE=0〜15)となります。
図6 フローチャート
● LED表示処理LEDドットマトリックス・ディスプレイの各ドットには図7のようにSRAMを割り当ててあります。ドットを点灯するときは対応するビットを1とします。これによりLED表示処理は、順次PB0-7,PD0-6にSRAMのデータを出力し、PA0-7,PC0-5のピンを1つづつLowにすることになります。 また、LEDはX軸方向に15、Y軸方向に14あるため、X軸方向の座標値を0〜14、Y軸方向の座標値を0〜13として、(x,y)座標を指定して点灯するようにしました。● 加速度の測定
図7 LED表示用SRAMエリア加速度は図2のT1時間を測定することで行いました。タイミングチャートを図8に示します。加速度センサのXOUT及びYOUT出力は図のように約0.8msの周期のパルスとなります。一方、AVRマイコンは約2.0ms間隔で割り込みをかけていますから、1回の割り込み時間内でXOUT(又はYOUT)についてHighとなっている時間を調べることができます。Highとなっている時間はタイマ/カウンタ1(16ビット長)を使って2μ秒の精度(プリスケーラを1/8とすることで、0.25μ秒×8=2μ秒)で得ることができます。また、電源投入後に初期加速度を調べ、これを0gとするようにします。● ボール運動の計算
図8 タイミングチャートボールに加わる加速度ベクトルを(ax,ay)、現在の速度ベクトルを(vx0,vx0)、現在位置を(x0 ,y0)とすると単位時間後の速度(vx,vy)及び位置(x,y)は、
vx = ax + vx0 、x = vx + x0 ・・・・・・・・・・(1)
vy = ay + vy0 、y = vy + y0
と近似されます。よって位置は加速度から簡単な計算で求まります。ただし、これではLEDの実スケールと位置(x,y)は一致しませんから、スケーリングが必要となります。今回の加速度センサの感度(1カウントあたりの加速度)、加速度測定間隔(32ms)、LEDのドット間隔(2.54mm)から計算すると、(1)式でXOUT(又はYOUT)のカウント値をax及びayとして計算した位置を約1/16すれば実際に斜面を転がるボール運動を再現できることがわかりました。しかし、LED表示エリアが小さいため、ボールがすぐに壁面に衝突するため、重力が1/4になるようにしました。よって、位置を1/64(すなわち6ビット右にシフト)してLEDの表示座標(X軸方向は0〜14、Y軸方向は0〜13の範囲)としています。なお、ボールが壁面及びターゲット衝突したときには速度を反転するようにしました。
このようにビットシフトによる桁落ちを防ぐために、加速度や位置を格納する変数は16bit長とました。
電源スイッチをONすると、0.5秒毎に音が鳴り、4つの光点がLEDドットマトリックス・ディスプレイの中央に向かって動きます。そして光点がディスプレイの中央に達した時の姿勢を記憶します。以後、ゲームが開始されます。ゲーム機を傾けても動かない光点がターゲットで、これにボールが衝突すると音が鳴り、次のターゲットが表示されます。このゲームには得点やゲームオーバーは無く、電源をOFFするまでゲームが続きます。■ 参考文献
ゲームの様子クイックタイム・ムービー
- Atmel社の各種PDF文書
- アナログ・デバイセズ社ADXL202データシート(和文)