아두이노 서보모터 제어 - 라이브러리 없이 PWM 직접 만들기 (Tinkercad 한계 포함)
목표
서보모터를 Arduino UNO에서 제어하되,
Servo 라이브러리를 사용하지 않고 직접 PWM을 생성하는 방법
기본 서보모터 원리
- 서보 제어 주기: 20ms (50Hz)
- HIGH 펄스 시간에 따라 각도가 정해짐
- 1.0ms: 0도
- 1.5ms: 90도
- 2.0ms: 180도
1. 라이브러리 없이 PWM 생성 코드 (Tinkercad에서도 동작)
void setup() {
pinMode(9, OUTPUT);
}
void loop() {
// 0도
digitalWrite(9, HIGH);
delayMicroseconds(1000); // 1ms
digitalWrite(9, LOW);
delay(20);
delay(1000);
// 90도
digitalWrite(9, HIGH);
delayMicroseconds(1500); // 1.5ms
digitalWrite(9, LOW);
delay(20);
delay(1000);
// 180도
digitalWrite(9, HIGH);
delayMicroseconds(2000); // 2ms
digitalWrite(9, LOW);
delay(20);
delay(1000);
}
Tinkercad에서도 서보 회전 정상 작동합니다.
delayMicroseconds()로 정확한 펄스를 직접 생성합니다.
단점: 50Hz 주기를 정확히 맞추긴 어려움 (서보에 큰 문제는 없음)
2. 타이머1을 활용한 정확한 PWM 생성 코드 (실제 아두이노에서만 동작)
void setup() {
Serial.begin(9600); // 시리얼 먼저 초기화
pinMode(9, OUTPUT);
TCCR1A = 0; // Timer1 초기화
TCCR1B = 0;
TCCR1A |= (1 << COM1A1) | (1 << WGM11); // 비반전 출력, 모드 14
TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11); // Fast PWM, 분주비 8
ICR1 = 40000; // TOP: 16MHz / 8 = 2MHz → 40000 = 20ms
OCR1A = 3000; // 1.5ms = 중립 위치 (90도)
}
void loop() {
// 각도에 따라 OCR1A 변경
OCR1A = 2000; // 1ms = 0도
delay(1000);
OCR1A = 3000; // 1.5ms = 90도
delay(1000);
OCR1A = 4000; // 2ms = 180도
delay(1000);
}
매우 정확한 50Hz PWM 신호 생성
Tinkercad 시뮬레이터에서는 작동하지 않음
반드시 실제 보드에서만 테스트 가능
Tinkercad 사용 시 주의사항
기능 실제 보드 Tinkercad
Servo 라이브러리 사용 | O | O |
delayMicroseconds() 기반 직접 PWM | O | O |
하드웨어 타이머 직접 제어 (TCCR1x, OCR1x 등) | O | X (작동안함) |
정리
- 서보모터는 50Hz 주기로 1~2ms 펄스만 있으면 제어 가능
- 라이브러리 없이도 delayMicroseconds()로 제어 가능 (Tinkercad OK)
- 정밀하게 하려면 Timer1 직접 제어가 필요하지만, 이건 실제 보드에서만 가능
- Tinkercad는 하드웨어 타이머를 제대로 시뮬레이션하지 않음
'아두이노' 카테고리의 다른 글
아두이노 버튼(Pull-down, Pull-up) & LED 제어 예제 (0) | 2025.04.22 |
---|---|
아두이노 버튼 풀업(Pull-up), 풀다운(Pull-down) 회로 예제 (0) | 2025.04.21 |
아두이노로 DC 모터 제어하기! L298N 모듈 완벽 가이드 (0) | 2025.04.18 |