초급 예제

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

서보모터 움직이기

2015-01-16 14:17:43

개요

1) 서보모터란 무엇인가?

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

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



 

2) 서보모터 사용방법

서보 모터는 일반 모터와 달리 회전 반경이 정해져 있습니다. 종류에 따라 다르지만 일반적으로 약 0~270도 범위의 회전각을 가집니다.

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

 

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

부품 목록

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

 

 

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

 

 

하드웨어 making

브레드 보드

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

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

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

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

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

6. 서보모터의 검은색 단자를 -버스에 연결합니다.

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

8. 스위치의 오른쪽 하단 단자를 -버스에 연결합니다.


 

 

전자 회로도




 

 

소프트웨어 coding

/*
 제목		: 서보모터 움직이기
 내용		: 스위치를 누를때마다 서보모터가 지정된 각도 만큼 회전하도록 해봅시다.
 */

// 서보모터의 쉽게 제어하기 위하여 라이브러리를 추가합니다.
#include <Servo.h>

// 서보모터를 제어하기 위한 Servo 객체를 생성한다.
Servo myservo;
// 스위치를 5번 핀으로 설정합니다.
int sw = 5;
// 서보모터의 회전 각도입니다.
int angle = 0;

// 기계적인 스위치를 누르게 되면 전극판이 완전히 밀착되기 전까지,
// 매우 짧은 시간 동안 불안정한 신호를 발생시키며, 여러번 누른 것과 같은 현상이 나타납니다.
// 이를 바운스 현상아라하며, 이를 방지하기 위하여 일정시간동안은 이러한 불안정한 신호를 고려하지 않습니다.
// 이러한 방법을 디바운스라 합니다.
// 바운스 시작 시간을 초기화합니다.
long bounceStartTime = 0;
// 본 예제에서는 스위치를 눌렀을때 50ms 안의 신호는 바운스 현상으로 간주하고, 디바운스 합니다.
long debounce = 50;

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
	// 서보모터를 A3핀으로 설정합니다.
	myservo.attach(A3);
	// 스위치가 연결된 핀의 모드를 INPUT_PULLUP 상태(초기 로직레벨을 HIGH로 설정)로 설정합니다.
	// 설정된 디지털 핀은 아래와 같은 값을 반환합니다.
	// 스위치가 열려있다면 (누르지 않은 상태) HIGH
	// 스위치를 닫혀있다면 (누른 상태), LOW
	pinMode(sw, INPUT_PULLUP);
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() {
	// 스위치가 연결된 핀의 로직레벨이 LOW라면,
	// 스위치가 닫혀있는 상태(누른 상태) 이므로, 아래의 블록을 실행합니다.
	if (digitalRead(sw) == LOW) {
		// 시작 시간이 0으로 초기화 되어있다면, 현재 시간을 시작 시간으로 설정합니다.
		if (bounceStartTime == 0) {
			bounceStartTime = millis();
		}
    	// 현재 시간 - 시작 시간이 디바운스 시간보다 크다면, 아래의 블록을 실행합니다.
		if (millis() - bounceStartTime > debounce) {
			// 현재 각도에서 15도를 증가시킵니다.
			angle += 15;
			// 최종 각도가 180도를 넘는다면, 0도로 초기화 시킵니다.
			if (angle > 180) {
				angle = 0;
			}
			// 서버모터로 지정된 각도로 회전하도록 설정합니다.
			myservo.write(angle);
			// 회전 후, 바운스 시작 시간을 0으로 초기화 합니다.
			bounceStartTime = 0;
			// 1초 동안 대기합니다.
			delay(1000);
		}
	}
}

 

 

 

 

 

kocoafabeditor

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

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

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

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