본문 바로가기

Arduino 제어

07. 아두이노 서보모터 SG90 제어. Arduino Servo SG90 Control Example

안녕하세요.
오늘 실습할 모듈은 SG90 서보모터 입니다.

 

 

 

 

 

 

오늘의 준비물 : 

스위치 3개, 서보모터 1개, 아두이노 우노 1개

 

 

SG90 서보모터 사진

 

 

 

 

 

 

 

 

 

 

 

 

 

 

서보모터의 핀 배열은 사진과 같이 하시면 되겠습니다.

주황색은 디지털 핀의 PWM를 사용하고, 빨강과 갈색은
각각 5V, GND 입니다.
SG90은 0~179 각도를 제어 가능합니다.

 

 

 

 

오늘의 순서는...

1. 1초마다 서보모터를 일정 값만큼 제어하기

2. for문을 사용해서 0부터 179도 까지 제어하기  [1과 함께 있습니다.]

3. 스위치 버튼을 이용해서 서보모터 각도를 제어하기

이 순서로 진행하도록 하겠습니다.

 

사용할 Library - Servo.h   [Example 예시에 있습니다.]

 

주목해주세요! 


servo.write
: 서보모터 각도를 결정할 명령입니다.
delay : 시간 지연용 명령입니다.
pinMode : 해당 핀의 모드를 결정합니다. (Input / Output / INPUT_PULLUP )

 

공통 회로도 :

 

 

 


1. 1초마다 서보모터를 정해진 값만큼 이동시키기

첫 번째는 servo.write(값)와 delay 함수를 사용하여 만들어보도록 하겠습니다. 저는 예제를 이용해서 사용하겠습니다.
예제는 파일 - 예제 - servo - sweep입니다.

 

 

 


코드 해석

#include <Servo.h>

Servo myservo;


int pos = 0;

void setup(){
  myservo.attach(9);
}

void loop(){
  for (pos = 0; pos <= 180; pos += 1)
    // in steps of 1 degree
    myservo.write(pos);
    delay(15);
  }
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }
}

불러온 예제를 봅시다.

맨 처음 줄에는 <Servo.h> 라이브러리를 불러왔습니다.
이후 Servomyservo;라고 되어있는데, 이때 Servo 는 서보모터의 이름을 지정하는 것 같습니다.
그러니 아래쪽에서도 myservo라는 이름으로 이것저것 설정이 되어있는 걸 볼 수 있습니다.

int pos = 0;

void setup() {
  myservo.attach(9);
}

pos의 값을 0으로 초기값을 주었습니다.
attach(9); 의 뜻은 아무래도 PWM 9번 핀에 연결을 한다고 하는 것 같습니다. attach는 붙이다 라는 뜻이 있습니다.

 

void loop() {
  for (pos = 0; pos <= 180; pos += 1)
    // in steps of 1 degree
    myservo.write(pos);
    delay(15);
  }
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }
}

for 문에 대한 설명은 아두이노 공식 홈페이지에 잘 정리되어있습니다. for - 아두이노 참조 (arduino.cc)

간략 설명 : for문 (초기값;조건;증가;) 라는 코드를 집어넣어서 사용한다고 보면 됩니다.


첫 번째 for문 (pos 초기값 0pos 값이 180보다 작거나 같아질 때까지(조건); 1씩 증가; )
myservo.write(pos);  //  for문 ( ) 안에 있는 트리거 대로 pos값을 1씩 증가시킨다.
delay(15); 0.015초 대기

 

두 번째 for문 (pos 초기값 180pos 값이 0보다 크거나 같아질 때까지(조건); 1씩 증가; )
myservo.write(pos);  //  for문 ( ) 안에 있는 트리거 대로 pos값을 1씩 감소시킨다.
delay(15); 0.015초 대기

 

막상 코드 해석을 하고 보니  [2. for문을 사용해서 0부터 179도 까지 제어하기] 를 클리어 했습니다.
예제 코드는 2번 문제에 대한 예제였습니다.

 


1. 1초마다 서보모터를 일정 값만큼 제어하기

loop되는 코드와 delay만으로도 충분히 가능한 실습입니다.
동작순서 : 0˚ -> 60˚ -> 120˚ -> 180˚ -> 0˚

감이 좋으신 분들은 pos값만 지정해서 넣으면 되는것을 알게되셨을겁니다.



소스코드 :

NoSW_Servo.zip
0.00MB

#include <Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);

}

void loop() {
myservo.write(0);
delay(1000);

myservo.write(60);
delay(1000);

myservo.write(120);
delay(1000);

myservo.write(180);
delay(1000);

}

 

 


3. 스위치 버튼을 이용해서 서보모터 각도를 제어하기

스위치를 총 3개를 사용하여 0도, 90도, 180도 제어를 해볼 것입니다.


회로도는 공통 회로도를 사용합니다.

 

버튼 3개를 디지털핀 5,6,7에 연결합니다.
버튼 핀모드를 INPUT_PULLUP으로 연결해주시기 바랍니다. (INPUT으로하면 미친듯이 휘청입니다.)
해당 증상에 대한 내용은 03. 아두이노 LED를 스위치를 이용해서 ON, OFF 해보자! (tistory.com)  에서 확인 가능합니다.
bt와 BT는 다른 변수입니다.

 

소스코드

SW3_Servo.zip
0.00MB

#include <Servo.h>
int bt1 = 5;
int bt2 = 6;
int bt3 = 7;
Servo myservo;

void setup() {
  myservo.attach(9);
  pinMode(bt1, INPUT_PULLUP);
  pinMode(bt2, INPUT_PULLUP);
  pinMode(bt3, INPUT_PULLUP);
  myservo.write(0); // 초기 각도는 0도에서 시작합니다.
}

void loop() {
  int BT1 = digitalRead(bt1);
  int BT2 = digitalRead(bt2);
  int BT3 = digitalRead(bt3);

  if (BT1 == 0)
  {
    myservo.write(0);
  }

  if (BT2 == 0)
  {
    myservo.write(90);
  }

  if (BT3 == 0)
  {
    myservo.write(179);
  }
}

 

동작 확인 :

BT1,BT2,BT3를 눌렀을 때는 LOW신호가 들어갑니다.(풀업일때는.)
각각 0도, 90도 179도까지 제어되는것을 확인 가능합니다.

 

 

오늘은 Servo 모터에 대해서 실습해보는 시간을 가져보았습니다.

도움이 되셨다면 우측 상단의 구독과 공감 한번씩 눌러주시면 감사하겠습니다!!
필요한 자료가 있으시다면, 댓글 혹은 방명록에 남겨주시면 반영하겠습니다!