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 살레시오
,