電子工作で実用的なものを作る場合、一番問題になるのはUI(ユーザーインターフェース)の部分ですよね。機能的には簡単に実装できても、人間が使うボタンなどをまとめたコントローラーを作るのは現実的に難易度が高いです。
ということで、今回は一世を風靡したゲーム機のコントローラー、WiiリモコンをESP32と接続して使う方法を紹介します。
Wiiリモコンとは
説明する必要もありませんが、Nintendoが発売していた家庭用ゲーム機Wiiで使用するゲームコントローラーです。
本体・コントローラーともに、すでに販売/サポートが終了されている製品ではありますが、相当数が売れた製品だけにハードオフなどのリサイクルショップには無限に埋蔵されており入手難易度が低く、お値段も500円~1000円程度とお手頃です。3Dプリンターを持っていたとしてもこのお値段で自作するのは無理ですね。
操作に使えるボタンは十字キー、A、B、HOME、①、②、+、-の8ボタンです。
このほかにも加速度センサーが搭載されていたり、後期モデル(WiiMotionPlus搭載)ではジャイロスコープまで載っていたりするものもありますが、今回はボタン操作のみ使う方法を紹介します。
使えるESP32について
一口にESP32とはいっても、複数のラインナップがあるため注意が必要です。Wiiリモコンと接続できるのはBluetoothClassicに対応しているESP32だけです。
Bluetoothが搭載されていないESP8266系のコントローラーは使えませんし、ESP32でもBluetoothLEにしか対応していないESP32-C3,ESP32-C6,ESP32-S3なども使えません。
また、過去の記事でも書きましたが、amazonなどで販売されているESP32マイコンボードの中にはBluetooth接続が異常に不安定なものもありますので注意してください。
確実なのは秋月電子の以下の製品などです。
ArduinoIDEでESP32を使う準備
(*すでにArduinoIDEでESP32の開発環境が整っている場合は不要です)
[ファイル]-[環境設定]-[設定]タブ
追加ボードマネージャーのURL で以下を追加
!https://dl.espressif.com/dl/package_esp32_index.json
(注記:先頭の!は不要です。Wordpress上の都合で挿入しています。)
[ツール]-[ボード]-[ボードマネージャー]
でESP32で検索、EspressifSystemsのesp32を選択、インストールしてください。
これでESP32のボード群が選べるようになります。
▲今回はLOLIN D32ボードを使用した。この部分は各自の環境に合わせること。
ESP32でWiiリモコンを使う方法
Wiimoteライブラリの追加
ESP32でWiiリモコンを使う要となるWiimoteライブラリをインストールします。
からライブラリをダウンロードし、ArduinoIDEのLibrariesフォルダにコピーすればOKです。(ZIP形式でまとめてダウンロードし、ZIPの中に入っているフォルダをArduinoのlibrariesフォルダにコピーする)
サンプルプログラム1
ライブラリに標準で添付されているサンプルプログラムを使ってみましょう。ライブラリのインストールが正常にできていれば、以下の図のようにスケッチ例があるはずです。
スケッチを書き込み後、ESP32の再起動がかかったら、Wiiリモコンの①と②ボタンを同時押ししてください。4つのLEDが点滅した後、一番左側のLEDが点灯状態となれば接続が完了しています。
シリアルモニタを開き、Aボタンでレスポンスがあるか確認してください。
サンプルプログラム2
これで以上なのですが、このままでは取得したデータとボタンの対応がわかりにくいので次のようなスケッチを作ってみましょう。
#include "ESP32Wiimote.h" ESP32Wiimote wiimote; void setup() { Serial.begin(115200); wiimote.init(); } void loop() { wiimote.task(); if (wiimote.available() > 0) { uint16_t button = wiimote.getButtonState(); char binaryString[17]; // 16ビット分のバイナリ文字列+終端用のヌル文字 for (int i = 0; i < 16; i++) { binaryString[15 - i] = (button & (1 << i)) ? '1' : '0'; } binaryString[16] = '\0'; // 文字列終端 Serial.printf("%s\n", binaryString); } delay(10); }
これでESP32に書き込み&実行してください。押したボタンに対応したビットが1になるのがわかると思います。
getButtonStateで取得できるデータとボタンの対応
上記プログラムで確認したgetButtonState()で取得したデータとそれに対応するボタンのデータは以下のようになっています。
getButtonState() | 0b1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
リモコン側ボタン | + | ↑ | ↓ | → | ← | HOME | なし | なし | - | A | B | ① | ② |
ここまでわかれば、どのボタンが押されているかビット演算でマスクして確認すればOKですね。
もちろん、最初のサンプルプログラムのように
if (button == ESP32Wiimote::BUTTON_A)
としてもOKです。ボタン名の定義はESP32Wiimote.hにあります。
enum { BUTTON_LEFT = 0x0800, BUTTON_RIGHT = 0x0400, BUTTON_UP = 0x0200, BUTTON_DOWN = 0x0100, BUTTON_A = 0x0008, BUTTON_B = 0x0004, BUTTON_PLUS = 0x1000, BUTTON_HOME = 0x0080, BUTTON_MINUS = 0x0010, BUTTON_ONE = 0x0002, BUTTON_TWO = 0x0001 };
ボタン押下の検出さえできれば、あとは煮るなり焼くなり好きに使えばOKです。
コメント