XIAO ESP32S3を使ってみる その2(コントローラの作成、Unreal Engineの操作)

はじめに

 今回は大阪の共立電子にて、ゲームセンターで使われるようなジョイスティックを購入したので、Unreal Engineの操作に使えるようにしてみました。

 マイコンのHID機能を利用しています。

▼以前にもXIAO ESP32S3のHID機能を利用したことがあります。

ESP32でMQTT通信(XIAO ESP32S3、Node-RED、HIDキーボード)

はじめに  今回はXIAO ESP32S3でMQTT通信を使ってみました。Node-RED MCUでMQTT通信を使ったことはあるのですが、今回はArduino IDEでプログラムを書き込んでいます。  …

▼以前の記事はこちら

XIAO ESP32S3 Senseを使ってみる その1(カメラ)

はじめに  今回はXIAO ESP32S3 Senseを使ってみました。XIAOシリーズの小型マイコンで、拡張コネクタを差すとカメラやSDカード、マイクを取り付けることができます。よく…

Node-RED MCUを使ってみる その2(カメラノード、XIAO ESP32S3 Sense)

はじめに  今回はNode-RED MCU用に開発されたmcu_cameraノードを試してみました。  Node-RED MCUの書籍の執筆者メンバーであるkitazakiさんが、ひと月ほど前に開発され…

使用する部品

▼今回購入したジョイスティックはこちらです。

▼オンラインショップにもありました。

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でジャンプなどの動作を行うことが多いです。それらのキーを設定しておけば、使いやすいかと思います。

 なお、プログラムを書き込むときは、書き込みモードにしないと認識しないことがあるのでご注意ください。

▼こちらの記事でも、書き込み時の注意点について触れています。

XIAO ESP32C3を使ってみる その7(RTC、ネットワークの時刻取得)

はじめに  今回はマイコンでRTCとネットワークを利用した時刻の取得について試してみました。  IoT用途として、水やりなどに使いたいなと思っています。 ▼家でトマトを…

操作してみる

 実際にジョイスティックを使って操作する、ゲームっぽい環境をUnreal Engineで作成してみました。

▼落下しないように進む環境を作成しました。動画では簡単にクリアしていますが、意外と難しいです。

 カメラの操作はマウスになってしまうので、VRゴーグルがあれば視点を変えながら操作しやすいかもしれません。

 最近Unreal Engineで自動運転のシミュレーションを行っていたのですが、その空間で自動車の操作もできるようにしてみました。

▼橋の上を走行しています。これは視点が勝手に移動するので、ジョイスティックだけで操作しやすいです。

 車なので、ハンドルとアクセルで操作したいところですね。共立電子ではフットスイッチも販売されていました。

最後に

 子どもたちに操作を体験してもらう機会があったのですが、熱中して遊んでいました。大人の方もUnreal Engineのグラフィックにびっくりしていました。

 3Dプリンターで作成した部品の密度が5%だったのですが、子どもたちが遊んでいても壊れなかったので、強度的には大丈夫そうです。厚みがあるからだと思います。

 Unreal Engineの操作だけでなく、子どもたちがScratchで作成したゲームの操作にも使えました。PCにつなぐだけで使えるので、特別なセットアップも不要です。またイベントの際に持って行こうと思っています。

▼子どもたちに遊んでもらいました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です