武蔵野電波のプロトタイパーズ

Arduino Esploraを究極の連射ゲームパッドにしよう

誰にでもお気軽に楽しめる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 Esploraパッケージ。本体基板をモチーフにしたイラストが描かれています
基板サイズは約165×60mm。ATmega32u4マイクロコントローラー(16MHz)、フラッシュメモリ 32KB(うちブートローダー4KB)、SRAM 2.5KB、EEPROM 1KBを搭載しており、基本スペックはArduino Leonardoと同等です
基板上のデバイスやセンサーの位置を確認しましょう。上部にはブザーと光センサー、中央には三次元加速度センサーと温度センサー、下部にはマイク、スライダー(リニアポテンショメーター)とRGB LEDが配置されています。縦に並んだ2つのピンソケットには、別売のTFT LCDを取りつけることができます
基板表面、裏面ともに端子がむきだしになっています。ゲームパッドとして利用する場合、手に汗握るほどにエキサイトすると導通しそうで少々心配ですね。カバーを付けるか、できるだけ端子に触れないように操作しましょう
Micro USB端子を通じてPCからEsploraへスケッチ(プログラム)を転送したり、EsploraからPCへ各種データを送信したりすることができます。駆動用の5V電源もMicro USBで供給します。左右の4つのコネクタは、TinkerKitと呼ばれる小型モジュールを接続するためのものです
別売りのTFT LCDを取り付け、Arduino IDEに含まれるスケッチの例「EsploraTFTTemp」を実行してみました。1秒毎に温度センサーの値を読み取って、TFT LCDに表示します。このスケッチを読み込むには、Arduino IDEのファイルメニューから、スケッチの例→TFT→Esplora→EsploraTFTTempの順に選択します
TFT LCD裏面にはmicroSDカードスロットを装備しており、ライブラリを用いてSDカードへアクセスできます。Esploraへは、このスロットが上方(Micro USB端子側)になるように取り付けます

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ボード名がズラリと表示されます。この中から「Arduino Esplora」を選択しましょう
シリアルポートの設定は、メニューバーからツール→シリアルポートを開いて行ないます。Esploraを接続すると新しいポートが自動的に用意され、Windowsなら「COM○○」、Macintoshなら「/dev/tty.usbmodem○○」という名前でメニューに表示されます
Arduino IDEをインストールし、マイコンボードとシリアルポートの設定が済めば、スケッチ製作を始められます。作成したスケッチは、コンパイル後にEsploraへ転送されます

スケッチの基本を覚えよう

 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の緑の明るさを変えられるようになります。

スライダーを右へ寄せるとLEDが暗くなり、左へ寄せると明るくなります。スケッチ内で使用しているEsplora.readSlider()は、スライダー値0~1023(右~左端)を返す関数です。RGB LEDの緑明度を設定するEsplora.writeGreen()は引数の上限が255なので、スライダー値を4分の1にした値を渡しています

 上記スケッチのように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-----
モールス温度計スケッチを転送し、モールス符号で「OK」(--- -・-)が聞こえれば準備完了。マイクに向かって手を叩いたり、指を鳴らしたりすれば、温度をモールス符号で伝えてくれます。スライダーを右に寄せるほど小さな音に反応するので、適切な感度に設定しましょう
モールス温度計スケッチでは、温度をモールス符号で鳴らすと同時に、その値をシリアルポートへ出力しています。Arduino IDEのツールメニューにある「シリアルモニタ」を開き、確認してみましょう

 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へのキーコード出力(連射)を行なっています。

ボタンの連射機能をオンにするには「アナログスティックのセンタースイッチを押したまま、連射オンにしたいボタンを押す→離す」と操作してください。再度同じ操作を行なえば連射オフにできます。連射速度の設定はスライダーで行ない、左に寄せるほど連射スピードがアップします
連射機能のテストに最適なのが、連射力測定サイト「シュウォッター」です。Twitter ID入力後、測定するボタンを選択しましょう。あとはひたすらボタンを連打するか、連射機能をオンにしてボタンを押しっぱなしにすればOKです。結果をTweetすることもできます
画面中央の惑星を守り抜くため、宇宙より飛来する敵を迎撃するシューティングゲーム「Planet Protector」をプレイ中。連射機能をオンにしてプレイすれば、画面内を無数の弾が縦横に駆けめぐりすこぶる爽快です

 ちなみに、デフォルトでは下ボタンで「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側でキー入力を取りこぼしたり、システムが不安定になることがあります。

改造3を施し、シュウォッターで連射速度を再計測! 「MSTIMER2_INTERVAL = 2」と設定することで、約250連射/秒を達成できました!

キーボード、マウス操作を行なうスケッチが暴走したとき

 キーボード・マウスエミュレーションを行なうスケッチが想定外の動作をすると、マウスが操作不能になったり、不必要な文字が大量に送信されたりすることがあります。その場合は以下の手順どおりに操作して、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に、ぜひ挑戦してみてください。

(武蔵野電波)