#目次
・はじめに
・結果
・準備
・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に以下のスケッチを書き込んだ。PCからArduinoを操作し、Lチカ。
— いっちー (@get_itchy_feet) April 30, 2019
UnityからArduinoにUDPで送信。
Unityでキーボードの入力を検知し、数値をUDP(有線LAN )でArduinoへ、Arduino側で受信した数値によりLEDをON/OFFさせる。 pic.twitter.com/qWbJtcz8Tr
#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#のスクリプトを作り、カメラ(とりあえず)に添付してみた。
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のファイアウォールの注意点とかは前回、前々回を参照してね。
以上。