티스토리 뷰

    서보모터 제어는 아두이노를 배울 때 가장 먼저 접하는 예제이기도 합니다. 아마 예제를 하거나 동작로직을 점검 할 때 아두이노의 5V 전원을 사용해 모터를 작동시킨 경험이 있을 겁니다. 저도 이전 글에서 아두이노 5V 전원으로 서보모터를 동작하는 예제를 했습니다.

[아두이노] - 아두이노: 버튼 스위치와 초음파센서로 동작하는 서보모터

    하지만 실제 서보모터를 이용해 실제 기계를 움직이려면 아두이노의 전원으로는 무리가 있습니다. 모터가 힘(토크)을 내기 위해서는 전류가 많이 필요한데 아두이노 전원으로는 많은 전류를 감당할 수 없습니다. 심할 경우 아두이노나 다른 부품이 고장날수도 있습니다. 이런 상황을 해결할 수 있도록 외부전원(배터리)을 이용한 서보모터 동작 예제를 해보겠습니다.


<그림 1> 외부전원(배터리)로 동작하는 서보모터


외부전원(배터리)로 서보모터 동작하기

    아두이노에 외부 전원을 사용하는 방법에는 몇 가지가 있습니다. 커넥터를 이용해서 아두이노에 연결해도 되고 아두이노의 VIN(Voltage in) 핀에 외부 전원을 연결해도 됩니다. 아니면 외부전원을 부품에 바로 연결해도 됩니다. 여기서는 높은 전류가 필요한 부품이 서보모터 뿐이니 모터에 외부전원을 바로 연결해서 사용하겠습니다. 나머지 센서와 LED는 사용 전류가 낮기 때문에 아두이노로 무리없이 동작시킬 수 있습니다.

<그림 2> 아두이노 외부전원 연결 부위


부품설명: 서보모터(MG 996R)


Dimension

 40.7×19.7×42.9mm

Stall torque

 9.4kg-cm (4.8v); 11kg-cm (6.0v)

Operating voltage

 4.8~ 6.6v

Gear Type

 Metal gear

Current draw at idle 

 10mA

No load operating current draw 

 170mA

Stall current draw 

 1400mA 


    MG 996R 서보모터는 토크가 높은 편입니다. 지난 예제에서 사용했던 파란색 SG90는 4.8V 전압에서 토크가 1.8kg-cm 였으니 그 때보다 5배 가량 힘이 셉니다. 11kg-cm라면 11cm 막대 끝에 1kg 무게를 달고도 회전할 수 있는 힘입니다

토크 상세설명(위키피디아)

    사용 전류를 살펴보면 idle(공회전) 상태에서 10mA가 사용됩니다. 모터 축에 아무것도 달지 않고 동작할 때(No load) 170mA가 사용됩니다. Stall 상황 즉 최대 무게가 걸릴 때 1400mA가 사용됩니다. 돌아가는 모터 축을 강한 힘으로 잡으면 모터는 돌지 못하고 소음만 발생하는데 그 때 전류라 보시면 됩니다. 힘을 내는 상황에서는 아두이노의 허용전류를 넘길 수 있습니다. 이럴 경우 외부 전원을 사용하지 않으면 동작도 안될뿐더러 다른 부품이 손상 될 수 있습니다. 모터의 사용 전압은 4.8~6.6V 입니다. 1.5V AA건전지 4개를 사용하는 6V 배터리 팩을 사용하겠습니다.

모터의 자세한 스펙은 아래 링크를 참고 바랍니다.

MG 996R 모터 스펙(Tower Pro)


<그림 3> 서보모터 MG 996R


부품설명: 배터리 팩 (1.5v x 4EA)

    배터리 팩은 건전지를 직렬로 연결해 다른 제품에 전원을 공급할 수 있는 부품입니다. 직렬로 연결될 경우 연결되는 만큼 전압이 올라갑니다. 아래와 같이 1.5V AA 배터리 4개가 사용될 경우 6.0V 입니다. 서보모터 사용 전압이 4.8 ~ 6.6v이니 적절한 외부 전원입니다.


​<그림 4> 6V배터리 팩(1.5V x 4EA)


완성된 회로도

    동작로직은 지난번 예제와 유사합니다. 스마트 사물함을 상상해 보겠습니다. 버튼으로 문을 열고 닫을 수 있습니다. 그리고 물건이 들어오면(초음파 센서에 감지되면) 일정시간이 지난 후 자동으로 문이 닫힌다고 가정해 보겠습니다.

전원선

아래 회로도를 보면 스위치와 초음파 센서는 아두이노의 5V 전원을 사용하고 있고, 서보모터는 배터리 팩 6V 전원을 사용하는 것을 볼 수 있습니다. 접지(GND)는 모두 연결돼야 하므로 아두이노 및 다른 부품들의 GND와 배터리 팩의 (-)를 연결합니다.

신호선

  • 초음파센서 Trig: 디지털 2번 핀, Echo: 디지털 3번 핀

  • 버튼스위치 열림: 디지털 6번 핀, 닫힘: 디지털 5번핀 (왼쪽 스위치를 문 열림으로 하겠습니다.)

  • 서보모터 제어: 디지털 9번핀



<그림 5> 완성된 회로도


버튼이 눌러진 것을 알 수 있도록 버튼을 누르면 LED가 동작하도록 만들었습니다. 5V 전압 그대로 들어갈 경우 LED가 고장 날 수 있으니 저항과 함께 사용해야 합니다.


<그림 6> 버튼 스위치와 LED 동작 모습



완성된 코드

#include <Servo.h> // 서보모터 라이브러리 사용
#define TRIG 2 // 초음파센서 TRIG 2번핀 할당
#define ECHO 3 // 초음파센서 ECHO 3번핀 할당
int ButtonOpen = 5;  //여는 버튼 입력 5번핀 할당
int ButtonClose = 6; //닫는 버튼 입력 6번핀 할당

Servo servo;
boolean isNear = false;

void setup(){
  pinMode(TRIG,OUTPUT); // 아두이노 송신
  pinMode(ECHO,INPUT);  // 아두이노 수신
  pinMode(ButtonOpen,INPUT); // 아두이노 수신
  pinMode(ButtonClose, INPUT); // 아두이노 수신
  servo.attach(9);      // 서보모터 제어 9번핀 할당
  servo.write(90);     // 서보모터 초기각도 90도 셋팅(문 닫힌 상태)
}
void loop()
{
  digitalWrite(TRIG,LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(5);
  digitalWrite(TRIG,LOW);

  long distance = pulseIn(ECHO,HIGH)/58; // 초음파 간격   
  
  //만약 버튼이 눌러졌다면
  if (digitalRead(ButtonOpen)) { 
    servo.write(0); // 서보모터 0도로 회전(문 열린 상태)
  }
  else if (digitalRead(ButtonClose)) {
    servo.write(90); // 서보모터 90도로 회전(문 닫힌 상태)
  }
  else if(distance < 10){ // 만약 10cm보다 가까우운 곳에 물체가 있으면 
  delay(5000); // 5초 뒤에
  servo.write(90); // 서보모터 90도로 회전(문 닫힌 상태)
 }
}


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함