これまで色々なコントローラーをPCやゲーム機につなげてきましたが、これらのコントローラーでは上手く遊べないタイプのゲームがあります。
それはブロック崩しです。市販のゲーム機などではブロック崩し系のゲームと一緒にパドルコントローラというものが売られています。でも、PCにつないで汎用的に使えるパドルコントローラはあまり多くありません。アマゾンなどで販売されてはいますが、比較的高価でわざわざ購入する気になりません。
なぜパドルコントローラが欲しいと思ったかというと、UbuntuのリポジトリにあるLBreakout2というゲームが結構面白そうだったからです。(こちらのサイトで詳しく紹介してくれています)
フリーなのに本格的で、昔ゲームセンターで遊んだアルカノイドに似ています。操作にはカーソルキーとマウスが使えます。カーソルキーでの操作は論外ですが、マウスでの操作ならそこそこ遊べます。でも、細かな操作(バーの角でボールを弾くとかバーを高速移動させる等)を行おうとすると、バーを思った場所にきっちり止められなくて結構ストレスを感じるのです。
Arduinoと回転する入力デバイスがあれば、マウス操作を行えるパドルコントローラを作るのは難しくはないでしょう。
回転デバイスとしてすぐに思いつくのは、ロータリーエンコーダとポテンショメータです。ロータリーエンコーダはマウスホイールなどに使われています。古くて使わなくなったマウスを幾つも持っているので、これはすぐに用意できます。ポテンショメータ(可変抵抗)は、たまたま所持しているものがあるのでこれもすぐに使うことが出来ます。
ということで、まずはこれらとArduinoを使ってマウスのX軸方向の動きを入力するデバイスを作って、パドルコントローラにできるのかテストしてみることにしました。
最初はロータリーエンコーダで試してみます。ArduinoはPro Micro(互換機5V動作)を使います。
使うのは古いマウスからはぎ取ったホイールです。
ロータリーエンコーダは回転させると内蔵の2つのスイッチがタイミングをずらしてオン・オフされます。このオン・オフの順番を調べれば、左右どっちに回転されたのかが分かる仕組みになっています。詳細についてはネットに山ほど情報があるので必要なら確認してみて下さい。
2つのスイッチの変化を調べるのに普通は割り込みを使うのですが、きちんと処理しようとすると割り込みを2つ利用することになります。それでも構わないのですが、最終的にパドルコントローラに仕上げてから機能を拡張したくなったときに、3個しかない外部割り込みのうちの2個を専有してしまっているのはちょっともったいない感じです。できれば外部割り込みは1つにしておきたいところです。そこでまずは片方のスイッチのオン・オフを割り込みで拾い、回転数と回転方向を取得してみることにしました。
前にコントローラーを作った時のPro Micro基板を再利用していますが、気にしないで下さい。
スケッチはこちら。
ProMicroRotaryEncoderMouse.ino
片方のスイッチの変化だけを拾っているので、回転の分解能は通常の半分になります。スケッチでは計測した回転数を4ビットシフト(16倍)にしてマウスの移動量に変換しました。LBreakout2を操作するのにこのくらいが良さそうだったからです。シフトを使ったのは普通の掛け算より処理が早そうな気がしただけで、深い意味はありません。効果はほとんど無いでしょうけど。
実際にLBreakout2で遊んでみると操作には問題が無いのですが、バーの動きが少しカクカクしてなめらかではない感じです。特にロータリーエンコーダをゆっくり回した時にカクカクした感じが顕著に現れます。
そこで割り込みを2つ使ったスケッチに書き換えてみました。
ProMicroRotaryEncoder2Mouse.ino
回転の分解能が倍になったので、マウスの移動量は回転数を3ビットシフト(8倍)するように変更しました。LBreakout2で試してみると、バーの動きもだいぶなめらかになり操作性も問題ありません。ロータリーエンコーダの回転に合わせてバーもきちんと動きます。かなり良い感じになりました。割り込みを多用するのはうれしくないですが、これならコントローラーとして使い物になりそうです。
ロータリーエンコーダが良い結果に終わったので、次はポテンショメータで試してみます。
つまみには、いらなくなったマウスのホイール部分を加工したものを付けてみました。
ポテンショメータはロータリーエンコーダと違って回転により抵抗を変化させて電圧の変化を読み取るだけなので、割り込みを使う必要もなく簡単に扱えます。3つの端子の両側を電源につなぎ、真ん中の端子をArduinoのアナログ入力につなぎました。
スケッチはとてもシンプルになりました。
ProMicroPotentiometerMouse.ino
このポテンショメータをPCにつないでみたところ、入力されるアナログ値が微妙に変化し続けていてマウスカーソルが小刻みに振動してしまい静止しませんでした。そこで上記スケッチでは入力値の下位3ビットをカットし、ループ内にdelay()を入れることで変動する数値を安定させようとしています。これで多少の変動は抑えられましたが、ポテンショメータの回転位置によっては変動が大きすぎて抑えきれていません。もっと品質の良いものならノイズも少ないのでしょうが、手持ちのポテンショメータはどれも同じような感じでした。
LBreakout2で試してみると動きはなめらかで文句ないのですが、やはり時々バーが左右に小刻みに震えてしまうのが気になります。回転もマウスホイールのロータリーエンコーダほど軽くなく、ちょっと重い感じです。残念ながら手持ちのポテンショメータではいまいちな結果になりました。
ということでロータリーエンコーダを使ってパドルコントローラを作ることにします。
※コメント投稿者のブログIDはブログ作成者のみに通知されます