2016년 7월 1일 금요일

DigitalOuput

아두니티는 ArdunityApp을 통해 아두이노 보드와 연결된 상태에서 ArdunityController를 통해 아두이노 보드에 연결된 회로를 제어할 수 있도록 구성되어 있습니다.
이 말은 유니티 Scene에 ArdunityApp을 넣은 후, 아두이노 보드에 연결된 회로를 제어하기 위한 ArdunityController를 추가적으로 넣어서 유니티에서 아두이노를 제어할 수 있다는 뜻입니다.

DigitalOutput은 아두이노 보드의 핀을 Digital방식으로 유니티에서 제어할 수 있도록 만드는 ArdunityController입니다.

되도록이면 유니티에서 Ardunity란 이름의 GameObject를 별도로 만들고 사용하는 Controller별로 하위 GameObject를 만드는 것이 좋습니다.

이 상태에서 ARDUnity의 Wire Editor를 이용해서 필요한 컴포넌트를 추가하면 다음과 같이 구성될 수 있습니다.

Wire Editor에 나타난 컴포넌트는 서로 연결해줘야 하며 연결이 필요한 노드는 붉은 색으로 표현됩니다.
그림에서 보면 ArdunityApp은 CommSocket 노드의 연결이 필요하기에 추가한 CommSerial을 연결해주면 되고, DigitalOutput은 Owner 노드 연결이 필요하므로 ArdunityApp을 연결해주면 됩니다.

아두니티는 여러 개의 아두이노 보드 연결이 가능하기에 DigitalOutput이 어느 보드 소속인지 설정할 필요가 있습니다. DigitalOutput의 Owner 노드는 바로 이 설정을 의미합니다.

다음으로 해야 할 일은 아두이노 스케치 업로드입니다.
이를 위해 각 컴포넌트 별로 아두이노 스케치 옵션을 설정해야 합니다.
DigitalOutput의 Sketch Option을 보면 다음과 같이 구성되어 있습니다.
  • id : ArdunityApp이 ArdunityController를 구분하기 위한 식별자
  • pin : Digital방식으로 제어할 아두이노 보드의 핀 번호
  • default Value : 아두이노 보드 구동 시 기본 핀 상태
  • reset On Stop : 유니티와 연결 해제 시 핀 상태를 default Value로 되돌릴 지 여부
설정이 완료되었다면 ArdunityApp의 Export Sketch를 통해 아두이노 스케치를 생성 한 후 아두이노 보드에 업로드합니다.
(스케치 업로드는 한번만 하면 되며 ArdunityController가 변경되거나 Sketch Option이 수정된다면 다시 업로드해야 합니다.)

유니티를 실행한 후, CommSerial의 포트 번호를 선택하고 ArdunityApp의 Connect를 실행하여 아두이노 보드를 연결하면 DigitalOutput을 제어할 수 있게됩니다. (아두니티 연결 방법 참고)
DigitalOutput은 Inspector View를 통해 핀 상태를 바꿀 수 있는 UI를 제공하므로 프로그래밍없이 바로 회로를 테스트할 수 있습니다.
정상적으로 회로가 유니티에서 제어된다면 모든 준비가 끝난 것입니다.

이제 남은 것은 유니티에서 DigitalOutput을 제어하는 것입니다.
C# Script에서 DigitalOutput의 Value를 변경할 수 있으며 코드는 다음과 같습니다.
(아래 예제는 1초 마다 핀 상태를 바꾸고 있습니다.)

using UnityEngine;
using System.Collections;
using Ardunity;

public class MyComponent : MonoBehaviour
{
 public DigitalOutput digitalOutput;

 private float _time = 0f;
 private bool _value = false;
 
 void Update ()
 {
  _time += Time.deltaTime;
  if(_time > 1f)  // per 1 second
  {
   _time = 0f;
   _value = !_value; // toggling
  }

  digitalOutput.Value = _value;
 }
}


만약, 아두이노 보드가 연결되었을 때만 작동하도록 하고 싶다면 DigitalOutput의 connected 속성을 이용하여 코드를 작성하면 됩니다.

using UnityEngine;
using System.Collections;
using Ardunity;

public class MyComponent : MonoBehaviour
{
 public DigitalOutput digitalOutput;

 private float _time = 0f;
 private bool _value = false;
 
 void Update ()
 {
  if(digitalOutput.connected)
  {
   _time += Time.deltaTime;
   if(_time > 1f)  // per 1 second
   {
    _time = 0f;
    _value = !_value; // toggling
   }

   digitalOutput.Value = _value;
  }  
 }
}

댓글 1개:

  1. 오래전에 올리신 글이지만 질문 드립니다.
    디지털 아웃풋을 포함한 이런 아웃풋에서, unity내의 다른 변수를 사용하여 그 값을 조정하는것이 가능한가요? 가능하다면 어떻게 할 수 있나요?

    답글삭제