Arduino Uno : 서보 모터 SG90 without Library
아두이노에서 많이 사용되는 SG90 은 라이브러리를 사용하면 쉽게 제어가 가능하지만, 이번 포스트에서는
SG90 이 동작하는 원리를 파악하기 위해 라이브러리 없이 SG90 을 동작
하는 간단한 예제를 소개합니다.Servo Motor SG90
SG90 아두이노 입문자가 가장 간단한 방법으로 사용 할 수 있는 서보 모터(Servo Motor) 입니다. 서보 모터는 정확한 위치 제어가 가능하기 때문 로봇의 관절과 같이 통제된 움직임이 필요한 곳에 사용 될 수 있습니다. Servo Motor 의 내부 구조는 다음에 하드웨어만 다루는 포스트를 따로 작성하겠습니다.
Servo Motor SG90 과 사용 예시
SG90 HW Spec
SG90 의 주요 스펙은 다음과 같습니다. 같은 SG90 품명이지만 스펙이 다른 경우가 있으니, 자신이 가지고 있는 부품의 데이터 시트를 반드시 확보 및 확인하셔야 합니다. 1
- Weight : 9g
- Torque : 1.2 kg/cm
- Operating Speed : 0.1s / 60 degree
- Pulse Width : 500 ~ 2400 us
- Rotational Range : 0 ~ 180º
- Operating Voltage : 4.8V
SG90 동작 방법
Servo Motor 에는 전원, 데이터, 그라운드의 3개의 핀이 있습니다. 서보모터를 제어하기 위해 데이터 핀에 아래 같이 20ms 주기를 가지는 PWM 신호를 입력하여 서보모터의 각도를 제어할 수 있습니다. 20ms 의 주기에서 0.5 ~ 2.4 ms HIGH 유지하는 시간에 비례하여 Servo Motor의 0 ~ 180º 각도를 제어할 수 있습니다.
Servo Motor SG90 동작 방법
📌분명 같은 SG90 이지만, Pulse Width 가 다른 경우가 있습니다. 이건 제 추측이지만 아래를 참고하세요.
WIre Color 에 따른 Pulse Width
- 갈색, 빨간색, 노란색 : 0.5ms ~ 2.4ms
- 갈색, 주황색, 노란색 : 1m ~ 2ms
모터의 동작 속도
Servo Motor 의 데이터시트에 따르면 동작 속도는 0.12sec / 60degree 로 0º -> 180º 변화시 총 0.36sec 가 소요됩니다.
Hardware : SG90 테스트
준비물
- Arduino Uno x 1EA
- Servo Motor SG90 x 1EA
- Jumper Wires
회로도 및 연결 방법
아두이노 우노 SG90 연결 회로도
위 회로도에서 Servo Motor 의 데이터 핀을 D2 를 연결하였지만, 0번 1번 핀을 제외한 다른 아무 핀들을 사용하셔도 무방합니다. D0 핀과 D1 번핀은 시리얼 통신으로 사용할 예정입니다.
SG90 배선
- 주황색(또는 노란색) : DATA -> Arduino Uno D2 Pin
- 빨간색 : 전원(5V)
- 갈색 : 그라운드(0V)
라이브러리 없이 동작 시켜 보기
코드
SG90 라이브러리 없이 Servo Motor 를 제어하는 코드 입니다. 내부 구조 원리를 이해하고 동작 시키기 위한 코드로 봐주시면 됩니다. 라이브러리를 사용하면 내부 구조를 몰라도 충분히 동작 시킬 수 있지만, 혹시 비슷한 부품이나 이와 같이 PWM 으로 제어하는 다른 부품을 사용하게 되었을 때 참고용으로 봐주세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <MsTimer2.h> #define SERVO 2 #define PWM_RANGE_MIN 544 // 0 degree #define PWM_RANGE_MAX 2400 // 180 degree String strAngle; // Angle entered by serial communication boolean flag = false; // Enable when data is entered by serial communications int dutyHIGH = 1500; // PWM HIGH Duration void setup(){ pinMode(2, OUTPUT); MsTimer2::set(20, setServo); // 20ms Period Timer Interrupt MsTimer2::start(); Serial.begin(115200); Serial.print("Input Angle 0 ~ 180 : "); } void loop(){ if(flag == 1){ // Run when serial data is received flag = 0; int temp = strAngle.toInt(); strAngle = ""; if((temp >= 0) && (temp <= 180)){ dutyHIGH = map(temp, 0, 180, PWM_RANGE_MIN, PWM_RANGE_MAX); } else{ // for error handling Serial.println("Please Input Reand 0 ~ 180..!"); } Serial.print("Input Angle 0 ~ 180 : "); } } void setServo(){ // Function executed at 20 ms intervals digitalWrite(SERVO, HIGH); delayMicroseconds(dutyHIGH); digitalWrite(SERVO, LOW); } void serialEvent(){ char myChar = (char)Serial.read(); if((myChar >= '0') && (myChar <= '9')){ // for error handling strAngle += myChar; } else if(myChar == '\n'){ flag = true; } } | cs |
코드 설명
- 3~5Line : Servo Motor 의 연결 또는 Pulse Width 스펙이 다른 경우 설정 할 수 있는 선언문입니다.
- 13~14Line : 20ms 간격으로 Timer Interrupt Service Routine 을 설정하고 타이머를 실행합니다.
- 20~29Line : 시리얼 통신으로 각도데이터가 입력되면 Duty High 시간을 계산하여
dutyHIGH변수에 입력합니다. 조건문은 입력된 각도 값이 0 ~ 180 의 범위가 아닌 경우 에러처리를 위하여 사용되었습니다. - 34~38Line : 20ms 주기마다 실행되는 함수로 모터 연결 핀을 dutyHIGH 변수의 수만큼 HIGH 시간을 유지 합니다.
- 40~46Line : 시리얼 포트로 각도 값을 입력 받습니다. 조건문은 숫자가 아닌 값인 경우의 에러 처리를 위해 사용되었습니다.
본 코드에서 시리얼 인터럽트로 여러 문자를 한번에 받는 방법 및 MsTimer2 라이브러리를 사용하여 타이머 인터럽트를 사용하는 방법은 아래 링크를 참조해주세요.
아두이노 강좌 #14 타이머 인터럽트 MsTimer2.h
아두이노 코딩 : 엔터 입력시(문장단위) Serial Echo 프로그램, Putty 로 CR+LF 전송
실행 결과
위의 코드를 실행하면 아래 동영상과 같이 시리얼 통신으로 각도 제어가 가능합니다.
마무리
Servo Motor SG90 의 동작 방법에 대해 알아보고, 라이브러리 없이 구현하는 방법
에 대해 소개하였습니다. 이 방법을 사용해야 하는 것은 아니고, 동작 원리를 파악하기 위한 용도로 봐주시면 됩니다. 실제 구현은 아두이노에서 제공되는 라이브러리를 사용하시면 됩니다. 이후에 라이브러리를 사용하는 방법도 소개할 예정입니다.끝까지 읽어주셔서 감사합니다.😄
- https://datasheetspdf.com/pdf-file/791970/TowerPro/SG90/1 [본문으로]
'Embedded > Arduino' 카테고리의 다른 글
아두이노 코딩 : 시리얼 통신으로 서보 모터 SG90 제어 (1) | 2020.08.29 |
---|---|
아두이노 강좌 #30 Servo 라이브러리 기본 사용법 (9) | 2020.08.29 |
아두이노 강좌 #28 2차원 배열 PROGMEM 매크로 사용 방법 (0) | 2020.08.26 |
아두이노 강좌 #27 동적 메모리 용량 부족 문제 PROGMEM F() 메크로로 해결 (1) | 2020.08.25 |
Arduino LED Matrix Spectrum Effect - Audio Spectrum Visualizer Project Part.1 (2) | 2020.08.23 |