본문 바로가기

아두이노

아두이노로 서보모터 제어하기 (SG90)

아두이노로 서보모터 제어하기 (SG90) 


안녕하세요!!!!!!

오늘은 라이브러리 없이 서보모터 구동하기 입니다!!

차근차근 갑시다!!


1. 서보모터의 이해

 

서보모터는 아래와 같이 생겼습니다!

개발자가 -90도 ~ 90도를 명령하는 대로

회전시켜주는 모터라고 생각하면 됩니다!!

RC 장난감들의 진행방향을 바꿔줄 때 자주 사용합니다!!

 

 

아래의 그림은 뭐냐!!?

서보모터(SG90)의 배선도와

PWM 신호의 듀티비에 따른 동작을 나타냅니다!!

 

 

 

내용을 요약하자면,

- PWM 신호의 1 주기는 20ms

  - Duty Cycle이 1.0ms이면 -90도

- Duty Cycle이 1.5ms이면 0도

  - Duty Cycle이 2.0ms이면 90도

 

위 Duty Cycle에 따른 동작원리를 잘 기억해주세요!!

 


 

2. 회로도

 

아두이노의 D7핀에서 서보모터의 PWM signal 입력받기로 합시다!

그리고 서보모터의 전원(5V)와 GND는

아래와같이 아두이노의 5V/GND핀과 연결해줍시다!!

 

 

 


3. 코드

 

결론부터 말씀드리자면, 제가 실험한 결과에서는

서보모터 -90도 : 1주기(20ms) 중 0.5ms

서보모터    0도 : 1주기(20ms) 중 1.5ms

서보모터 +90도 : 1주기(20ms) 중 2.5ms

위와 같이 데이터시트와는 달랐습니다 ! ㅠ

 

void setup() {
    pinMode(7,OUTPUT); // 아두이노 D7핀, OUTPUT 설정
    
}

void loop() {
  int i = 0;

  // 서보모터 -90도 : 20ms 중 0.5ms
  for(i=0; i<30 ; i++)
  {
    digitalWrite(7,LOW);
    delayMicroseconds(15000);
    delayMicroseconds(5000-500);
    digitalWrite(7,HIGH);
    delayMicroseconds(500);
    digitalWrite(7,LOW);
  }
  
  delay(500);

  // 서보모터 0도 : 20ms 중 1.5ms
   for(i=0; i<30 ; i++)
  {
    digitalWrite(7,LOW);
    delayMicroseconds(15000);
    delayMicroseconds(5000-1500);
    digitalWrite(7,HIGH);
    delayMicroseconds(1500);
    digitalWrite(7,LOW);
  }
  
  delay(500);

  // 서보모터 90도 : 20ms 중 2.5ms
   for(i=0; i<30 ; i++)
  {
    digitalWrite(7,LOW);
    delayMicroseconds(15000);
    delayMicroseconds(5000-2500);
    digitalWrite(7,HIGH);
    delayMicroseconds(2500);
    digitalWrite(7,LOW);
  }
   delay(500);
}

 

Q1. for문은 왜 썼는가?

서보모터에서 한 싸이클만 입력받으면 동작을 안해서

30싸이클을 입력받도록 하였습니다!!

 

Q2. delayMicroseconds()를 둘로 나눈 이유?

delayMicroseconds()의 최대 값은 16383이므로

해당 값을 넘으면 오작동하기 때문입니다!

 


4. 결과

 

코딩한 대로 -90도, 0도, 90도를 반복!!!!

 

 

오실로스코프 가로 1칸이 1ms이며

세로는 1칸에 5V입니다!!!

 

Duty Cycle의 HIGH 신호가

0.5ms, 1.5ms, 2.5ms를 반복함에 따라

-90도,   0도  , 90도 임을 확인할 수 있습니다!!

 

 

데이터시트를 참고하여 설계합시다!

 

-끝-

'아두이노' 카테고리의 다른 글

아두이노로 조이스틱 제어하기 (SZH-EK056)  (0) 2020.05.08