Arduino Uno : Servo Motor Control vis Serial
이전 포스트에서 Servo 라이브러리 기초 사용법에 대해 설명하였습니다. 이번 포스트에서는 응용 예제로
Hardware
마무리
시리얼 통신으로 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 제어 방법외에 시리얼 통신으로 원하지 않는 데이터 처리하는 방법
도 필요시 참고해주세요. 끝까지 읽어 주셔서 감사합니다.😄'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #32 스텝 모터 28BYJ-48 5V 라이브러리 없이 동작 - 여자 방식 비교 (2) | 2020.09.02 |
---|---|
아두이노 강좌 #31 Step Stepper Motor 내부 구조 동작 원리 (0) | 2020.08.30 |
아두이노 강좌 #30 Servo 라이브러리 기본 사용법 (9) | 2020.08.29 |
아두이노 강좌 #29 Servo Motor SG90 라이브러리 없이 사용 (0) | 2020.08.28 |
아두이노 강좌 #28 2차원 배열 PROGMEM 매크로 사용 방법 (0) | 2020.08.26 |