Let's play 般若心経

研究日記です。

ぷちコンでやることを決める

7/24 ZETAが勝って嬉しい。テストも100点でした。

第20回UE5ぷちコンが始まりました

UE5ぷちコンは、ヒストリアさん主催のUE限定ゲームコンテストです。(私は過去に2回受賞しています!)

今回のテーマは「コントロール」ということで、深いですね~。

なので私はコントローラを自作しようと思います。接続を処理するのはUE側なので問題ないかな!

自作するコントローラ

すごい設計図を書きました。コントローラにはI2C通信のセンサを2つまで付けることができ、付け替えてステージを攻略していきます。

接続方法としてはBLEにするつもりです。せっかくプラグインも買ってあるので、主な制御をUEで行えばコンテストの趣旨に合うはず...。

ですが問題もあり、BLE Utility V2プラグインiOS, Androidでしか動作しません。プログラムテストもやりにくいので、テスト用アプリなど作って頑張ります。

一応、WinRTなど使ってPCでBLE通信を行うこともできるのですが、そんな実力も時間もないです。

付け替えモジュール

センサの値を読み取るのは普通にやればいいですが、LEDモジュールを追加して、ゲームの画面以外にも情報を出力したい気持ちがあります。そのため、ゲーム側からキャラクタリスティックに値を送信してLEDの色を変えてみたいと思います。

用意するものはBlinkM(LED), Arduino Nano 33 BLEです。BlinkMはI2Cで色を変えることができるLEDです。研究室に転がっていました。

Arduinoのプログラムは以下のようになります。

#include <ArduinoBLE.h>
#include <Wire.h>

#define BLINKM_ADDRESS 0x09

BLEService rgbService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE RGB Service

// RGB characteristics
BLEUnsignedCharCharacteristic redCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);
BLEUnsignedCharCharacteristic greenCharacteristic("19B10002-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);
BLEUnsignedCharCharacteristic blueCharacteristic("19B10003-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Wire.begin();

  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
  }

  BLE.setLocalName("RGB Controller");
  BLE.setAdvertisedService(rgbService);

  rgbService.addCharacteristic(redCharacteristic);
  rgbService.addCharacteristic(greenCharacteristic);
  rgbService.addCharacteristic(blueCharacteristic);

  BLE.addService(rgbService);

  redCharacteristic.setValue(0);
  greenCharacteristic.setValue(0);
  blueCharacteristic.setValue(0);

  BLE.advertise();

  Serial.println("Bluetooth device active, waiting for connections...");
}

void loop() {
  BLEDevice central = BLE.central();

  if (central) {
    Serial.print("Connected to central: ");
    Serial.println(central.address());
    while (central.connected()) {
      if (redCharacteristic.written() || greenCharacteristic.written() || blueCharacteristic.written()) {
        setBlinkMColor(redCharacteristic.value(), greenCharacteristic.value(), blueCharacteristic.value());
      }
    }
    Serial.print("Disconnected from central: ");
    Serial.println(central.address());
  }
}

void setBlinkMColor(uint8_t red, uint8_t green, uint8_t blue) {
  Wire.beginTransmission(BLINKM_ADDRESS);
  Wire.write('n');
  Wire.write(red);
  Wire.write(green);
  Wire.write(blue);
  Wire.endTransmission();
}

プログラムの折りたたみ方を知らないのでこのまま貼ってます。キャラクタリスティックを3つ用意して、16進数でRGBそれぞれの値を送ると反映されます。

動かしてみる

nRF Connectでテストします。

 

キャラクタリスティックを、赤0xFF, 緑0x00, 青0xFFとすることでRGB(255, 0, 255)となり、マゼンタに光るのがわかります。全部0x00にするとLEDが消えます。

付け替えする規格

大体のセンサではI2Cが採用されているので、電源供給±とSDA, SCLピンの計4ピンでいいと思います。これをポゴピンで簡単に着脱できるようにすればOKかな。

夏休み中は実家と研究室が遠いので3Dプリンターが使えなくなります。運転すれば行ける距離ではあるので、事故らないようにたまに行こうと思います。