초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

서보모터 제어하기

2015-01-16 14:17:43

[이전 학습가이드] DC모터 돌리기

 

 

서보모터란?


 

서보(Servo)의 어원은 라틴어의 Servue로서 노예라는 의미를 가지고 있으며, 목표치에 대한 위치, 방위, 자세 등의 제어가 자동화되어 있는 장치 이름에 붙여지곤 합니다.

이와 같이 서보모터는 모터와 기어박스 그리고 제어회로로 구성되어있어, 특정 위치로 이동하거나, 특정한 수치(속도 등)만큼 가동시킬 때, 모터로 부터의 피드백을 통해 정확하게 제어할 수 있는 구조를 갖추고 있는 모터로 자동화 생산 시스템, 로봇, 장난감, 가전제품 등 광범위하게 쓰이고 있습니다.



 

 

 

 

 

 

 

서보모터 사용방법


 

서보모터는 무한정 회전이 가능한 DC모터와 달리 회전 반경이 정해져 있는 경우가 대부분 입니다.

종류에 따라 다르지만 아두이노에서 사용하는 서보모터의 경우 일반적으로 약 0~180도 범위의 회전각을 가집니다.

그렇기 때문에 180도 이상으로 돌리려고 무리한 힘을 가하게 되면 서보모터가 손상됩니다.

 

서보모터에는 3개의 단자가 있습니다. 각각의 단자는 별도의 핀을 알리는 문구가 써져있는 대신 케이블의 색으로 역할을 구분합니다.

일반적으로 3개의 케이블은 검은색(또는 갈색), 붉은색, 황색(또는 주황색, 흰색)으로 표시되어 있으며, 붉은색 선은 +전원, 검은색 선은 -전원에 연결되어 서보모터에 전기를 공급하는 역할을 하며, 노란색 선은 서보모터의 동작을 제어하는 신호선입니다.

 

 

서보모터의 회전 각도의 원리는 아래 그림과 같이 PWM (펄스폭변조) 방식으로 제어합니다.

전체 20ms의 PWM주기 중 1~2ms사이의 파형을 통해 각도를 제어합니다.

1ms만큼 HIGH신호를 주면 0도를 가르키고, 1.5ms만큼 HIGH신호를 주면 90도, 2ms만큼 준다면 180도를 가르킵니다.
 

 

 

 

 

 

서보모터가 PWM의 원리를 사용하기 때문에 서보모터는 아두이노에서 PWM을 사용할 수 있는 곳에 연결해야 한다고 보통 생각하게 됩니다.

하지만 서보모터는 PWM핀이 아닌 디지털 핀 아무곳에 연결해도 무방합니다.

서보모터를 제어하는 PWM신호가 아두이노의 PWM신호와는 차이가 있기 때문에 서보모터는 별도의 PWM을 생성하여 제어하게 됩니다.

 

※ 단 아두이노에서 서보모터를 사용하는 동안에는 디지털 9, 10번핀에서는 PWM사용(analogWrite())를 사용할 수 없음에 유의하세요!

 

 

 

 

 

 

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 서보모터 1 SG90
3 스위치 1  
4 브레드 보드 1  
5 점퍼 케이블 7  

 

 

부품명 오렌지 보드 서보모터 스위치 브레드 보드 점퍼 케이블
파트

 

 

 

 

 

 

 

 

하드웨어 making


 

1. 오렌지보드의  5V핀을 브레드보드의 +버스에 연결합니다.

2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.

3. 스위치를 그림과 같이 양쪽 IC영역에 걸치게 꽂습니다.

4. 서보모터의 횐색(또는 황색) 단자를 오렌지보드 9번핀에 연결합니다.

5. 서보모터의 붉은색 단자를 +버스에 연결하고 검은색 단자를 -버스에 연결합니다.

6. 스위치의 한쪽 단자를 오렌지보드 5번핀에 연결합니다.

7. 스위치의 반대쪽 단자(대각선 방향)를 브레드보드의 -버스에 연결합니다.


 

 

 

 

 

 

 

 

 

소프트웨어 coding

 

  1. /*
  2.   제목    : 서보모터 움직이기
  3.   내용   : 스위치를 누를때마다 서보모터가 지정된 각도 만큼 회전하도록 해봅시다.
  4. */
  5.  
  6. // 서보모터의 쉽게 제어하기 위하여 라이브러리를 추가합니다.
  7. #include <Servo.h>
  8.  
  9. // 서보모터를 제어하기 위한 Servo 객체를 생성한다.
  10. Servo myservo;
  11. // 스위치를 5번 핀으로 설정합니다.
  12. int sw = 5;
  13. // 서보모터의 회전 각도입니다.
  14. int angle = 0;
  15.  
  16. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
  17. // 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
  18. void setup() {
  19.   // 서보모터를 A3핀으로 설정합니다.
  20.   myservo.attach(9);
  21.   // 스위치가 연결된 핀의 모드를 INPUT_PULLUP 상태(초기 로직레벨을 HIGH로 설정)로 설정합니다.
  22.   // 설정된 디지털 핀은 아래와 같은 값을 반환합니다.
  23.   // 스위치가 열려있다면 (누르지 않은 상태) HIGH
  24.   // 스위치를 닫혀있다면 (누른 상태), LOW
  25.   pinMode(sw, INPUT_PULLUP);
  26. }
  27.  
  28. // setup() 함수가 호출된 이후, loop() 함수가 호출되며,
  29. // 블록 안의 코드를 무한히 반복 실행됩니다.
  30. void loop() {
  31.   // 스위치가 연결된 핀의 로직레벨이 LOW라면,
  32.   // 스위치가 닫혀있는 상태(누른 상태) 이므로, 아래의 블록을 실행합니다.
  33.   if (digitalRead(sw) == LOW) {
  34.     angle += 15;
  35.     // 최종 각도가 180도를 넘는다면, 0도로 초기화 시킵니다.
  36.     if (angle >= 180) {
  37.       angle = 0;
  38.     }
  39.     // 서버모터로 지정된 각도로 회전하도록 설정합니다.
  40.     myservo.write(angle);
  41.     // 1초 동안 대기합니다.
  42.     delay(500);
  43.   }
  44. }

TIP 

34번째줄의 += 기호는 '더하고 대입한다'라는 개념이 합쳐진 기호입니다.

angle += 15는 풀어쓰면 angle = angle + 15와 같습니다. 기존의 angle값에 15를 더한 후 angle변수에 덮어쓰는 형태입니다.

+=가 있으니 빼고 대입하는 -=도 있으며 *=, /= 등 다양하게 존재합니다.

 

 

 

 

 

#include<>와 라이브러리

 

서보모터를 사용할 때는 다른 간단한 예제와 다르게 라이브러리를 사용하게 됩니다.

라이브러리란 쉽게 설명하면 특정 기능을 하기위해 필요한 함수들의 모음으로 생각하면 편합니다.

 

서보모터를 아두이노에 구현된 함수로 동작시키기 위해서는 상당히 복잡한 과정을 거쳐야 하지만 그 과정이 별도의 파일인 라이브러리 내에서 구현되고 간단한 함수로 제공되기 때문에 사용자는 함수 하나를 가져와서 사용하는 것만으로도 서보모터를 사용할 수 있게 됩니다.

 

서보모터를 사용하기 위한 라이브러리는 아두이노IDE를 설치할때 기본적으로 제공되며, 대부분의 라이브러리는 회사나 유저가 직접 제작하여 제공하는 경우가 많기 때문에 사용자가 필요에 따라 받아서 사용하는 경우가 많습니다.

 

아두이노IDE에서는 쉽게 라이브러리를 받을 수 있게 라이브러리 매니저를 제공하며 이곳에서 검색하여 쉽게 라이브러리를 설치할 수 있습니다.

 

<라이브러리 매니저>

 

 

 

 

 

 

 

 

attach()와 write()

 

서보모터를 작동시키기 위해서는 별도의 함수인 attach()를 사용합니다.

attach()를 사용함으로써 서보모터에 전원을 공급하여 동작할 수 있게 합니다.

 

반대로 detach()라는 함수도 있으며 detach()를 쓰게 되면 서보모터의 공급되는 전원을 차단함으로써 제어가 불가능하게 됩니다.

서보모터는 액츄에이터로 전원을 많이 차지하기 때문에 특별히 제어가 필요없다면 detach()로 전원을 차단하는 것도 좋은 방법입니다.

 

서보모터의 각도는 write()로 제어하며 대부분 0~180도 사이로 제어합니다.

이때 서보모터가 순간적으로 움직이는것이 아닌 1초 미만의 약간의 텀을두면서 움직이기 때문에 write() 실행 후 바로 또 다른 write()로 각도를 제어하면 원하는 동작으로 실행되지 않습니다.

이때는 delay()를 사용하여 충분히 움직일 시간을 준 다음 write()를 사용하는 것이 좋습니다.

 

 

 

 

 

 

 

 

 

서보 모터를 활용한 프로젝트


 

공장 자동화 시스템

서보 모터는 대게 로봇의 관절로 많이 활용되는 모듈 중 하나로 로봇, 공장기구에 많이 쓰입니다. 

서모 모터를 이용하면 로봇 팔을 제작해 볼 수 있고 

아래 프로젝트는 서보 모터를 이용해 로봇팔을 만들고, 특정 모션을 저장해 자동화 시스템을 구현한 프로젝트입니다. 

 

출처 : https://youtu.be/bLnAJ-mSElE

 

 

 

[다음 학습가이드] 조도센서로 어두워지면 LED켜기

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

오렌지 보드, 서보 모터, 스위치

김장엽 2016-07-18 18:10:14

이 코드로 스텝 모터를 비슷한 방법으로 작동시키려면 어느 부분을 수정해야할까요??