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");
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プリンターが使えなくなります。運転すれば行ける距離ではあるので、事故らないようにたまに行こうと思います。