2.6 pwm 기능으로 서보모터 제어하기     c{mpy0206}


서보모터는 R/C카의 조향장치나 마이크로로봇의 구동장치로 쓰이는 모터로서 신호선 한 가닥으로 0도~180도의 각도를 조절할 수 있는 것이다.


[그림] 서보 모터의 외형


위 그림에서 보듯이 전원선인 Vcc/GND와 신호선 세 가닥이 인터페이스의 전부이다. 모터축의 각도는 신호선으로 인가되는 펄스폭으로 조정된다.


[그림] 서보 모터의 신호선으로 인가되는 펄스(pulse)


위 그림에 서보모터의 신호선으로 인가되는 펄스를 도시하였다. 주기 B는 3ms~20ms 의 범위를 가지며 주기가 짧을 수록 모터축의 회전 속도가 빨라진다. 펄스의 폭 A는 1.5ms 일때 중심각도인 0도를 가리키게 되고 1ms(최소값 0.7ms)일때 –90도, 2ms(최대값 2.3ms)일 때 +90도를 갖는다. 즉, 이 펄스폭을 조절하여 –90도에서 90도 사이의 원하는 각도를 가지도록 제어할 수 있다.

이것을 pwm기능으로 구현하려면 다음과 같이 하면 된다. 일단 주기는 50 Hz~330Hz 정도의 범위를 가지며 주파수가 높을 수록 회전속도는 빨라진다. 만약 50Hz를 사용한다면 펄스폭이 20ms이므로 1.5ms를 만드려면 듀티를 77(정확한 값은 76.8)로 설정하면 되며 40~115의 값을 주면 정해진 각도로 회전하게 된다.



[표] freq=50일경우 duty에 따른 회전각

duty

회전각

40

-90도

77

0도

115

+90도




만약 gpio12에 서보모터의 신호선이 연결되어 있다면 다음과 같이 PWM객체인 servo를 생성하여 제어할 수 있다.


from machine import Pin, PWM
servo=PWM(Pin(12), freq=50)

만약 0도로 맞출려면 다음과 같이 하면 된다.


servo.duty(77)

단 주파수가 바뀌면 각도를 제어하기 위한 duty값도 다시 계산하여 사용해야 한다.

'하드웨어 > ESP8266' 카테고리의 다른 글

WeMos d1 mini 보드  (0) 2016.10.13
MicroPython으로 아날로그입력 받기  (0) 2016.10.12
NodeMCU를 이용한 LED의 fading 예제  (0) 2016.10.11
NodeMCU보드에서 PWM파형 생성하기  (0) 2016.10.05
ESP8266 외부인터럽트  (0) 2016.10.04
Posted by 살레시오

댓글을 달아 주세요

 Servo 라이브러리는 서보 모터(servo motor)의 제어를 위한 객체를 정의한 것이다. 서보모터는 R/C카의 조향장치나 마이크로로봇의 구동장치로 쓰이는 모터로서 신호선 한 가닥으로 0도~180도의 각도를 조절할 수 있는 것이다.

[그림 1] 서보 모터의 외형

그림에서 보듯이 전원선인 Vcc/GND와 신호선 세 가닥이 인터페이스의 전부이다. 모터축의 각도는 신호선으로 인가되는 펄스폭으로 조정된다.

[그림 2] 서보 모터의 신호선으로 인가되는 펄스(pulse)

[그림 2]에 서보모터의 신호선으로 인가되는 펄스를 도시하였다. 주기 B는 3ms~20ms 의 범위를 가지며 주기가 짧을 수록 모터축의 회전 속도가 빨라진다. 펄스의 폭 A는 1.5ms 일때 중심각도인 0도를 가리키게 되고 1ms(최소값 0.7ms)일때 –90도, 2ms(최대값 2.3ms)일 때 +90도를 갖는다. 즉, 이 펄스폭을 조절하여 –90도에서 90도 사이의 원하는 각도를 가지도록 제어할 수 있는 것이다.


 아두이노의 Servo 라이브러리는 이러한 펄스를 발생시키는 기능을 구현하고 있으며 사용자는 세부 동작 원리를 알지 못하더라도 라이브러리 함수를 사용하는 방법만 알면 서보모터를 제어할 수 있다. 생성자는 입력인수가 없는 것 하나이며 멤버함수로 다음과 같은 것들이 있다.


  • void attach(pin) : 서보모터의 신호선이 연결된 핀을 지정한다.

  • void attach(pin, min_us, max_us) : 펄스폭 A의 최소, 최대값까지 지정한다.

  • void write(angle) : 각도를 지정한다. (angle: 0~180)

  • void writeMicroseconds(us) :펄스폭 A를 us단위로 지정한다.

  • int read() : 현재 각도를 읽는다.반환값은 [0, 180]의 정수.

  • boolean attached() : 서보모터 핀이 지정되어 있는지 검사한다.

  • void detach() : 서보모터의 지정된 핀을 내부적으로 제거한다.

실험에 사용된 서보모터는 SG-90이라는 초소형 모터이다.

[그림 3] SG-90 초소형 서보 모터

첫 번째 예제

 첫 번째로 서보모터를 설정하고 중심각도를 유지하는 간단한 예제를 작성해 보자.

#include <Servo.h>
Servo sm;
void setup() {
   sm.attach(9); //9번 핀에 서보모터의 신호선을 연결
   sm.write(90); //90도(중심각) 각도로 회전
}
void loop() {
}

두 번째 예제

 두 번째로 서보모터 축이 0도에서 180도로 계속 왕복 운동을 하도록 프로그램을 작성해 보자.


#include <Servo.h>
Servo sm;
void setup() {
   sm.attach(9); //9번 핀에 서보모터의 신호선을 연결
}
void loop() {
   sm.write(0); //0도로 회전
   delay(2000);
   sm.write(180); //180도로 회전
   delay(2000);
}


 이와 같이 servo 라이브러리를 사용하면 간편하게 디지털 핀 하나를 이용하여  서보 모터를 제어할 수 있으며 동시에 다수의 서보 모터를 제어하는 것도 가능하다.



Posted by 살레시오

댓글을 달아 주세요