2016년 9월 12일 월요일

GenericMotor

모터(Motor)는 전기를 이용해서 동력을 만들어내는 대표적 장치입니다.

모터의 원리는 로렌츠 힘(Lorentz Force)에 의해 설명되는데, 자기장속에서 전류가 흐르면 힘이 발생한다는 것으로 이 힘이 모터를 돌리게 됩니다.
로렌츠의 힘을 설명하는 플라밍의 왼손 법칙

모터는 작동 방식에 따라 여러가지로 분류될 수 있는데, 우리가 흔히 사용하는 모터는 DC 모터입니다.
DC 모터는 다음과 같은 특성이 있습니다.
  • DC 모터에 흐르는 전류의 세기에 따라 회전 속도가 달라진다.
  • DC 모터에 흐르는 전류의 방향에 따라 회전 방향이 달라진다.
DC 모터를 제어하는 가장 간단한 방법은 전류가 흐르도록 회로를 구성하는 것입니다.
DC 모터를 배터리에 연결하면 바로 작동합니다.


DC 모터의 회전 속도를 조절하기 위해서는 전류를 조절해야 하는데, 옴의 법칙(Ohm's Law)에 따라 전압 혹은 저항을 통해 전류를 조절하여 DC 모터의 회전 속도를 제어할 수 있습니다.

문제는 DC 모터의 속도와 회전 방향을 아두이노 보드에서 제어하려면 좀 복잡한 회로가 필요합니다. DC 모터를 제어하는 대표적인 회로는 H-bridge 회로입니다.

스위치 역할을 하는 트랜지스터 4개를 이용해서 구현하는 회로로써 모양이 H와 같다고 하여 H-bridge 회로라 부릅니다.
이 회로를 이용하면 DC 모터의 회전 속도와 방향을 아두이노 보드로 제어할 수 있습니다.
H-bridge 회로를 구현하려면 좀 복잡하므로 Motor Driver IC를 많이 사용합니다.
대표적인 Motor Driver IC인 L293

GenericMotor는 DC 모터를 제어하기 위한 H-bridge 회로를 유니티에서 다룰 수 있게 해주는 ArdunityController입니다.

H-bridge 회로는 사용 방법에 따라 3가지 유형으로 나눌 수 있고, 각 유형에 따라 GenericMotor의 설정 방법이 달라지니 자신이 사용하는 방식이 어떤 것인지 잘 알고 있어야 합니다.

1. One PWM & One Direction
1개의 방향 제어용 Pin과 1개의 속도 제어용 Pin을 이용해서 H-bridge회로를 제어하는 유형입니다.
One PWM & One Direction으로 제어되는 H-bridge

아두이노 모터 쉴드가 대표적으로 이 방법을 사용합니다.
아두이노 모터 쉴드


이 경우 GenericMotor의 설정은 다음과 같습니다.
  • id: ArdunityApp이 ArdunityController를 구별하기 위한 식별자
  • controlType: H-bridge 제어 유형 선택
  • dir Pin: 방향 제어로 사용되는 Pin 번호
  • pwm Pin: 속도 제어로 사용되는 PWM Pin 번호

2. Two PWM
2개의 PWM 핀을 이용해서 H-bridge 회로를 제어하는 유형입니다.
2개의 PWM신호로 제어되는 H-bridge 회로

L298이라는 Motor Driver IC가 이 방식을 사용합니다.
L298 Motor Driver IC


이 경우 GenericMotor의 설정은 다음과 같습니다.
  • F pwm Pin: 정회전 속도 제어용 PWM 핀 번호
  • B pwm Pin: 역회전 속도 제어용 PWM 핀 번호

3. One PWM & Two Direction
회전 방향 제어를 위해 2개의 핀이 사용되고, 속도 제어를 위해 1개의 핀이 사용되는 방식입니다.
One PWM & Two Direction으로 제어되는 H-bridge

L293이라는 Motor Driver IC가 이 방식을 사용합니다.
L293 Motor Driver IC


이 경우 GenericMotor는 다음과 같이 설정합니다.
  • pwm Pin: 속도 제어에 사용되는 PWM 핀 번호
  • F dir Pin: 정회전 설정에 사용되는 핀 번호
  • B dir Pin: 역회전 설정에 사용되는 핀 번호

H-bridge 제어 유형별로 Sketch Option 설정을 마쳤다면 다음과 같이 Wire Editor에서 연결하고 아두이노 스케치를 Export & Upload하면 유니티에서 회로를 테스트할 수 있습니다.


  • punchValue: 모터에 걸린 부하로 인해 제어되지 않는 값의 구간을 없애준다.
  • Value: 모터 제어 값 (범위 -1 ~ 1)
    • +1: 정방향 최대 속도
    • 0: 정지
    • -1: 역방향 최대 속도
  • Stop: Value를 0으로 만들어 줌
punchValue는 Value의 값이 모터를 회전시키기에 부족한 출력을 낼때 모터에서 소리가 나는 것을 방지해주는 값입니다. Value는 punchValue에 의해 아래와 같은 출력 곡선을 만들게 됩니다.


C# Script로 GenericMotor를 제어하는 방법은 다음과 같습니다.
(본 예제는 보드 연결 시 DC 모터를 최저 속도에서 최고 속도까지 정회전과 역회전을 반복합니다.)

using UnityEngine;
using System.Collections;
using Ardunity;

public class MyComponent : MonoBehaviour
{
 public GenericMotor motor;

 private bool _toggle = true;
 private float _value;
 
 void Start ()
 {
   _value = motor.Value;
 }

 void Update ()
 {
  if(motor.connected)
  {
    if(_toggle == true)
    {
       _value += 0.001f;
       if(_value >= 1f)
       {
         _value = 1f;
         _toggle = false;
       }
    }
    else
    {
       _value -= 0.001f;
       if(_value <= -1f)
       {
         _value = -1f;
         _toggle = true;
       }
    }

    motor.Value = _value;
  }
 }
}

댓글 2개:

  1. 받은 ardunity assets에 generic motor가 없는데 왜 이런거죠?

    답글삭제
  2. Generic Motor는 ARDUnity Deluxe버전에 있습니다.

    답글삭제