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させてみた。


Unityでキーボードの入力を検知し、文字をUDPでArduinoに送信、Arduinoは受けた値によりLEDをON/OFFさせる。

準備

ArduinoとUnityを有線LANで接続するため以下のように準備した。
以前の記事の準備と一緒
https://qiita.com/get_itchy_feet/items/36a8f9fa5983fb11ac6a
1.ハード他の準備
 必要なもの ①PC ②ArduinoUNO ③LANケーブル ④EthernetShield ⑤USBケーブル(書込み用) ⑥MACアドレス

 ③・・・PCとArduinoは直接ケーブルでつなげてみた。
 ④・・・秋月電子で購入。DFROBOTのEthernet Shield V2.2。チップはW5100が搭載されている。
 http://akizukidenshi.com/catalog/g/gM-13165/
 ⑥・・・④にはMACアドレスがついていない。適当な数値は使ってはだめらしい。今回は別機器(使っていないAmazonEcho)の物を流用した。

Arduinoのスケッチ

Arduinoに以下のスケッチを書き込んだ。

arduino
#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

Unity

以下のように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のファイアウォールの注意点とかは前回、前々回を参照してね。
以上。