아두이노로 서보모터 제어하기 (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 |
---|