UnityでArduinoへUDP（有線LAN）で送信する

#目次
・はじめに
・結果
・準備
・Arduinoのスケッチ
・Unity
#はじめに
UnityからArduinoへ文字を送信してみた。
UDPで有線LAN経由を使ってみた。
前回Unity側の受信ができたので、ついでに送信もやってみた次第である。
https://qiita.com/get_itchy_feet/items/0f144f49d5ee951943af
参考記事はこの辺り
https://qiita.com/nenjiru/items/d9c4e8a22601deb0425b
https://dobon.net/vb/dotnet/internet/udpclient.html
#結果
UnityからArduinoへ通信し、LEDをON/OFFさせてみた。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PCからArduinoを操作し、Lチカ。<br>UnityからArduinoにUDPで送信。<br>Unityでキーボードの入力を検知し、数値をUDP（有線LAN ）でArduinoへ、Arduino側で受信した数値によりLEDをON/OFFさせる。 <a href="https://t.co/qWbJtcz8Tr">pic.twitter.com/qWbJtcz8Tr</a></p>&mdash; いっちー (@get_itchy_feet) <a href="https://twitter.com/get_itchy_feet/status/1123208623524536320?ref_src=twsrc%5Etfw">April 30, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Unityでキーボードの入力を検知し、文字をUDPでArduinoに送信、Arduinoは受けた値によりLEDをON/OFFさせる。
#準備
ArduinoとUnityを有線LANで接続するため以下のように準備した。
以前の記事の準備と一緒
https://qiita.com/get_itchy_feet/items/36a8f9fa5983fb11ac6a
１．ハード他の準備
　必要なもの　①PC　②ArduinoUNO　③LANケーブル　④EthernetShield　⑤USBケーブル（書込み用）　⑥MACアドレス
<img width=40% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184089/7bf8d711-d766-94e3-7067-c29b8b441dba.png>
　③・・・PCとArduinoは直接ケーブルでつなげてみた。
　④・・・秋月電子で購入。DFROBOTのEthernet Shield V2.2。チップはW5100が搭載されている。
　http://akizukidenshi.com/catalog/g/gM-13165/
　⑥・・・④にはMACアドレスがついていない。適当な数値は使ってはだめらしい。今回は別機器（使っていないAmazonEcho）の物を流用した。
#Arduinoのスケッチ
Arduinoに以下のスケッチを書き込んだ。

```c:arduino:ArduinoUdpReceiveTest.ino
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = {
  0x00,0x71,0x??,0x??,0x??,0x??
};
IPAddress ip(192,168,2,101);
unsigned int localPort = 8888;

IPAddress remote(192,168,2,100);
unsigned int PClocalPort = 8887;

char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
EthernetUDP Udp;

void setup() {
  pinMode(8,OUTPUT);
  digitalWrite(8,LOW);
  
  Ethernet.begin(mac, ip);

  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    while (true) {
      delay(1);
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
  }
  Udp.begin(localPort);
}
void loop() {
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    IPAddress remote = Udp.remoteIP();
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    char i = packetBuffer[0];
    if(i=='0') digitalWrite(8,LOW);
    if(i=='1') digitalWrite(8,HIGH);
  }
}
```
MACアドレスは公開できないので？を入れ「0x00,0x71,0x??,0x??,0x??,0x??」としている。
文字「0」受信でLEDがOFF、「1」受信でLEDがONである。
LEDはArduinoの8番ピンに抵抗を介してつながっている。
8番ピン - 抵抗1kΩ - LED - GND
<img width=30% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184089/d670b799-8851-1aa5-688e-679655950233.jpeg>
#Unity
以下のようにC#のスクリプトを作り、カメラ（とりあえず）に添付してみた。

```C#:UnityUdpSendTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;

public class UnityUdpSendTest : MonoBehaviour
{
    string localIpString = "192.168.2.100";
    int localPort = 8887;
    string ArduinoIpString = "192.168.2.101";
    int ArduinoPort = 8888;
    private UdpClient udp;

    void Start()
    {
        IPAddress localAddress = IPAddress.Parse(localIpString);
        IPEndPoint localEP = new IPEndPoint(localAddress, localPort);
        udp = new UdpClient(localEP);
        udp.Client.ReceiveTimeout = 3000;
        IPAddress ArduinoAddress = IPAddress.Parse(ArduinoIpString);
        IPEndPoint ArduinoEP = new IPEndPoint(ArduinoAddress, ArduinoPort);
        udp.Connect(ArduinoEP);
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.A))
        {
            byte[] dgram = Encoding.UTF8.GetBytes("1");
            udp.Send(dgram,1);
            Debug.Log("Send_1");
        }
        if (Input.GetKey(KeyCode.S))
        {
            byte[] dgram = Encoding.UTF8.GetBytes("0");
            udp.Send(dgram, 1);
            Debug.Log("Send_0");
        }
    }
    void OnApplicationQuit()
    {
        if(udp != null) udp.Close();
    }
}
```
キーボードのAを押すと文字「1」が送信（LED ON）
キーボードのSを押すと文字「0」が送信（LED OFF）
となる。

PC側のIPアドレスの設定とかWindowsのファイアウォールの注意点とかは前回、前々回を参照してね。
以上。