본문 바로가기
아두이노

아두이노 서보모터 제어 - 라이브러리 없이 PWM 직접 만들기 (Tinkercad 한계 포함)

by 꼬맹님 2025. 4. 22.

아두이노 서보모터 제어 - 라이브러리 없이 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는 하드웨어 타이머를 제대로 시뮬레이션하지 않음