Unreal Engine 4とArduinoで遊ぼう(UE4Duino編)

準備編Arduino編と続いてきたUnreal Engine 4とArduinoで遊ぼうシリーズも今日で終わりです。

内容が無駄に長くなり過ぎたので、後日、スクリーンショットなしで要点だけまとめたページを作る予定です。

今日のメニューはこんな感じです。

  • UE4でブループリントを書く
  • UMG(Unreal Motion Graphics UIデザイナ)を使ってHMDに気温と湿度を表示させる

UE4でブループリントを書く

準備編で作成したUE4Duinoプラグイン組み込み済みのプロジェクトを開きます。準備編ではUE4Duino410という名前で作成したプロジェクトです。

一応、メニューから[編集]→[Plugins]でUE4Duinoプラグインが有効になっていることを確認してください。なってなければ準備編に戻って手順を確認してください。

コンテンツブラウザからFirstPerson Characterブループリントを開きます。

イベントグラフタブのSpawn projectileの下の空いたところで右クリックして、beginpなどと入力してイベントBeginPlayノードを置きます。

同様に、イベントティックイベントEndPlayノードを置きます。

イベントBeginPlayノードの出力ピンを右クリックしつつ右向きにドラッグして、openseなどと入力してOpen Serialノードを置きます。

同様に、Read SerialClose Serial、あとはUE4Duinoの動作確認用にPrint Stringノードも置きましょう。

このあたりの操作がままならない人はUnreal Engine公式サイトのブループリント関連のドキュメントを読むことをお勧めします。

ノードを配置する(ブループリントの操作ガイド)

次にシリアルポート関連の設定をします。

Open SerialノードのPort NumBaud Rateに値を入力します。

Port NumにはArduinoが接続されているCOMポートの番号を入力します。忘れてしまった人はArduinoを接続した状態でデバイスマネージャを開いて、ポート(COMとLPT)を確認しましょう。だいたい3~5のあいだになると思います。ガジェット好きな人は2桁の人もいるかもしれません。

Baud Rateには9600と入力します。

ここまで終わったら動作確認してみましょう。コンパイルしてからブループリントを閉じます。

FirstPersonExampleMapの画面に戻って[プレイ]ボタンをクリックします。
ゲーム画面の左側に数字がずらずら~っと表示されたら成功です。

この画面の例では気温が16.05度、湿度が46.34%ということになります。自分の部屋ですが結構寒いです。温度センサーをつまんでみたりすると、出力される値もリアルタイムに変化するはずです。

ここで終わってもいいのですが、せっかくなのでもう少しだけ作り込んでみます。

温度と湿度を表示するHUD(ヘッドアップディスプレイ)を作るために、ウィジェットブループリントを作成します。

ゲーム中に表示されるHUDやメニューなどのユーザーインターフェイスの詳しい作り方についてはUE4公式サイトのクイックスタートを参照してください。非常にわかりやすいです。

UMG UI デザイナのクイックスタートガイド

コンテンツブラウザの[新規追加]ボタンをクリックして[ユーザーインターフェイス]→[ウィジェットブループリント]を選択します。

NewWidgetBlueprintという名前のウィジェットブループリントが生成されます。わかりやすくするためにHUDという名前に変更しましょう。

FirstPersonCharacterブループリントを開きます。HUDに渡す気温と湿度を保持するための変数を作成するためです。

画面左のマイブループリントタブ内にある変数の右側のプラスをクリックして新しい変数を2つ追加します。変数名はtemperaturehumidityとしましょう。どちらもString型の変数とします。Float型でもいいのですが、今回は気温と湿度を数値として扱わないのでString型とします。

今作ったtemperaturehumidityをそれぞれMy Characterにドラッグして移動させましょう。

変数を作り終えたら忘れずにコンパイルして保存しておきましょう。

続いて、イベントBeginPlayからCreate Widgetノードを追加します。

イベントBeginPlayの実行ピンにはOpen Serialノードが繋がってますので、そのあとに続けましょう。Open Serialノードの実行ピンを右側にドラッグして指を離し、検索窓にcreatewなどと入力してウィジェットを作成ノードを置きます。

クラスを選択するところで、先ほど作成したHUDを選択します。

HUDウィジェットを作成ノードのReturn Valueピンを右側にドラッグして指を離し、メニューから[変数へ昇格]をクリックします。

変数名をNew Var 0からHUD Referenceに変更します。

SETノードの出力ピンからドラッグしてAdd to Viewportノードを追加します。このノードによってゲーム画面にHUDの内容が表示されるようになります。この時点ではHMDは空なので何も表示されません。

HUDウィジェットに気温と湿度の値を渡すために、シリアルから読み込んだ文字列を変数temperaturehumidityに入れる処理を書きます。Read Serialノードの実行ピンから繋がったPrint Stringノードを削除して、代わりに以下のようなノードを追加します。

コンパイルしてから保存します。

再びHUDウィジェットブループリントを開きます。

画面左にある[パレット]の[パネル]からHorizontal Boxを[階層]ウィンドウの[Canvas Panel]にドラッグします。

まだUMGの操作に慣れてない方は、公式ドキュメントの2.ヘルス、エネルギー、弾薬を表示するを読むことをお勧めします。

上のドキュメントの通りにウィジェットブループリントのデザイナー画面で気温湿度を表示するためのText Blockを追加します。以下の画面を参考に配置してみてください。

レイアウトが終わったら、次はHUDに気温と湿度を表示させるためにフックを追加します。

画面の右上にあるグラフをクリックしてグラフ編集モードに切り替えます。

イベントConstructの下あたりを右クリックしてGet Player Characterノードを追加します。

続けて、Return Valueピンを引き出して、FirstPersonCharacterへキャストするを選択します。

As First Person Characterピンからドラッグして、変数へ昇格をクリックします。

変数名をMy Characterに変更します。

ツールバーのコンパイルをクリックしてコンパイルし、変更を保存しましょう。

これで、FirstPersonCharacterブループリント内の変数にアクセスできるようになります。

気温と湿度の値を取得できるようになったので、あとはHUDに表示するだけです。

デザイナーをクリックしてデザイナーモードに戻ります。

画面左の階層からvalue_temperatureを選択し、詳細のContentTextの右側のバインドボタンをクリックします。

出てきたメニューからMy Characterを選択しTemperatureをクリックします。

同様の手順で湿度にも変数Humidityをバインディングします。

一通り終わったらコンパイルして保存しておきましょう。

これで作業は終わりです。

レベルエディタに戻ってプレイボタンをクリックしてみましょう。

こんな感じで表示されれば成功です。

おつかれさまでした。

質問などありましたら@pantherheadまで。

Unreal Engine 4とArduinoで遊ぼう(Arduino編)

前回に引き続きUE4Duinoを使うための環境を作ります。

今回はUE4をいったん離れて、Arduinoの開発環境を作ります。

  • Arduino IDEのインストール
  • ArduinoとPCを繋ぐ
  • Arduinoにスケッチ(プログラム)を書き込む
  • Arduinoとブレッドボードを繋ぐ
  • 動作確認

Arduino IDEのインストール

arduino.orgのソフトウェア配布ページから最新版のArduino IDEをダウンロードします。2015年12月23日現在での最新版はv1.7.8です。

ダウンロードしたファイルをダブルクリックしてインストールを開始します。

管理者アカウントの権限を確認された場合は[はい]をクリックして進めます。

使用許諾のダイアログが出てくるので内容をよく読んだ上で[I Agree]ボタンをクリックします。

インストールオプションのダイアログが出てくるので、そのまま[Next]ボタンをクリックします。

インストール先のフォルダを指定するダイアログが出てくるので、インストール先を指定して[Install]ボタンをクリックします。

そのまましばらく待ちます。

デバイスドライバのインストールウィザードが出てきたら[次へ]をクリックします。

「このデバイスソフトウェアをインストールしますか?」というダイアログが出てきたら[インストール]ボタンをクリックします。2~3回出てくると思います。

デバイスドライバのインストールウィザードの完了ダイアログが出てきたら[完了]ボタンをクリックします。

Atmel USB Driver Packageのダイアログが出てきたら、内容を読んで[I agree to the license terms and conditions]にチェックを入れて[Install]ボタンをクリックします。

インストールが始まります。

「このデバイスソフトウェアをインストールしますか?」というダイアログが出てきたら
[インストール]ボタンをクリックします。これも2~3回出てくると思います。

終わったら[Close]をクリックしてダイアログを閉じます。

Arduinoセットアップのダイアログも閉じましょう。

デスクトップにはArduino IDEのアイコンが表示されます。

以上でArduino IDEのインストールは完了です。

ArduinoとPCを繋ぐ

ArduinoとPCを接続します。

ArduinoのUSBコネクタにUSBケーブルを接続し、もう一方のコネクタをPCのUSBポートに接続します。

接続したらデバイスを認識するまで少し待ちます。

デバイスマネージャを開いてCOMポートの割り当て状況を確認します。環境によって異なりますが、COM3~5あたりが割り当てられていることが多いと思います。うちの環境ではCOM5に割り当てられました。このCOMポートの番号はArduinoとUE4Duinoの両方で必要となる情報なので、よく憶えておきましょう。

Arduinoにスケッチ(プログラム)を書き込む

動作確認のためにArduinoにサンプルのスケッチを書き込んでみましょう。
うまくいけばArduino上のLEDが点滅します。

Arduino IDEを起動します。

メニューから[ファイル]→[スケッチの例]→[01.Basics]→[Blink]を開きます。

最初に開いた空白のスケッチは閉じて構いません。

ウィンドウの下側にArduinoのモデル名とCOMポートの番号が表示されますので、それぞれが正しく認識されているか確認します。正しく認識されていない場合は、[ツール]→[ボード]および[ツール]→[ポート]から正しく設定しなおしてください。

左上にある[検証]ボタンをクリックします。この操作によってスケッチ(プログラム)がコンパイルされます。

続けて[マイコンボードに書き込む]ボタンをクリックします。この操作によって、コンパイルされたプログラムがマイコンボード(Arduino)に書き込まれます。

うまくいけばArduino上のLEDが点滅します。

Arduinoとブレッドボードを繋ぐ

ブレッドボード上に温湿度センサー(HDC1000)を取り付けて、ブレッドボードとArduino間をジャンパワイヤで接続します。Arduinoの電源は入れたままでも構いませんが、心配な人はUSBケーブルを抜いておいてもいいです。

以下の図のように接続してください。温湿度センサー(HDC1000)はセンサー側が手前になります。

ブレッドボード上の温湿度センサー(HDC1000)から温度と湿度を取得してみましょう。

garretlabさんのサイトで公開されているスケッチ(プログラム)を利用させていただきました。

温湿度センサーモジュールの実験(Arduinoで遊ぶページ)

温湿度センサー(HDC1000)から温度、湿度を取得してシリアルに出力するスケッチ(プログラム)を以下の場所からダウンロードしてください。

HDC1000.ino

ダウンロードしたらドキュメント内のArduinoフォルダに移動したあとダブルクリックして開いてください。

フォルダを作るかどうか確認されたら[OK]をクリックします。

以下のコードを直接Arduino IDEにコピペして保存してもOKです。

#include <Wire.h>

#define HDC1000_ADDRESS 0x40 /* or 0b1000000 */
#define HDC1000_RDY_PIN A3 /* Data Ready Pin */

#define HDC1000_TEMPERATURE_POINTER 0x00
#define HDC1000_HUMIDITY_POINTER 0x01
#define HDC1000_CONFIGURATION_POINTER 0x02
#define HDC1000_SERIAL_ID1_POINTER 0xfb
#define HDC1000_SERIAL_ID2_POINTER 0xfc
#define HDC1000_SERIAL_ID3_POINTER 0xfd
#define HDC1000_MANUFACTURER_ID_POINTER 0xfe

#define HDC1000_CONFIGURE_MSB 0x10 /* Get both temperature and humidity */
#define HDC1000_CONFIGURE_LSB 0x00 /* 14 bit resolution */

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Wire.begin();
pinMode(HDC1000_RDY_PIN, INPUT);

delay(15); /* Wait for 15ms */
configure();
}

void loop() {
// put your main code here, to run repeatedly:
float temperature, humidity;

getTemperatureAndHumidity(&temperature, &humidity);
Serial.print(temperature);
Serial.print(";");
Serial.println(humidity);

delay(1000);
}

void configure() {
Wire.beginTransmission(HDC1000_ADDRESS);
Wire.write(HDC1000_CONFIGURATION_POINTER);
Wire.write(HDC1000_CONFIGURE_MSB);
Wire.write(HDC1000_CONFIGURE_LSB);
Wire.endTransmission();
}

void getTemperatureAndHumidity(float *temperature, float *humidity) {
unsigned int tData, hData;

Wire.beginTransmission(HDC1000_ADDRESS);
Wire.write(HDC1000_TEMPERATURE_POINTER);
Wire.endTransmission();

while (digitalRead(HDC1000_RDY_PIN) == HIGH) {
;
}

Wire.requestFrom(HDC1000_ADDRESS, 4);
while (Wire.available() < 4) {
;
}

tData = Wire.read() << 8;
tData |= Wire.read();

hData = Wire.read() << 8;
hData |= Wire.read();

*temperature = tData / 65536.0 * 165.0 - 40.0;
*humidity = hData / 65536.0 * 100.0;
}

動作確認

Arduino IDEの[検証]ボタンをクリックしてスケッチをコンパイルし、続けて[マイコンボードに書き込む]ボタンをクリックします。

これでブレッドボード上の温湿度センサーからArduinoを経由し、PCのCOMポートに向けて温度と湿度が出力され続けているはずです。

さっそくシリアルモニタで確認してみましょう。

メニューの[ツール]から[シリアルモニタ]を開きます。

1秒間(1000ミリ秒)に1回の頻度で温度と湿度が出力されます。取得したデータはUE4Duinoで扱いやすいようにセミコロン(;)で区切って1行で出力しています。

これでArduino編は終了です。

おつかれさまでした。

次はいよいよUE4Duino編です。温湿度センサーで取得したデータをUE4の画面上に表示させます。

Unreal Engine 4とArduinoで遊ぼう(準備編)

Unreal Engine 4 (UE4) Advent Calendar 2015 22日目の記事です。

昨日はEpic Games Japan シモダジュンヤさんの「裏ゾーンUE4(Unreal Engine 4の普段語られない裏ワザ)」でした。さすが中の人だけあって、非常に濃いネタでした。さっそく今日から使います!

今日はUnreal Engine 4(以下UE4)と、そのプラグインであるUE4Duinoを使い、Arduinoに接続した温湿度センサーから温度と湿度を取得してゲーム画面に表示するまでの手順を簡単に説明します。UE4とArduino間のデータのやりとりはシリアル通信を使います。

書き始めたら非常に長くなってしまったので、今日はUE4.10.1環境にUE4Duinoプラグインをインストールするところまで説明します。

必要なもの

この記事を書いてる環境(2015年12月22日現在)

事前準備

UE4Duinoのプラグインを生成する

新規プロジェクトを作成するためにUE4.10.1を起動します。
ここで作成するプロジェクトはUE4.9用のプラグインをUE4.10で使えるようにするために使う一時的なプロジェクトです。

新規プロジェクトタブを開いて、C++タブを選択します。ブループリントではなくC++なので注意してください。
First Personを選択し、プロジェクトの保存場所を指定します。
ここでは D:\Unreal Projects\UE4Duino_tmpという名前でプロジェクトを作成しました。

エディタの画面が表示されます。

エディタが起動したら、いったん終了させます。同時に起動してくるVisual Studioも一緒に終了させてしまいます。保存をうながすダイアログが出てきたら保存してください。

上で作成したプロジェクト(UE4Duino_tmp)の保存場所を開きます。
ここではDドライブのUnreal ProjectのUE4Duino_tmpとして説明します。

このフォルダに Plugins という名前でフォルダを作成します。

先ほどダウンロードしたUE4Duinoのプラグインを解凍して、今作ったPluginsフォルダにコピーします。

コピー後は以下のようなフォルダ構成になります。

ここでもう一度UE4Duino_tmpプロジェクトを開きます。

途中で以下のようなダイアログボックスが出てくるので[はい(Y)]をクリックします。

しばらく待つとエディタの画面が表示されます。

プラグインのインストールがうまくいったかどうか確認してみましょう。

メニューの[編集]から[Plugins]を開きます。

以下のように FusionLabz. UE4Duinoが表示されていればOKです。

ふたたびエディタを終了します。

次に新規プロジェクトを作成します。

今度はC++ではなくブループリントで作ります。もちろんC++で作りたい人はC++でもOKです。

ここではD:\Unreal Projects\UE4Duino410という名前でFirst Personなプロジェクトを作成します。

エディタの画面が開いたら、また終了します。
(開いたり閉じたりで面倒ですが、もう少しの辛抱です。)

次にUE4Duino_tmpでリビルドしたUE4Duinoプラグインを、新たに作ったUE4Duino410フォルダにコピーします。

Pluginsフォルダごとコピーします。

これでUE4Duino410プロジェクトでUE4Duinoが使えるようになりました。

さっそく起動して確認してみましょう。

UE4Duino410プロジェクトを開いたら、メニューから[編集]→[Plugins]を開きます。

以下のようになっていればUE4Duinoのインストールは成功です。

おつかれさまでした。

次はArduinoの設定です。

Unreal Engine 4とArduinoで遊ぼう(Arduino編)

今日もmikan

1000単語クリア。進捗率40%。

そろそろGreat評価以下の単語に手を付けはじめないとな。

  • 午前は子供たちがお世話になってるピアノの先生のクリスマスコンサート。
  • ひさびさにアキバに行った。
  • 秋月でブレッドボードと温湿度センサーを購入。
  • ヨドバシでガンプラ購入。長男はいらないというので次男のみ。
  • 池袋でパンを買って帰宅。
  • Raspberry Piのカメラモジュールのセッティングなど。

mikan 3日目

3日前から始めた英単語学習も何とか600語まで到達。

英単語の日本語訳で「どうしてこの意味を選んだの?」「品詞は?」ってところがいくつか出てくるが、今は細いところに疑問をもつ段階ではない。とりあえず全部憶えてから、自分のしっくりくる意味で憶えなおせばいいかなと思ってる。

今日もmikanで単語学習

今日もmikanのTOEIC英単語2500で400語まで憶えた。

休み時間や通勤の時間でどんどん進められるがいいね。

すでに200語くらい忘れてる気もするけどまた憶えればいいや。

英単語

iPhoneのmikanという英単語学習アプリを使い始めた。

2014年の秋ごろに(がんばれば)2日で3800単語を憶えられるという触れ込みでリリースされたアプリ。

2日で3800単語ということは1日あたり1900単語。10単語を1分で憶えるとすると、1時間で600単語。3時間で1800単語。3時間10分で1900単語。確認テストと休憩にかかる時間を含めると9~17時の8時間は欲しいところ。

2015年12月現在、mikanがカバーしている単語は、TOEFLで3000単語、TOEICで2500単語、大学受験で2500単語、GRE(Graduate Record Examination)で1500単語、センター試験の500単語に加えて、最近追加された医学英単語(!?)2200。好きなカテゴリから始められる。

とりあえずTOEIC英単語2500から始めてみることにした。

今年ももう残すところあと15日間。

2日で3800単語はまあ無理だとしても、15日で2500単語くらいなら憶えられるような気もする。1日200単語ペースで13日間、残りの2日で総まとめ。

やるだけやってみよう。