서보모터 - 버튼으로 서보모터 각도 제어
서보모터란?
[그림 1-1] 'sg 90 servo' - 출처:[메카솔루션] http://mechasolution.com/shop/main/index.php
서보라는 것은 '추종한다', '따른다'라는 의미입니다. 즉, 명령을 따르는 모터를 서보모터라 합니다. 여기서 중요한 사실은 어떠한 종류의 모터라 하더라도 적당한 구동 시스템을 갖추며 위치와 속도를 제어할 수 있도록 만들면 서보 시스템이 이루어지는 것입니다. 즉, 서보 모터는 구동부와 제어부를 포함한 것으로 모터 자체만 가지고 서보모터라 하지 않습니다.
서보모터는 펄스를 주어 위치를 제어하는 부품 입니다. 위치 피드백을 내부에서 구성하고 있으므로 외부에서 처리가 불필요합니다. 서보모터는 일반 모터와 달리 회전 반경이 정해져 있습니다. 또한, 일반적인 모터와 달리 물리적인 이동을 정밀하게 제어하는데 유용하며, 모터 드라이버가 내장되어 있어 연결과 제어가 쉽습니다. 종류에 따라 다르지만 본 실습에서 사용할 모터 'sg90 servo'는 회전 반경이 0~180도 입니다.
[그림 1-2] 서보모터 내부
서보모터 내부모습을 나타낸 그림 입니다. 소형 모터와 제어용 IC 등으로 구성이 되어 있습니다.
[그림 1-3] sg90 servo 스펙 - 출처 'micro sg90 servo datasheet'
'sg90 servo'의 데이터시트를 참고해 보시면 vcc와 gnd, pwm핀으로 구성되어 있는다는 것과 펄스의 주기는 20ms이고 펄스폭은 1~2ms인 pwm파형을 보내 서보모터를 제어하게 된다는 사실을 알 수 있습니다. 이러한 특징때문에 회전운동을 직선운동으로 바꾸기 용이하고 크기가 작고, 부착이 용이하며 고속, 고정밀의 특징 때문에 로보틱스 분야에서 물체의 관절 부분에 많이 사용되고 있습니다.
서보모터 라이브러리
아두이노 통합개발환경(IDE)에서는 서보모터 라이브러리를 기본적으로 제공해 주고 있어 별도의 설치없이 헤더파일만 포함시키면 사용이 가능 합니다. servo라이브러리는 펄스를 발생시키는 기능을 구현하고 있어 사용자는 세부 동작원리를 알지 못하더라도 라이브러리 함수 사용법만 알면 서보모터를 쉽게 제어할 수 있게 해줍니다. 멤버함수는 다음과 같습니다.
Function |
Description |
Syntax |
Parameters |
Returns |
Attach()
|
서보모터가 연결된 핀을 지정
|
servo.attach(pin)
servo.attach(pin, min, max)
|
pin : 서보가 부착 된 핀 번호
min : 서보의 최소각도(0)에 해당하는 펄스폭(마이크로 초) (default 544)
max : 서보의 최대각도(180)에 해당하는 펄스폭(마이크로 초) (default 2400)
|
- |
Write() |
서보모터의 각도를 지정 하여 샤프트의 방향을 이동시킵니다.
|
servo.write(angle)
|
angle : 서보에 쓸 값 (0에서 180) |
- |
Read() |
현재 서보모터의 각도를 읽습니다.
|
servo.read()
|
- |
int |
attached() |
서보모터 핀이 지정되어 있는지 검사합니다
|
servo.attached()
|
- |
boolean |
detach() |
서보모터에 연결된 핀을 제거합니다
|
serovo.detach()
|
- |
- |
[표 2-1] Servo library - 출처:https://www.arduino.cc/en/Reference/Servo
아두이노 스케치 및 회로도
[그림3-1] 아두이노 서보모터 버튼 제어 회로도
서보모터의 pwm은 아두이노의 '~'표시가 있는 pwm핀에 연결해 줍니다.
( pwm은 전압에 단계를 주어 디지털 신호를 보다 아날로그 신호에 가깝게 표시하는 핀으로 주로 모터 혹은 전구의 밝기 조절 에 사용되는 핀 입니다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <Servo.h>
Servo myservo;
int BUTTON = 7;
void setup()
{
myservo.attach(9);
pinMode(BUTTON, INPUT PULLUP);
}
void loop()
{
if(digitalRead(BUTTON)==HIGH)
{
myservo.write(0);
}
else
{
myservo.write(180);
}
}
|
cs |
'embedded > arduino' 카테고리의 다른 글
초음파 센서 - 거리측정 (0) | 2018.12.21 |
---|---|
Shield 와 Module (0) | 2018.12.21 |
이더넷 쉴드(Ethernet Shield) (0) | 2018.12.21 |