UE4+Arduinoでいろいろと

あんまりUE4+Arduinoってやってる人がいないので、ちょっとArduinoについて触れてみようかなぁと。

クリエーター的視点で何ができるかなぁって感じなので、プログラマー視点で見るとちょっとそれ違うんじゃない？ってところが多いかもしれないけど、その辺は目を瞑って見てもらえればと。

まずはArduinoって何ってところだけど、今回に関してはものすごい端折った説明をすると、センサーとかの数値をプログラムとかで制御出来る用に変換する、またその逆って感じでとらえてもらえればわかりやすいと思います。

具体的に何ができるかというと、例えば以下のような感じ。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">APDS-9960で意味もなく色を拾って意味もなくUE4のマテリアルに反映させる何か。 <a href="https://twitter.com/hashtag/EpicFriday?src=hash&amp;ref_src=twsrc%5Etfw">#EpicFriday</a> <a href="https://twitter.com/hashtag/Arduino?src=hash&amp;ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/U6PB6ZhDkg">pic.twitter.com/U6PB6ZhDkg</a></p>&mdash; じゅる (@xxJulexx) <a href="https://twitter.com/xxJulexx/status/923869642073939968?ref_src=twsrc%5Etfw">2017年10月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ヒャッハー！！！ <a href="https://t.co/cRF7RWKXBa">pic.twitter.com/cRF7RWKXBa</a></p>&mdash; じゅる (@xxJulexx) <a href="https://twitter.com/xxJulexx/status/891978810903543808?ref_src=twsrc%5Etfw">2017年7月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---
### ■導入方法
UE4Duinoや導入方法は↓あたりを参考にしてみてください。

Unreal Engine 4 (UE4) Advent Calendar 2015 - Unreal Engine 4とArduinoで遊ぼう(準備編)
http://pantherhead.com/blog/2015/12/21/20151222/

UE4Duino(Plugin)
https://github.com/RVillani/UE4Duino

---
### ■Arduinoから数値を受け取る

1つ目の映像は
・ArduinoでカラーセンサーからRGB値を取得
・UE4へ数値を流し込む
・マテリアルのRGB値へ反映

Arduinoでセンサーから取得したものをSerial.print(String)したものをUE4DuinoでReadするんだけど、数値をバラバラっと投げるのもどうかと思うので、取り扱いが簡単なようにいったん文字列にまとめて投げてます。

```
Serial.print(r);
Serial.print(",");
Serial.print(g);
Serial.print(",");
Serial.println(b);
```
UE4に渡される文字列
```r,g,b(改行)```

でUE4でもう一度数値に変換と。
Splitで「,」で区切ってバラしてます。(もっといい方法あるかも)
![65f54eb022c8d66906f0eb3d0e56c2b8.png](https://qiita-image-store.s3.amazonaws.com/0/102588/0e006e51-c1a3-12f4-a23d-6c5d5ac8293e.png)

で、Arduinoの設定にもよるんだけど、そのままだとすご勢いで数値が流れ込んできて数値が暴れまくるので、平均値とるようにしてます。
Arduino側でSerial.print()のあとにDelay()をすることで数値を投げるタイミングを制御できるけど、そのタイミングの数値が欲しいというよりは、一定時間の平均値が欲しいのでUE4側で処理してます。
あとはMake VectorしてSet Vector Psarameter Value on Materialsでマテリアルのカラーに適用。

簡単に言うと**ArduinoでSerial.printでデータを出して、UE4(UE4Duino)でRead Stringで受け取る**だけ。
文章的に長くなってしまったけど、比較的簡単に出来るかと。

---
### ■Arduinoへ数値を渡す
2つ目の映像は
・UE4でアクションを起こしたいタイミングでArduinoへ信号を投げる(UE4Duino＞Printノード)
・ArduinoでUE4からStringを受け取って指定した処理をする

Arduino側での処理はUE4からStringを1文字受け取って、その文字が何かによって処理を実行みたいな感じ。
![11eb9eab584af5a4076804fbdbed70c3.png](https://qiita-image-store.s3.amazonaws.com/0/102588/36fa9fec-4651-9944-26d9-36bbdec4ce14.png)
この例では文字「o」「p」をトリガーとして使ってます。
文字列にすることも出来るけど処理方法が変わってくるので、ここではとりあえず1文字で。

↓Arduino側の処理

```
void loop() {
  int incomingByte = Serial.read();

  if (incomingByte != -1 ) {
    switch (incomingByte) {
      case 'o':
        digitalWrite(Relay_PIN, HIGHLOW);
        break;

      case 'p':
        digitalWrite(Relay_PIN, LOW);
        break;
    }
  } else {
        digitalWrite(Relay_PIN, LOW);
  }
}
```
この映像は100V(普通の壁コンセント用)のスポットライトのコードの途中を切ってリレーを間に挟んで、単純に100V電源をON/OFFしてるだけ。
(電球の負荷的にもあまりよろしくないと思うけど、リレーモジュールの検証ということで)
※感電とかいろいろと危ないので自己責任で。

Arduinoからデータを受けるのに比べてちょこっと複雑かも。

---
### ■あとはアイデア次第！
基本的にはこんな感じでUE4への入力・UE4からの出力が出来たところで、あとは何から入力するか・何へ出力するかっていうアイデア次第かなぁと。
入力系はいろいろなセンサーが手軽に手に入るし、出力系はモーターや照明など(他にあまり思いつかない…)いろいろあると思うので、気になったものは是非試してみたください。

以下、参考までに。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">そういえばUE4でオフィスの照明制御出来るようにしてみた。とくに意味はないけど。<a href="https://twitter.com/hashtag/arduino?src=hash&amp;ref_src=twsrc%5Etfw">#arduino</a> <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/ZuogKQBqUx">pic.twitter.com/ZuogKQBqUx</a></p>&mdash; じゅる (@xxJulexx) <a href="https://twitter.com/xxJulexx/status/930395664772603905?ref_src=twsrc%5Etfw">2017年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">UE4で距離センサー(VL53L0)やってみた。<a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://twitter.com/hashtag/arduino?src=hash&amp;ref_src=twsrc%5Etfw">#arduino</a> <a href="https://t.co/jrgUVZZhDt">pic.twitter.com/jrgUVZZhDt</a></p>&mdash; じゅる (@xxJulexx) <a href="https://twitter.com/xxJulexx/status/930712276545323009?ref_src=twsrc%5Etfw">2017年11月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Arduinoから1灯ずつ制御すると現状この速度が限界。かといってシリアル通信で一気に全部のデータ流し込むとStringで1000文字近くもいっちゃうのでそもそも無理だし…なんかいい方法ないかなぁ。DMXならいけるんだけどUE4でやろうっていうのとちょっと趣旨が変わって来ちゃうし <a href="https://t.co/6htqHcHoWD">pic.twitter.com/6htqHcHoWD</a></p>&mdash; じゅる (@xxJulexx) <a href="https://twitter.com/xxJulexx/status/908018779036164096?ref_src=twsrc%5Etfw">2017年9月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>