XIAO ESP32S3を使ってみる その2(コントローラの作成、Unreal Engineの操作)
はじめに
今回は大阪の共立電子にて、ゲームセンターで使われるようなジョイスティックを購入したので、Unreal Engineの操作に使えるようにしてみました。
マイコンのHID機能を利用しています。
▼以前にもXIAO ESP32S3のHID機能を利用したことがあります。
▼以前の記事はこちら
使用する部品
▼今回購入したジョイスティックはこちらです。

▼オンラインショップにもありました。
https://eleshop.jp/shop/g/gJ66312/?srsltid=AfmBOooj6rDYOm3ZEU0QFRkLm6unPEnOimy99iW8D1gCsoY6WbfcLV-_
▼開封するとこんな感じ。

レトロな操作感があっていいですね。リミットスイッチが前後左右に4つ、レバーのボタンに1つの計5つ取り付けられています。
結束バンドで固定されていたので、切っておきました。
▼レバー部分は取り外せるようになっています。

▼今回は利用していませんが、ネジもついていました。

▼Amazonでもジョイスティックが販売されていました。
マイコンはXIAO ESP32S3を用いました。
▼Wi-FiやBluetoothの機能を使わないのはもったいない気がしますが、利用したことがあって小型なので選びました。
筐体の設計
ジョイスティックのままでは掴むところが無いので、Fusion 360で簡単な筐体を設計しました。
▼ジョイスティックを収めるとこんな感じ。ただの箱です。

四隅をM5のネジで固定するようになっています。
▼底面にマイコンが入っており、USBで接続できるようになっています。

蓋もできるのですが、単に内壁との隙間0でピッタリはまるようにしています。
マイコンのプログラミング
マイコンのHID機能を利用して、リミットスイッチの状態をキーボードの入力としてPCに送信します。
プログラムはChatGPTと相談しながら作成しました。ピン番号は配線次第なので、適宜変更してください。
#include <Arduino.h>
#include "USB.h"
#include "USBHIDKeyboard.h"
#define BTN_SPACE D0
#define BTN_W D4
#define BTN_A D3
#define BTN_S D2
#define BTN_D D1
USBHIDKeyboard Keyboard;
void setup() {
Serial.begin(115200);
pinMode(BTN_SPACE, INPUT_PULLUP);
pinMode(BTN_W, INPUT_PULLUP);
pinMode(BTN_A, INPUT_PULLUP);
pinMode(BTN_S, INPUT_PULLUP);
pinMode(BTN_D, INPUT_PULLUP);
USB.begin(); // USB 初期化
Keyboard.begin(); // キーボード機能開始
Serial.println("USB Keyboard Ready!");
}
void loop() {
if (!digitalRead(BTN_SPACE)) {
Keyboard.press(' '); // スペースキーを押す
Serial.println("Space Pressed");
} else {
Keyboard.release(' '); // スペースキーを離す
}
if (!digitalRead(BTN_W)) {
Keyboard.press('w');
Serial.println("W Pressed");
} else {
Keyboard.release('w');
}
if (!digitalRead(BTN_A)) {
Keyboard.press('a');
Serial.println("A Pressed");
} else {
Keyboard.release('a');
}
if (!digitalRead(BTN_S)) {
Keyboard.press('s');
Serial.println("S Pressed");
} else {
Keyboard.release('s');
}
if (!digitalRead(BTN_D)) {
Keyboard.press('d');
Serial.println("D Pressed");
} else {
Keyboard.release('d');
}
delay(10); // CPU負荷を軽減
}
PCのキーボードで操作するゲームは、WASDで前後左右、Spaceでジャンプなどの動作を行うことが多いです。それらのキーを設定しておけば、使いやすいかと思います。
なお、プログラムを書き込むときは、書き込みモードにしないと認識しないことがあるのでご注意ください。
▼こちらの記事でも、書き込み時の注意点について触れています。
操作してみる
実際にジョイスティックを使って操作する、ゲームっぽい環境をUnreal Engineで作成してみました。
▼落下しないように進む環境を作成しました。動画では簡単にクリアしていますが、意外と難しいです。
カメラの操作はマウスになってしまうので、VRゴーグルがあれば視点を変えながら操作しやすいかもしれません。
最近Unreal Engineで自動運転のシミュレーションを行っていたのですが、その空間で自動車の操作もできるようにしてみました。
▼橋の上を走行しています。これは視点が勝手に移動するので、ジョイスティックだけで操作しやすいです。
車なので、ハンドルとアクセルで操作したいところですね。共立電子ではフットスイッチも販売されていました。
最後に
子どもたちに操作を体験してもらう機会があったのですが、熱中して遊んでいました。大人の方もUnreal Engineのグラフィックにびっくりしていました。
3Dプリンターで作成した部品の密度が5%だったのですが、子どもたちが遊んでいても壊れなかったので、強度的には大丈夫そうです。厚みがあるからだと思います。
Unreal Engineの操作だけでなく、子どもたちがScratchで作成したゲームの操作にも使えました。PCにつなぐだけで使えるので、特別なセットアップも不要です。またイベントの際に持って行こうと思っています。
▼子どもたちに遊んでもらいました。
