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

BLEで複数の文字列を扱う

7/20 Viewfinder面白かった

3Dプリンターでカプセルを造形

お手玉のガワを作るため、

ただのカプセルにFusionでねじを付けたやつを印刷します。そのまま印刷しても入らないのでナット側を0.3mm凹ませました。参考
完成品はこちら。

ちょっと隙間があるのは、時間短縮のためにサポート材無しで印刷したらぐちゃぐちゃになってしまったからです。ねじ山の方はサポート材あったほうがいいかも。

BLEでスティックとボタンの値を送信

プログラムはこんな感じ。サービスUUIDはハートレートプロファイルを使っているので、nRF Connectではハートマークが表示されます。

#include <ArduinoBLE.h>

BLEService myService("180D");  // BLE Heart Rate Service

// BLE Characteristics
BLEStringCharacteristic stickCharacteristic("2A37", BLERead | BLENotify, 20); // max length 20 bytes
BLEIntCharacteristic switchCharacteristic("2A38", BLERead | BLENotify);

const int stickXPin = A0;
const int stickYPin = A1;
const int stickPushPin = 2;
const int switchPin = 3;

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

  pinMode(stickXPin, INPUT);
  pinMode(stickYPin, INPUT);
  pinMode(stickPushPin, INPUT);
  pinMode(switchPin, INPUT);

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

  BLE.setLocalName("MyDevice");
  BLE.setAdvertisedService(myService);

  myService.addCharacteristic(stickCharacteristic);
  myService.addCharacteristic(switchCharacteristic);

  BLE.addService(myService);

  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()) {
      int stickX = analogRead(stickXPin);
      int stickY = analogRead(stickYPin);
      int stickPush = digitalRead(stickPushPin);
      int switchState = digitalRead(switchPin);

      String stickData = String(stickX) + "," + String(stickY) + "," + String(stickPush);
      stickCharacteristic.writeValue(stickData);
      switchCharacteristic.writeValue(switchState);

      // Print the data to the Serial Monitor
      Serial.print("Stick Data: " + stickData);
      Serial.println("Switch State: " + String(switchState));
    }
    Serial.print("Disconnected from central: ");
    Serial.println(central.address());
  }
}

で、BLE Utilitiesプラグインを使って作ったアプリで接続してみると...

こんな感じで、Dataがすべて数字になっています。Arduinoのプログラムでは文字列で送信しているので、アプリ側に問題があります。

UE C++でバイト配列を文字列に変換する

残念ながらブループリントではできないっぽいので、UE C++を扱うためにVisual Studioを入れるとこから始めます。

UE4.27はVisual Studio 2019です。プログラムは以下のような感じになります。

//cpp
FString UYourClass::BytesToString(const TArray<uint8>& InArray)
{
    FString Result;
    for (auto InChar : InArray)
    {
        Result += FString::Printf(TEXT("%c"), InChar);
    }
    return Result;
}
// .h
#pragma once

#include "CoreMinimal.h"
#include "YourClass.generated.h"

UCLASS()
class YOURPROJECT_API UYourClass : public UObject
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, Category = "Your Category")
    static FString BytesToString(const TArray<uint8>& InArray);
};

ChatGPT Plusにお金を払い続けているので有効活用しました。プログラマいらない

実行結果とキャラクタリスティックを2つ購読する方法は明日に回して帰ります。

ピンヘッダのはんだ付け

7/14 昨日友達が技科大受かっててうれしい

Nanoにはんだ付け

Arduino Nano 33 BLE Senseは、ピンヘッダがはんだ付けされているか否かで550円の差があります。550円あったらアセット買えますね!なので今日は550円分の仕事をします。

お手玉にするためにピンヘッダが付いてないほうが小さくて都合が良かったので、指導教員に1個欲しいと言ったら3個買ってくれました。コントローラ作るために1個はピンヘッダを付けたいと思います。

フラックスは使わなかった

はんだ付けは1年生のときにやったのが最後なので不安になりつつ。そんなに小さくもないのではんだを斜め切りとかはしません。完成品がこちら

光るぺこらは通電チェックに役立つ

ピンヘッダ実装済みの商品ページより下手ですが、テスターで全ピン音なったので大丈夫そうです。

VINピンの仕様

Arduino Nano 33 BLEをUSB給電している場合、VINピンを5V出力として利用することができるみたいです。詳しくはここ

(一人で写真撮るの難しかった)

 

テスターで値を見てみると、4.7V出てる。USB給電の電圧がそのまま使えますね。ぺこらもさっきより強く光ってます。

Arduino Nano BLEが3.3V駆動なので、それを下回らないようにすればいっぱいモジュール繋げても大丈夫だと思う。たぶん。

昇圧してるだけのときは5V0Aになってるけど、使わないときは一応電池外そうね。

 

アナログスティックも3.3Vを使おう

アナログスティックを5V出るVINピンから給電すると、センサの値が安定しませんでした。これは、Arduino Nano 33 BLEが3.3Vで駆動するため、入力も3.3Vである必要があります。なので、5V用のアナログスティックやボタンであっても、3.3Vで給電するほうが良いですね。

ちなみに5VでやってるとArduinoが損傷するかも知れないので注意してください。

 

今日はロボット工学のテストあって疲れました。研究はテスターずっと使ってました。Testしすぎ
次回はプログラム回かな~

プラグインの仕様に悩む

7/11(火) レポートの締切が近くて動けない。

BLE Utilities V2の仕様

Q&Aによると、Windowsで動作するプラグインではないらしい。なのでiOSAndroid用のアプリにするか、Windowsで仮想シリアルポートとして認識する必要があるかな... 有線のコントローラにする方法もあるけどなんか嫌。

あと複数デバイスの接続には対応してるみたいなので、2Playerの実装は頑張ればできそう。

WindowsのBLEは非対応らしい

お手玉の設計

電池と昇圧コンバータ、Arduinoの3つを頑張って小さくしても、USB駆動にしたのでちょっとでかい。直径9cmくらいの球体になりそうで、お手玉というよりジャグリング用のアレ。

固定するのは接着剤にするとして、ネジ山のついたカプセルを作らないといけない。Solidworks2013はネジ山を印刷できないっぽいのでFusionに切り替える必要が出てきました。

光るぺこら

小さいブレッドボードが届いていたのと、ゲーミングLEDが研究室に転がっていたのでアクスタの下に置く用の土台を印刷する...

小さいブレッドボード

完成品がこちら

給電はUnoから

実際に見るともっといい感じです。あとアクリルなので偏光が起きてちょっときれい。

今日は光らせたまま帰ります!

Unreal EngineでBLE通信

BLEとは?

BLEとはBluetooth Low Energyの略で、普通のBluetoothとは違います。具体的には、通信容量を減らすことで大幅な消費電力削減を実現したものです。

Bluetoothファミリー(核家族

コントローラとゲームが通信するにあたって、画像などの大きなデータをやりとりするつもりはないので、支障はないと考えます。

環境

  • Arduino Nano 33 BLE Sense
  • Realme X50 Pro 5G(Bluetooth対応スマホならなんでも)
  • UE4.27(Androidパッケージ化を出来るようにしておいてください)
  • ある程度のUEスキル

nRF-Connectで動作確認

nRF-Connectとは、BLE通信で送られてくるデータを見たり、書き込みをしたりできる優れたアプリです。(Playストアにあります)
使い方は以下のリンクから。IDEのプログラムから書いてあってありがたいです。

Arduino NANO 33 BLEをArduinoIDEで使えるようにする方法 - Qiita

UEとの連携

BLEについて何にも知らないので、とりあえずUEのプラグインを買いました。(12500円、高い...)

研究費で買う場合、新しい研究用アカウントを作成する必要があります。その場合私が今まで持ってるアセットを使うのがグレーになるので、自腹で購入しました。

BLE Utilities V2

ちなみにUE4.22用の無料版もあるのですが、UE4.27とパッケージ化方法が違ったり機能が少なかったりしたのでやめました。(1日ロス)

使用方法

プラグインを有効後、コンテンツフォルダ右下の「エンジンのコンテンツを表示」からプラグインのサンプルプロジェクトが見れるのですごい参考にします。

注意点としては、権限がめんどくさい!たまにうまくいかない!ので、タスクキルやアプリデータの初期化を試しましょう。

他にも、接続完了してすぐにNotificationを購読しようとするとたぶんまだロード中なので出来ません。新しくボタンを作るなどしてちょっと時間を置いてから購読しましょう。

でかすぎる問題点

ソフトを動かすのはPCのつもりだったけど、このプラグインPCに対応してない...?

2Player対応したいのに同時に通信できるのって1つまで?UUIDが同じでも大丈夫かな...

第一次購入物品

小さいものとかいっぱい買ったのでまとめました。

作りたいもの

まずは目標であるセンサ付け替え式コントローラを作ります。ですが電子工作は初めてなので研究室を燃やすつもりです。そうなる前に練習として

Google日本語入力お手玉バージョンを作りたい!

ので、加速度センサとBluetooth付きの小さいArduinoを主軸として部品を買いました。

ちなみに、指導教員にはその旨を伝えていないのでコントローラの部品として申請しました。

購入品リスト

最初はビーフジャーキーとか本とか買おうとしてましたが、本は図書館に寄贈することになるのと、お菓子はダメみたいです。購入品の一部を紹介します。

  • Arduino Nano 33 BLE Sense
  • 耐火バッグ
  • 18650バッテリー
  • 5V昇圧モジュール
  • 電池、電池ホルダー

図にするとこんな感じです。本以外買えました。

第一次購入物品


特に18650リチウムイオンバッテリーは保護回路ついていないと素人は爆発させるみたいなので、高いのを買いました。保管するとき用に耐爆・耐火バッグを買いました。

 

がんばってお手玉を作りたいと思います!!

UEでAndroidパッケージ化とケース作り

 7/10(月) 友達が秋田大学落ちてた。

研究室のPC

スペックはCPUが強くてグラボは謎にQuadroが積んであります。4080がよかった

パッケージ化のエラー

UnrealEngine入れたてほやほやなのでAndroidパッケージ化を試すと、案の定"/Android/armv7/gradle/gradlew" :app:assembleDebug” みたいなエラーが出ました。

昔はgradle系のエラーを何回か諦めたりしていましたが、そういう関連のエラーはCode ProfさんのYouTubeを見れば大体解決することを学びました。

youtu.be
keystoreは必要ないと思います。これでパッケージ化ができました。

電池でArduino

乾電池と5V昇圧コンバータ、Arduino Nano 33 Ble Senseが届いていたので、はんだ付けして動作チェック。

普通に動いたのでArduino nano 33 Ble Senseと5V昇圧コンバータのケースを印刷してみました。

電池一本でもちゃんと動く

他にも届いているものがあるので、アクスタ光らせるやつでも作ろうかな...