Przesuń obiekt w Unity z Arduino joystick

Połącz joystick z płytką arduino, a następnie podłącz płytkę do komputera przewodem USB. Link to Wokwi project
Poniższe połączenie działa, ale jest mało wydajne. Połączenie Arduino z Unity za pomocą Serial Communication jest znacznie wydajniejsze z użyciem Ardity, darmowej paczki: Paczka Unity Ardity

//Arduino
#define XJOY A1    
#define YJOY A2
#define SEL_PIN 2

void setup()
{
  pinMode(SEL_PIN, INPUT_PULLUP);
  Serial.begin(9600);
}
 
void loop()
{                   
  int joyX = map(analogRead(XJOY), 0, 1023, -100, 100); 
  int joyY = map(analogRead(YJOY), 0, 1023, -100, 100); 
  bool isPressed = digitalRead(SEL_PIN) == LOW;
  Serial.print(joyX);
  Serial.print("|");
  Serial.print(joyY);
  Serial.print("|");
  Serial.println(isPressed);
}

// Wersja wysyłająca tylko dane po zmianie
//Arduino
#define XJOY A1    
#define YJOY A2
#define SEL_PIN 2
int lastJoyX;
int lastJoyY;
int lastBtn;

void setup()
{
  pinMode(SEL_PIN, INPUT_PULLUP);
  Serial.begin(9600);
  lastJoyX = map(analogRead(XJOY), 0, 1023, -100, 100);
  lastJoyY = map(analogRead(YJOY), 0, 1023, -100, 100); 
}
 
void loop()
{ 
                   
  int joyX = map(analogRead(XJOY), 0, 1023, -100, 100); 
  int joyY = map(analogRead(YJOY), 0, 1023, -100, 100); 
  bool isPressed = digitalRead(SEL_PIN) == LOW;
  if(joyX==lastJoyX && joyY==lastJoyY && isPressed==lastBtn) return; 
  lastJoyX = joyX;
  lastJoyY = joyY;
  lastBtn = isPressed;
  Serial.print(joyX);
  Serial.print("|");
  Serial.print(joyY);
  Serial.print("|");
  Serial.println(isPressed);
}

using UnityEngine;
using System.IO.Ports;
using System;

public class ArduinoConnection : MonoBehaviour
{
    SerialPort portNo = new SerialPort("COM3", 9600);
    public int X { get; private set; }
    public int Y { get; private set;}
    public bool Btn { get; private set; }

    public Vector3 Dir { get; private set; }

    void Start()
    {
        portNo.Open();
        portNo.ReadTimeout = 5000;
    }

    private void Update()
    {
        Read();
    }

    void Read()
    {
        if (portNo.IsOpen)
        {
            if (portNo.BytesToRead > 0)
            {
                string[] xy = portNo.ReadLine().Split('|');

                if (Int32.TryParse(xy[0], out int x) &&
                   Int32.TryParse(xy[1], out int y) &&
                   Int32.TryParse(xy[2], out int b))
                {
                    X = Math.Abs(x) < 5 ? 0 : x;
                    Y = Math.Abs(y) < 5 ? 0 : y;
                    Dir = new Vector3(-X, Y, 0);
                    Btn = b == 1 ? true : false;
                }
            }
        }
        else
        {
            Dir = Vector3.zero;
        }
    }
}

using UnityEngine;

public class CubeMove : MonoBehaviour
{
    [SerializeField] ArduinoConnection joystick;

    void Update()
    {
        transform.position += joystick.Dir * 0.05f * Time.deltaTime;
        
        if (joystick.Btn)
        {
            transform.localEulerAngles += new Vector3(0, 100f, 0)*Time.deltaTime;
        }
    }
}
Scroll to Top