小ネタ 2005-018

PSPに加速度センサ(重力センサ)をつないでみた

PSPのリモコンポートを使って、PSPに接続する加速度センサ(重力センサ),(==傾斜センサ)を製作してみた。とりあえず動く物ができたので記録を残す。


1. ハードウェア

 
 製作したセンサ(PSP tilt sensor)の写真

 回路図は、以下の通り。
 
・加速度センサ(重力センサ)は、アナログデバイゼス社のADXL202Eを用いた。これは、任天堂の「コロコロカービィ」や「ヨッシーの万有引力」に使われているセンサーADXL202と同等のセンサICである。
・ワンチップマイコンを用いてセンサから入力値を得て、PSPにシリアル通信で転送している。
・ワンチップマイコンに書き込んだプログラムはC言語で作成した。バイナリのみ公開する。
・基板の下側にミニUSBコネクタが取り付けてあるが、これはPSPとの機械的な固定用に使っている。電気的には接続していない。


2. ソフトウェア

 PSP側のソフトは、Luaという言語で作製した。

 [ PSP用の加速度センサ/重力センサ入力ソフト,Luaのスクリプト (download) ]

 
 作製したソフトの動作画面

・起動したあと、最初に△ボタンを押して水平での原点のリセットを行う。
・あとはPSPを傾けたり振ったりすると、画面中心の十字が上下左右に動く。
Hgハイドリウムとかのゲームをこういうセンサで遊んでみたい。

[ 実際に動作させてみたところの動画 (864KB) ]
[ MPEG1形式に変換した動画 (2.39MB) ]


3. 問題点

 ちょっと反応が鈍い感じである。シリアル通信で1バイト通信するごとに18msecのウェイトを入れているせいである。1回分のデータが8バイトなので合計144msecも余分に時間が掛かる。

 Luaを使わずに直接シリアル通信するソフトを書けば速くなると思われる。
 PSP_UART4_FIFOというポートが0xBE500000番地にあるので、このポートに書き込んだり、読み出したりすれば直接シリアル通信できる。
 シリアル送信は、 *(volatile unsigned int *)0xBE500000 = c; で、シリアル受信は、c = *(volatile unsigned int *)0xBE500000;と書くだけである。
 ただし、PSP_UART4_STATというポートで送受信ステータスをチェックをする必要があるので注意。