2016년 9월 5일 월요일

RC 서보 모터 다루기

RC 서보 모터는 주로 RC 자동차의 조향 장치에 활용되는 부품입니다. 이것은 값이 싸고 손쉽게 구할 수 있습니다.

RC 자동차 조향 장치에 서보 모터가 사용된 모습

서보 모터를 아두이노에서 사용하기 위한 회로는 다음과 같습니다.

서보 모터는 3개의 선을 연결하도록 되어있는데, 제조사 별로 케이블의 색깔만 다를 뿐 각각의 역할은 같습니다.
제조사 별 서보 모터 연결 규격

  • 전원선: (+)극을 의미하고 전원을 공급하며 5 ~ 7V 정도가 일반적입니다.
  • 접지선: (-)극을 의미합니다.
  • 신호선: 서보 모터 제어를 위한 PWM 신호 선입니다.

아두이노 보드에서 모터를 다룰 때 주의할 점은 전원 공급입니다. 모터는 작동하기 위해서 생각보다 큰 전류를 소모합니다. 모터에 걸리는 부하(Load)에 따라서 소모되는 전류의 크기는 다릅니다.
아두이노 보드는 PC의 USB에 연결하여 주로 사용하는데, 전원 공급을 USB를 통해 받게됩니다. PC의 USB는 사양에 따라 다르지만, 5V에 최대 200mA까지 사용할 수 있습니다.
PC의 USB 전원으로 서보 모터를 구동하게 되면 전원 공급 부족으로 작동이 안 될 수 있고, 잘못하면 PC의 USB에 무리를 주어 포트가 망가질 수도 있습니다.
1개 정도를 부하 없이(No Load) 테스트 목적으로 사용한다면 괜찮지만, 구조물을 연결하여 제어할 때는 외부 전원을 연결하여 사용하는 것이 좋습니다.
아두이노 보드는 아답터나 건전지 등으로 외부 전원을 연결하여 사용할 수 있습니다.
아답터를 연결하여 사용하는 모습

서보 모터 회로를 유니티에서 사용하려면 Wire Editor를 이용해서 다음과 같이 연결합니다.

이것을 아두이노 스케치로 Export한 후, 유니티와 연결하면 GenericServo의 Angle값을 변경함으로써 서보 모터가 움직이는 것을 확인할 수 있습니다.

RC 자동차 핸들 만들기
유니티 UI를 이용해서 RC 자동차의 조향 제어를 할 수 있는 핸들을 만들어 볼 수 있습니다.
레이싱 게임의 조종 핸들의 모습

레이싱 게임에는 조향 제어를 할 수 있는 핸들 UI가 있습니다. 이것을 유니티에서도 구현할 수 있는데, 안타깝게도 기본 기능이 아니어서 사용자가 만들어야 합니다.
아두니티는 이렇게 필요하지만, 유니티가 제공해주지 않는 기능을 유틸리티(Utility)란 이름으로 제공합니다.
핸들 UI로 유용하게 사용할 수 있는 컴포넌트는 바로 DialSlider입니다. DialSlider는 유니티 UI에서 작동하기 때문에 반드시 유니티 캔버스(Canvas)에 존재해야 합니다.

  • knob: 핸들이 돌려지는 것을 표현할 이미지
  • minAngle: 핸들 최소 각도
  • maxAngle: 핸들 최대 각도
  • interactable: 입력 활성/비 활성
  • sprint: 손을 떼었을 때 중앙으로 되돌아오는 옵션
  • Angle: 핸들의 회전 각도
  • OnDragStart: 핸들 조작이 시작되는 이벤트
  • OnDragEnd: 핸들 조작이 완료되는 이벤트
DialSlider를 서보 모터 제어에 사용하려면 DialSliderReactor가 필요합니다.
DialSliderReactor는 DialSlider의 Angle값을 서보 모터에 전달해주는 역할을 합니다.


DialSliderReactor의 설정은 다음과 같습니다.
  • Invert: DialSlider의 핸들 방향과 반대로 출력
GenericServo와 다음과 같이 연결하면 DialSlider로 서보 모터 제어가 가능해집니다.

로봇 제어
당신이 만약 서보 모터로 로봇을 만들었다면 유니티로 로봇을 제어할 수 있습니다.
로봇 제어를 위해 먼저 해야 할 일은 3D 물체의 회전과 서보 모터 각도를 일치시키는 것입니다.
RotationAxisReactor를 이용하면 이 작업을 매우 쉽게 할 수 있습니다.


RotationAxisReactor는 X, Y, Z축 중 하나에 대한 회전을 각도로 제어할 수 있습니다.

  • upAxis: 회전 중심축
  • forwardAxis: 회전 방향축
  • invert: 제어각에 대해 반대 회전 여부
  • use Gizmo: Gizmo 사용 여부
로봇의 한 관절을 RotationAxisReactor를 이용해서 맞춘다면 3D 물체가 회전할 때 서보 모터도 같이 움직이게 됩니다.
로봇 구조를 3차원 회전으로 해석한 예

RotationAxisReactor와 GenericServo 연결은 다음과 같습니다.

GenericServo를 이용해서 서보 모터를 제어하는 모습을 동영상으로 보시기 바랍니다.


서보 모터를 이용해서 로봇을 제어하는 모습도 보여드리겠습니다. (로봇 제어 방법에 대해서는 향후, 자세히 다루겠습니다.)



댓글 4개:

  1. 안녕하세요 아두이노 관련 프로젝트를 진행하다 아두니티에 관심이 생겨 댓글 남기게 되었습니다
    현재 아두이노와 안드로이드간 USB통신을 통해 모터,로봇팔을 제어 하고 있습니다
    이 서보모터 다루기 글에서 유니티로 로봇팔을 제어 하고 있는데 이 유니티를 pc가 아닌 스마트폰에서 실행시킨 유니티에서 제어해도 로봇팔이 제어가 되는지 궁금합니다!!
    그리고 제가 유니티로 천원짜리를 인식해 상자를 하나 생성하는 간단한AR어플을 만든 적 이 있는데 만약 상자가 생성되면 로봇팔을 움직일 수 있게 프로그래밍이 가능 할까요?? 답변 해주시면 정말 감사하겠습니다

    답글삭제
    답글
    1. 우선 스마트폰과 아두이노가 통신하기 위해서는 블루투스가 필요합니다.
      http://ardunityproject.blogspot.kr/2016/10/commbluetooth.html
      위 글을 참고하시면 이 문제는 해결할 수 있을 것입니다.
      통신만 된다면 USB로 유니티와 아두이노 제어했던 것과 동일하게 됩니다.

      삭제
    2. 유니티를 PC에서 사용해 핸들을 돌리면 아두이노에 연결된 모터가 움직이는데(블로그 예제)
      유니티를 어플로 받아 스마트폰과 아두이노를 USB로 연결 후 사용하면 동작이 안되는데
      동작을 시키고 싶은데 C#과 유니티에 아직 익숙치 않아서 잘 안되고 있습니다..ㅠㅠ
      혹시 스마트폰 어플을 통해 제어를 하고 싶은데 commserial이 스마트폰과 아두이노사이에서는 USB통신을 못해주는건지
      어디가 부족한건지 소스를 변경해야 되는건지 어려움이 있습니다
      도움을 조금 받을 수 있다면 프로젝트 진행을 열심히 진행해 볼 수 있을거 같습니다!!

      현재 저는 대학교 캡스톤 디자인 과목에서 물체를 인식하여 자동으로 줍는 프로젝트를 진행 중 입니다
      안드로이드와 아두이노를 AOA(Android open accessory) 이용한 USB통신을 하고 있습니다
      RC카 몸체에 서보모터 6개로 이루어진 로봇팔을 연결시켜 스마트폰으로 구동하고 있습니다
      스마트폰 카메라로 물체를 인식해서 RC카 움직여 로봇팔로 통해 물체를 줍는 방식인데
      영상처리쪽을 진행 중 예전에 뷰포리아를 이용한 유니티 AR예제가 생각이 나서
      만약 유니티(어플)와 아두이노가 통신을 하며 AR어플에서 담배꽁초를 인식하면 그 값을 아두이노로 보내주어
      RC카를 동작시켜 물체를 줍는것이 목표 입니다

      삭제
    3. CommSerial은 PC(Windows, macOS, Linux)와 아두이노를 통신 연결합니다.
      겉으로는 USB로 되는 것처럼 보이지만 사실 USB2Serial이라는 내부 칩에 의해 가능한 것입니다.
      (관련글: http://ardunityproject.blogspot.kr/2016/06/ardunity_97.html)
      Android는 Serial 통신을 막아놓았기에 이 기능을 사용할 수 없습니다.
      Android에서 USB통신을 하려면 Serial이 아닌 USB통신을 해야 하는데, 아직 그 기능을 만들지 못했습니다.
      따라서, 현재로써는 Android에서는 CommBluetooth나 HM10을 이용해서 블루투스 통신을 해야 합니다.

      삭제