글을 시작하기에 앞서 Servo 라이브러리를 이용한 서보모터 제어 예제를 먼저 보고 오면 좋을 거 같다.
회로는 아두이노와 다이렉트로 구성하고 PWM 파형을 관측할 수 있게 중간에 오실로스코프 핀을 연결해 놓았다.
#include <PWM.h>
void setup() {
Serial.begin(9600);
InitTimersSafe();
SetPinFrequencySafe(9, 50); // 50Hz = 20ms
}
void loop() {
Serial.println("pwmWrite 7 anglne 0");
pwmWrite(9, 7);
delay(2000);
Serial.println("pwmWrite 18 anglne 90");
pwmWrite(9, 18);
delay(2000);
Serial.println("pwmWrite 30 anglne 180");
pwmWrite(9, 30);
delay(2000);
}
SG90 서보모터 데이터시트의 PWM 설명과 예제 소스코드이다.
전에 작성했던 Servo 라이브러리를 이용한 서보모터 제어와 똑같이 동작을 하게 작성 하였다.
PWM 라이브러리를 사용하려면 주파수를 설정해 주어야 한다.
SG90 서보모터의 PWM 주기는 20ms이다. 1000ms(1초) / 20ms = 50Hz가 나온다.
이렇게 나온 결과 50을 인자로 넘기면 20ms의 주기 설정은 끝났다. 이제 듀티 사이클을 설정할 차례이다.
Servo 라이브러리 기준 544us에서 2400us의 듀티 사이클로 서보모터를 제어할 수 있다.
544us = 0도 / 1472us = 90도 / 2400us = 180도 이렇게 말이다.
하지만 pwmWrite 함수는 0부터 255의 값을 인자로 받는다.
주기가 20ms로 설정되어 있는 기준 64 = 5ms / 128 = 10ms / 255 = 20ms 이렇게 말이다.
그래서 약간의 계산이 필요하다.
0도 출력 기준
20000us(20ms) / 544us = 36.76us
255 / 36.76us = 7(6.93)
180도 출력 기준
20000us(20ms) / 2400us = 8.33us
255 / 8.33us = 30(30.61)
순간 어떻게 계산해서 결과가 나왔는지 헷갈려서 헤멨다.. (이거 맞나.....?)
아무튼.. 이렇게 pwmWrite를 하게 되면 전에 예제로 만들었던 서보모터 제어와 똑같이 동작을 하게 된다.
위 예제에 대한 결과이다.
'공부 > 아두이노' 카테고리의 다른 글
[아두이노] 풀업 풀다운 저항 회로를 이용하여 입력 신호 플로팅 현상 해결 (0) | 2023.12.14 |
---|---|
[아두이노] EEPROM 라이브러리를 이용한 비휘발성 메모리 저장 (0) | 2023.12.12 |
[아두이노] Servo 라이브러리를 이용한 MG90 서보모터 제어 (0) | 2023.12.12 |
[아두이노] PWM 기본 라이브러리 PWM.h ATimerDefs.h ATimerDefs.cpp BTimerDefs.h BTimerDefs.cpp 소스 코드 (1) | 2023.12.12 |
[아두이노] IR 적외선 리모컨 수신 데이터 0xFFFFFFFF 해결법 (0) | 2023.11.08 |