2016년 7월 27일 수요일

DigitalInput

DigitalInput은 아두이노 보드의 핀을 통해 Digital 입력을 다룰 수 있도록 만든 ArdunityController입니다.

유니티에서 DigitalInput을 테스트하기 위해서 필요한 최소 구성은 다음과 같습니다.

다음으로 할 일은 아두이노 스케치를 생성하고 업로드하는 것입니다.
이를 위해 DigitalInput의 Sketch Option을 설정해야 합니다.
  • id: ArdunityApp이 ArdunityController를 구분하기 위한 식별자
  • pin: Digital 입력을 받을 핀 번호
  • pullup: 내부 Pull-up 사용 여부
여기서 Pull-up이란 새로운 용어가 등장했기에 잠시 설명하고 넘어가겠습니다.
Digital 신호는 5V를 기준으로 0V는 0, 5V는 1로 인식합니다. 이러한 Digital 신호를 다른 말로 TTL(Transistor to Transistor Logic)이라고 부릅니다.
실제로, 0V 혹은 5V로 딱 떨어질 수 없으니 어느 정도 마진(Margin)을 두고 인식하게 됩니다.

만약, 전압이 마진 사이에 존재하게되면 0도 아니고 1도 아닌 애매한 값을 가지게되는데 이것을 Tri-State Level이라 부릅니다.
이것은 Digital 신호로 변환할 수 없기에 0과 1을 왔다갔다하는 이상한 값을 가지게 됩니다.
Pull-up 혹은 Pull-down이라 부르는 회로는 바로 이 상황을 막기 위해 사용합니다.

Pull-up은 애매한 전압을 강제로 5V로 만들어 1로 인식할 수 있도록 만들며, Pull-down은 애매한 전압을 강제로 0V로 만들어 0으로 인식할 수 있도록 만듭니다.

Digital 입력에서 Tri-State Level이 만들어지는 이유는 바로 스위치와 같은 Open(회로가 끊긴 상황) 회로를 사용하기 때문입니다.
이 Open 회로는 Tri-State Level을 만들기 때문에 Pull-up 혹은 Pull-down 회로가 같이 사용되어야 Digital 입력으로 활용할 수 있습니다.
그래서, Digital 입력의 정식 회로는 아래와 같습니다.


아두이노는 내부 Pull-up이라 부르는 기능을 가지고 있는데, Pull-up회로를 별도로 꾸밀 필요 없이 회로를 간소화시킬 수 있습니다.
DigitalInput의 Pullup 옵션은 바로 이 내부 Pull-up을 사용하느냐이며 Pull-up 회로를 만들었다면 체크를 해제하고 만들지 않았다면 체크를 해야 합니다.

만약, 두 Chip간의 Digital 신호를 체크하기 위함이면 Pullup 체크를 하지 않고 사용하면 됩니다. 그 이유는 두 Chip의 Pin이 연결된 경우는 Open 회로가 아니므로 Tri-State Level이 만들어지 않기 때문입니다.

설정이 완료되면 ArdunityApp의 Export Sketch 기능을 이용해서 아두이노 스케치를 생성하고 보드에 업로드하면 유니티에서 제어할 준비가 끝납니다.

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

C# Script에서 DigitalInput의 Value를 확인하는 방법은 다음과 같습니다.

using UnityEngine;
using System.Collections;
using Ardunity;

public class MyComponent : MonoBehaviour
{
 public DigitalInput digitalInput;
 
 void Update ()
 {
  Debug.Log(digitalInput.Value);
 }
}


DigitalInput은 값의 변화가 일어날 때마다 Event를 알려줄 수 있으며 활용법은 다음과 같습니다.

using UnityEngine;
using System.Collections;
using Ardunity;

public class MyComponent : MonoBehaviour
{
 public DigitalInput digitalInput;

 void Start ()
 {
   digitalInput.OnValueChanged.AddListener(OnDigitalInputChanged);
 }
 
 void OnDigitalInputChanged (bool value)
 {
  Debug.Log(value);
 }
}

댓글 없음:

댓글 쓰기