Przesyłanie danych z Unity do Arduino
W tym artykule zajmiemy się podstawowym połączeniem i wymianą danych między płytką arduino (klonem) i programem Unity na Windows. Zakładam, że macie podstawową wiedzę na temat Unity i Arduino.
Arduino komunikuje się za pomocą Serial port, aby otrzymywać i wysyłać komunikaty z Unity musimy dołączyć bibliotekę obsługującą porty wejściowe i wyjściowe. Zazwyczaj dodawanie bibliotek jest bardzo proste i skupia się do użycia instrukcji Using, ale w tym przypadku wymagane są dodatkowe kroki.
W tym przypadku Unity nie znajduje System.IO.Ports tak łatwo.
W Unity przechodzimy do Project Settings >> Player >> Other Settings >> Configuration >> Zmieniamy pole Api Compatibility Level na .NET 4.x
Dodatkowo, należy przełączyć Architekturę w oknie Build Settings na wartość x86
Dzięki zmianie powyższych ustawień będziemy mogli używać biblioteki using System.IO.Ports; do wymiany informacji między Unity a Arduino.
Poniższy kod pozwoli przełączać wbudowaną diodę LED na Arduino za pomocą 2 przycisków w Unity
Kod Unity
using UnityEngine;
using System.IO.Ports;
public class ArdConn : MonoBehaviour
{
SerialPort sp = new SerialPort("COM3", 9600);
void Start()
{
sp.WriteTimeout = 100;
sp.Open();
}
// OnClick dodany do przycisków w oknie Unity
public void WriteByte(string i)
{
if (sp.IsOpen)
{
sp.Write(i);
}
}
}
Kod Arduino
const int ledPin = 13;
char ledState;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available())
ledState = Serial.read();
if (ledState == '1')
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
delay(100);
}
Jak widzicie dane przesyłane przez Serial polegają na zapisywaniu (Write / print) i odczytywaniu danych. Więcej informacji na ten temat znajdziecie w dokumentacji arduino: https://www.arduino.cc/reference/en/language/functions/communication/serial/
Przesyłanie danych z Arduino do Unity
Przykładowo, aby odczytać prosty komunikat w Unity należy:
Unity
using UnityEngine;
using System.IO.Ports;
public class ArdConn : MonoBehaviour
{
SerialPort sp = new SerialPort("COM3", 9600);
void Start()
{
sp.ReadTimeout = 100;
sp.Open();
}
private void Update()
{
Debug.Log(sp.ReadLine());
}
}
Arduino
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("info do unity");
delay(100);
}