본문 바로가기
개발/Unity3D

유니티(Unity) 시리얼(RS232) <-> Unity

by 비트-바이트 2024. 4. 17.
반응형

전시장에 설치된 모터가 달린 장비와 이전에 유니티로 제작한 키오스크 컨텐츠와 연동해야하는 일이 생겼다.

아래 사진처럼 키오스크+프로젝터 2면으로 제작되었었으나 중앙의 청동거울이 회전할 수 있도록 개선(?)되었다.

 

전시 업체에서 회전하는 기능을 만들어 주었고, 간단히 시리얼로 메세지만 보내면 동작하도록 제공해주었다.

 

국립중앙과학관 2층 신규 설치중인 컨텐츠

 

현장에 있는 장비를 뜯어올 수도없고...

뭐 일단 메세지 들어오는 것만 확인만하면 되기 때문에 전송되는 메세지값(180도 회전(앞), 180도 회전(뒤)) 만 확인하고 후퇴.

 


준비


  • 가상 시리얼 포트 프로그램(VSPE)

    유니티에서 신호만 보내는 것만 확인하면 된다.
    https://eterlogic.com/ 에서 다운로드 가능하다.
    64비트는 라이센스가 필요하다고하니 32비트로 받자.


  •  설치 후 실행

    라이센스 없다고 하는데 가볍게 패스(No~!)
    실행 후 연결을 생성하고
    디바이스 타입 : Connector
    포트번호 : 활용할(연결된) 번호
    실행 버튼을 누르면 상태창에 "Ready"가 뜬다.
    간혹, 다른 장비(블루투스 등)이 이미지 사용중일 경우에는 활성화가 안되니 미리 확인합시다.(장치관리자에서 확인가능)

아니오(N) - 라이센스 없어도 됨

 

 




 

 

 


  • Unity 연동
    Update에서 전송을 받는 부분이 있으나 실제로 사용하지는 않음.
    (테스트를 목적으로 인풋박스와 버튼 오브젝트 만들어서 테스트용으로 연결해놓음)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;

public class SerialConn : MonoBehaviour
{
    // 시리얼 연결을 위한 기본 설정
    public string deviceName = "COM1"; // 기기 이름
    public int baudRate = 9600; // 보드레이트
    private SerialPort serialPort; // 시리얼 포트 객체

    // 시작 시 시리얼 포트 초기화
    void Start()
    {
        InitializeSerialPort();
    }

    // 시리얼 포트를 찾고 초기화합니다.
    private void InitializeSerialPort()
    {
        string[] ports = SerialPort.GetPortNames();
        foreach (string port in ports)
        {
            if (port.Contains(deviceName))
            {
                serialPort = new SerialPort(port, baudRate);
                serialPort.ReadTimeout = 1000; // 읽기 타임아웃 설정
                serialPort.Open();
                break;
            }
        }
    }

    // 매 프레임마다 시리얼 데이터 확인
    void Update()
    {
        ReadSerialData();
    }

    // 시리얼 포트에서 데이터를 읽습니다.
    private void ReadSerialData()
    {
        if (serialPort != null && serialPort.IsOpen && serialPort.BytesToRead > 0)
        {
            string data = serialPort.ReadLine();
            Debug.Log("전송받은 데이터: " + data);
        }
    }

    // 데이터를 시리얼 포트로 보냅니다.
    public void SendData(string data)
    {
        if (serialPort != null && serialPort.IsOpen)
        {
            serialPort.Write(data);
        }
    }

    // 객체 소멸 시 포트 닫기
    void OnDestroy()
    {
        CloseSerialPort();
    }

    // 시리얼 포트를 닫습니다.
    private void CloseSerialPort()
    {
        if (serialPort != null && serialPort.IsOpen)
        {
            serialPort.Close();
        }
    }
}

입력 받은 값 전송되는 것 확인

 

 

 

끝! 내일 아침가서 테스트해야지.(집앞이라 다행임)

반응형