武蔵野電波のプロトタイパーズ
Arduino Esploraを究極の連射ゲームパッドにしよう
(2013/12/10 06:00)
誰にでもお気軽に楽しめるArduino Esplora登場
「武蔵野電波のプロトタイパーズ」をご覧の皆様、ご機嫌いかがでしょうか。自称武蔵野電波見習いのゲヱセン上野と申します。2011年に「ピポパ音を解読するDTMFデコーダを作ってポケベル打ちに挑戦!」の回でお目にかかって以来の登板となりますが、お変わりありませんか? といった挨拶はこのぐらいにして、早速本題に入りましょう。
今回紹介するのは、「Arduino Esplora」(以降Esplora)の楽しげでマニアックな活用法です。
「Arduino」とは、Atmel AVRマイクロコントローラ搭載の小型マイコンボード+開発環境の総称。本連載でもたびたび登場しており、「ますます楽しくなった、新しいArduino」とそのリンク先でArduinoの概要や応用例を読むことができます。Arduinoボード単体では、ボード上のLEDをチカチカ点滅させること(略して「Lチカ」と呼ばれます)くらいしかできないのですが、電子回路を別途追加することにより用途は大きく広がります。
ところが、ハードウェアの苦手な人にとってはこの拡張性が取っつきにくい部分でもあります。ソフトウェアの知識はあっても電子工作が苦手だと、Arduinoが持つポテンシャルを存分に引き出せません。
でも、今回紹介するEsploraなら心配は無用。ゲーム機のコントローラのような基板上に各種入力装置やセンサーがあらかじめ実装されているので、ソフトウェアの製作だけでArduinoの世界をかなり楽しむことができます。ハードウェアが苦手でArduinoを敬遠していた人にはお勧めの「入門機」といえます。
国内では共立エレショップや、スイッチサイエンスで購入可能です。Esploraに直接搭載できるTFT LCD(液晶ディスプレイ)も、共立エレショップとスイッチサイエンスが扱っています。
【Arduino Esploraに搭載されている入出力デバイス】
- 2軸アナログジョイスティック(センターボタン付き)
- ボタン×4
- スライダー
- 光センサー
- 3軸加速度センサー
- 温度センサー
- マイク
- ブザー
- RGB LED(赤緑青の3原色が一体となったLED)
- TFT LCDコネクタ(TFT LCDモジュールは別売)
Arduino IDEをインストールしよう
では、Esploraを使ってArduinoスケッチの製作を始めましょう。今回は、初めてArduinoに触れる方のために開発環境の導入手順から解説します。すでにArduinoに精通している方は読み飛ばして構いません。
まずはArduino公式サイトで、Arduino IDE(開発環境)を入手します。Windows版、Mac OS X版、Linux 32bit版、Linux 64bit版の中から自分のPCに適合したバージョンをダウンロードしましょう。
Windowsならインストーラ付きの「Windows Installer」をダウンロードすると、インストールが簡単です。Macintoshの場合はzipファイルを展開し、Arduino(.app)をアプリケーションフォルダへ移動してください(2013年12月4日現在、Arduino 1.0.5と、Arduino 1.5.5 BETAの2種類が公開されていますが、どちらもEsploraに対応しています)。その後、EsploraとPCをUSBケーブルで接続すれば、デバイスドライバが自動的にインストールされます。
続いて、Arduino IDEを起動し、マイコンボードとシリアルポートの設定を行ないましょう。これを忘れると、スケッチのコンパイル時にエラーが発生したり、スケッチの転送に失敗します。
スケッチの基本を覚えよう
Arduinoを動作させるためのユーザープログラムは「スケッチ」と呼ばれ、C/C++風の言語で記述します。標準的なC/C++言語では最初に実行する処理をmain()関数に記述しますが、Arduinoではmain()は不要です。その代わりにsetup()、loop()が必要になることを覚えておきましょう。
setup()は起動時やリセット時に一度だけ実行される関数で、主にI/Oやデバイスを初期化するための処理を記述します。loop()はsetup()実行後にくり返し実行される関数で、通常はメインの処理を記述します。
そのほか、スケッチの言語仕様やライブラリに関しては「Arduino 日本語リファレンス」で詳細に解説されています。ぜひ目を通しておいてください。
以下は、Esplora用に記述したサンプルスケッチです。
#include <Esplora.h> // Esploraライブラリを使用 // セットアップ(起動時やリセット時に一度だけ実行される) void setup(){ // ブザーを1秒間鳴らす Esplora.tone(440, 1000); // 440Hzのブザーを1秒間(1000ミリ秒)発音 } // メインループ(くり返し実行される) void loop(){ int brt; // スライダーで緑LED明度を調節する brt = Esplora.readSlider() / 4; // スライダーの値(0~1023)を4で割る Esplora.writeGreen(brt); // 緑LED明度設定(0~255) delay(100); // 0.1秒間(100ミリ秒)休止 }
このスケッチは下記のURLからダウンロードできます。
http://www.musashinodenpa.com/arduino/lib/esplora/sample.ino
ダウンロードしたスケッチをArduino IDEで開くか、ブラウザからIDEのエディタへコピペして、ウインドウ左上の「→」(マイコンボードに書き込む)をクリックしてみましょう。コンパイルとEsploraへの書き込みが完了すると、setup()が実行され、ブザーが「ピー」と鳴るはずです。その後、処理がloop()へ移り、スライダーでRGB LEDの緑の明るさを変えられるようになります。
上記スケッチのようにEsplora.hをincludeすれば、Esploraライブラリ関数を利用してEsploraボード上のデバイスを簡単に扱えます。Esploraライブラリの詳細については次のサイトで解説されています。
・Arduino公式サイト「Esplora library」(英語)
http://arduino.cc/en/Reference/EsploraLibrary
Esploraライブラリ関数の引数については、Esplora.hに記述されている定数定義も参考になるでしょう。
・Esplora.h
https://github.com/arduino/Arduino/blob/master/libraries/Esplora/Esplora.h
古の通信手段、モールス符号で温度を知る
Arduino IDEとスケッチの基本を押さえたところで、手軽に楽しめる、実用的でちょっとマニアックなスケッチを2本紹介します。最初は古の通信手段を使った「モールス温度計」です。
Esploraにはジョイスティックやボタン、各種センサーなど、入力デバイスが豊富に搭載されていますが、出力デバイスはRGB LEDとブザーのみです。別売りTFT LCDを接続して文字やグラフィック表示を行なう手もありますが、出費がかさんでしまいます。そこで「モールス符号」の出番! 「SOS」を「トトトツーツーツートトト」のように断続音で伝達するアレです。
スケッチは次のURLからダウンロードできます。
http://www.musashinodenpa.com/arduino/lib/esplora/morsethermometer.ino
1836年にサミュエル・モールスが考案したモールス符号は、短点と長点の組み合わせで文字を表現する文字コードであり、主に船舶通信などで使われてきました。長短2種類のシンプルな音や光で文字を伝送するモールス符号はノイズに強く、長距離通信に適していましたが、衛星通信の発達とともに衰退。現在では、アマチュア無線や自衛隊などで使われている程度です。
栄枯盛衰を感じる淋しい話になってきましたが、ともあれ「モールス符号」であれば、Esplora単体でも光の明滅やブザーの断続音で情報を伝達することが可能というわけです。
モールス温度計のスケッチをダウンロードしたら、Esploraへ転送し、動作させてみましょう。マイクに向かって音を鳴らすと(例えば指をパチンと弾くと)、ブザー音とLEDの明滅によるモールス符号で温度を知らせてくれます。もし、モールス温度計が実際の室温と異なる場合は、スケッチ7行目の“temperatureAdjust”の値を変えてみてください。誤差を補正することができます。
ちなみに、モールス温度計が発するモールス符号は0~9の数字のみ。下記の表を覚えて活用しましょう。スケッチ内にはアルファベットや記号のモールス符号も記述していますので、興味があれば覗いてみてください。
1 | ・---- | 6 | -・ ・ ・ ・ |
2 | ・ ・--- | 7 | --・ ・ ・ |
3 | ・ ・ ・-- | 8 | ---・ ・ |
4 | ・ ・ ・ ・- | 9 | ----・ |
5 | ・ ・ ・ ・ ・ | 0 | ----- |
Arduino IDEの「シリアルモニタ」を利用すると、スケッチ開発時の動作確認やデバッグに大変役立ちます。シリアルモニタへ文字を表示するには、setup()内でSerial.begin()を実行してシリアルポートを初期化し、さらにSerial.println()やSerial.print()を呼び出します。実際の使用例はモールス温度計スケッチを参考にしてください。
究極のEsplora連射ゲームパッドで遊ぼう
続いて、Esploraならではのスケッチ「連射ゲームパッド」の紹介です。Esploraは、USBケーブルで接続したPCへ任意のキーコード(マウスボタン含む)を送信したり、PCのマウスカーソルを動かしたりできます。Esploraを連射ゲームパッド化するには、スティック操作でカーソルキーのキーコードを送信し、ボタンが押されたときには特定の文字を連続送信するスケッチを作成すればよいわけです。
スケッチは次のURLからダウンロードできます。
http://www.musashinodenpa.com/arduino/lib/esplora/gamepad.ino
このスケッチではボタンを押しっぱなしにするだけで、最高50回/秒の速さでボタンを連打できます。敵の弾幕をかいくぐりながら応戦するシューティングゲームなどで使えば、みるみるスコアが上がること間違いなし!(効果には個人差があります)。
スケッチ書き込み直後やリセット直後は連射モードがオフになっているので、「アナログスティックのセンタースイッチを押したまま、連射したいボタンを押す→離す」で連射モードをオンにしてください。
なお、このスケッチではMsTimer2ライブラリを用いたタイマー割り込みで、各種処理を行なっています。スケッチをコンパイルするには、あらかじめ次の手順でArduino IDEにMsTimer2ライブラリを導入しておく必要があります。
(1)PJRCサイトで「MsTimer2.zip」をダウンロードする。
(2) Arduino IDEのメニューから、スケッチ→ライブラリを使用→Add Library...を選択し、(1)でダウンロードした「MsTimer2.zip」をインストールする。
タイマー割り込みを使うと一定時間ごとに指定した関数を呼び出すことができ、周期的に正確なタイミングで処理を実行したいときに便利です。このスケッチでは100分の1秒(10ミリ秒)毎にtimerInterrupt()関数が呼び出され、アナログスティックとボタンの入力、PCへのキーコード出力(連射)を行なっています。
ちなみに、デフォルトでは下ボタンで「z」、左ボタンで「a」、上ボタンでスペース、右ボタンで「x」のキーコードを送出しますが、スケッチ18~21行目を改造すればほかのキーに変更できます。そのほか、次のような改造も可能です。
【改造1】
18~21行目の出力キーに、MOUSE_LEFT、MOUSE_RIGHT、MOUSE_MIDDLEのいずれかを指定すれば、マウス左ボタン、マウス右ボタン、マウス中央ボタンを送信できます(これらを指定する場合は''で括らないでください)。
【改造2】
13行目「MOUSE_MODE = false」のfalseをtrueに変更すると、アナログスティックでマウスカーソルを操作できます。41行目「DIV_XY = 64」の値を変えることで、マウスカーソルの移動速度が変化します。
【改造3】
35行目「MSTIMER2_INTERVAL = 10」の値を小さくすると、最高連射速度が上がります(改造2の「MOUSE_MODE = true」を行なった場合はマウスカーソルの移動速度も上がります)。ただし、あまりにも速くするとPC側でキー入力を取りこぼしたり、システムが不安定になることがあります。
キーボード、マウス操作を行なうスケッチが暴走したとき
キーボード・マウスエミュレーションを行なうスケッチが想定外の動作をすると、マウスが操作不能になったり、不必要な文字が大量に送信されたりすることがあります。その場合は以下の手順どおりに操作して、Esploraに正しく動作するスケッチを書き込んでください。
(1) EsploraのUSBケーブルを抜く。
(2) Arduino IDEで、正常に動作するスケッチを開く(または作成する)。
(3) EsploraのRESETボタンを押したまま、USBケーブルをPCに接続する。RESETボタンは(5)まで押したままにしておく。
(4) Arduino IDEで、「マイコンボードに書き込む」を実行する。
(5) すぐにEsploraのRESETボタンを離す。
今回紹介したスケッチは、Esploraに秘められた可能性の一端にすぎません。アイデア次第でさまざまに応用できますし、TFT LCDを追加すればコンパクトなゲーム機としても使えます。Arduino未体験の人にこそお勧めしたいEsploraに、ぜひ挑戦してみてください。