PIKADEMIA

Projekt edukacji alternatywnej

Połączenie Unity z Arduino

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

Zmiana ustawień w Unity by uzyskać dostęp do biblioteki System.IO.Ports;

Dodatkowo, należy przełączyć Architekturę w oknie Build Settings na wartość x86

Zmiana ustawień w Unity by uzyskać dostęp do biblioteki System.IO.Ports;

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);
}