아두이노 코딩 : 시리얼 통신으로 서보 모터 SG90 제어
Lucy Archive
Lucy / Facilitate4U
2020. 8. 29. 01:12

Arduino SG90 SerialArduino SG90 Serial

Arduino Uno : Servo Motor Control vis Serial

이전 포스트에서 Servo 라이브러리 기초 사용법에 대해 설명하였습니다. 이번 포스트에서는 응용 예제로

시리얼 통신으로 SG90 을 제어하고, 정상적인 값이 아닌 입력을 받은 경우 에러 처리

하는 방법에 대해 소개합니다.


Hardware

준비물

본 예제의 구성품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • Servo Motor SG90 x 1EA 
  • Jumper Wires

회로도 및 연결

Servo Motor SG90 사용을 위해 servo 라이브러리를 사용하는 경우 서보 모터 데이터핀은 아두이노 우노 보드의 9번 또는 10번 포트에 연결되어야 합니다. SG90 과 Arduino Uno 보드의 핀 연결은 아래를 참고해주세요.

  • SG90
    • 주황색(또는 노란색) : 데이터핀 -> Arduino Uno 9 Pin
    • 빨간색 : 전원 (5V)
    • 갈색 : 그라운드 (0V)

시리얼 통신으로 SG90 제러

코드

  • PC 시리얼 모니터에서 입력된 angle 값으로 서보 모터 제어
  • PC 시리얼 모니터에서 0 ~ 180 이외의 값 입력시 에러 처리
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//서보모터 라이브러리 참조
#include <Servo.h>
// 시리얼 통신 속도 및 서보모터 핀 설정
#define BUADRATE 9600
#define SERVO 9
// myServo : 서보모터 클래스 변수 생성, 
// strAngle : 시리얼 통신으로 입력 받을 angle 각도 저장
Servo myServo;
String strAngle;
 
// angle : 서보모터 제어에 사용할 실제 angle 값
// flag : 시리얼 통신으로 angle 입력시 이벤트를 발생 flag
int angle;
boolean flag = false;
 
void setup() {
    myServo.attach(SERVO);
    Serial.begin(BUADRATE);
    while(!Serial){
        ;
    }
    delay(500);
    Serial.println("Program Start..");
    Serial.print("Input Servo Angle >> ");
}
 
void loop() {
    // 입력된 문자열이 유효값인지 판단을 위한 temp 변수
    if(flag == true){
        flag = false;
        angle = strAngle.toInt();
        strAngle = "";
        // 입력된 값이 0 ~ 180 일때만 Servo 모터 제어
        if (angle >= 0 && angle <= 180)
        {
            // angle 값 변경 후, read() 함수가 재대로 동작하도록 write() 함수 1회 실행
            myServo.write(angle);
            Serial.print("Servo Angle : ");
            Serial.println(myServo.read());
            Serial.print("Input Servo Angle >> ");
        }
        else
        {
            ErrorHadler();
        }
    }
    delay(20);
}
 
// 시리얼 통신으로 문자 수신 되면 발생하는 함수
// PC 에서 엔터가 눌러지면(캐리지 리턴 발생), flag 를 1 입력
void serialEvent()
{
    char cTemp = (char)Serial.read();
    if (isDigit(cTemp) || cTemp == '\b'){
        strAngle += cTemp;
    }
    else if(cTemp == '\n'){
        flag = true;
    }
    else if(cTemp == '\r'){
        if (strAngle == "") ErrorHadler();
    }
    else/* if (cTemp < '0' || cTemp > '9') */
        ErrorHadler();
    }
}
 
// 시리얼 모니터에서 0 ~ 180 이외의 값 입력시 안내 메세지 출력
void ErrorHadler()
{
    Serial.println("Error! Input Angle Number 0 to 180..");
    strAngle = "";
    Serial.print("Input Servo Angle >> ");
}
cs

코드 설명

  • void loop() 문에서..
    • myString 에 저장된 값이 0 ~ 180 사이의 유효한 값일 때만 servo 모터를 제어
    • 유효한 값이 아닐경우 ErrorHandler() 함수 호출
  • void serialEvent() 에서..
    • 시리얼 통신으로 입력된 값이 숫자일경우에만 전역변수 myString 에 저장되도록 조건 문 설정
    • 유요한 값이 아닐 경우 ErrorHandler() 함수 호출
  • void ErrorHandler() 에서..
    • 시리얼 통신으로 유효한 값이 아닐 경우 호출 되는 함수
    • 에러 메세지를 출력하고, myString 을 공백으로 초기화 함

실행 결과


마무리

이번 포스트에서는 서보 모터 SG90 사용 응용 예제로 시리얼 통신으로 서보 모터를 제어하는 코드를 소개하였습니다.

SG90 제어 방법외에 시리얼 통신으로 원하지 않는 데이터 처리하는 방법

도 필요시 참고해주세요. 끝까지 읽어 주셔서 감사합니다.😄
관련포스트

👉 아두이노 시리얼 통신 관련글 목록 보기

👉 아두이노 SERVO MOTOR 관련글 목록 보기

👉 아두이노 모터 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기