정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

servo 예제) 모터 작동 및 출력 결과 오류 관련 질문
컴솜솜 | 2020-04-30

1. 프로젝트 사용한 보드 종류 

아두이노 UNO

 

2. 사용한 개발 프로그램명

sketch

  

3. 사용한 센서 모델명

  (센서 모델명을 자세하게 적어 주실 경우 더 정확하게 확인할 수 있습니다.)

 Tower Pro tm/Micro Servo 9g/SG 90

 

4. 연결한 회로 설명 (또는 이미지)

 5V, GND, 9번 포트 사용했습니다.

 

5. 소스코드 (주석 필수)

  (원하는 기능의 코드를 전부 작성해 드리긴 어렵습니다. 기초부터 차근차근 공부해보면서 코드를 만들어 보세요.)

 

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9);  // 데이터 번호
  Serial.begin(9600); //초당 9600 비트의 속도로 통신 설정
  Serial.println("Servo Motor Version 1 ");
}

void loop() {
  String szTemp = ""; // 입력값 받을 변수
  if (Serial.available()) { // 시리얼 창에 입력받은 값이 존재할 경우 실행
    for (int i=0; i < Serial.available(); i++){ // 입력받은 값이 길이만큼 반복문 실행
      char cRead = Serial.read(); // 입력값을 한 바이트씩 읽는다
      szTemp += cRead;
    }
    Serial.print(szTemp); // 삭제할 주석 : szTemp 잘 들어갔는지 확인
    int input = szTemp.toInt(); // szTemp int로 타입변형
     myservo.write(input); // servo 객체에 정보 올림
     Serial.print("Move to: "); Serial.println(input); // input 제대로 들어갔는지 확인
  }
}

 

 

6. 문제점 및 에러 내용

  (소스코드 문제일 경우 에러 내용도 같이 올려주세요.)

 

<현재 시리얼 모니터 결과값 : 100을 입력한 결과>

Servo Motor Version 1 
1Move to: 1
0Move to: 0
0Move to: 0

Move to: 0

 

<원하는 결과값 : 100을 입력한 결과>

// 삭제할 주석을 삭제한경우

Servo Motor Version 1 
Move to: 100

 

<문제점>

1) 100을 입력한 결과 100으로 출력되지 않고 한칸한칸 따로 출력됨

2) servo 객체에 올린 경우, 실행이 1회만 적용됨

// 추가적으로 여러 케이스(예:50, 90)을 입력할 경우 servo 모터에 반응 없음

3) 100을 입력했는데 마지막에 0이 한번더 출력됨

 

<궁금한 점>

이 부분 : Serial.print(szTemp); // 삭제할 주석 : szTemp 잘 들어갔는지 확인

1) szTemp에 char을 한자씩 잘 넣어줬는데 왜 100이 출력이 안되고 한자씩 출력되는지

2) 마지막 추가적으로 출력되는 0의 출처

3) loop로 무한 반복되는데 입력에 대한 작동이 왜 1번만 이루어지는지

프로필사진

판다마니아 2020-05-08 08:55:41

시리얼 통신은 데이터를 1글자씩 전달합니다.

 

100이라는 글자를 넘겼으면 숫자 100을 한번에 전달하는게 아니라 문자 '1', '0', '0' 이렇게 3번 전달하게 되는거죠

그렇기 때문에 50, 90을 입력했을 경우에도 결과가 '5', '0' ',' '9' '0' 이 입력되기때문에 마지막에 입력되는 값 0이 동작되서 모터에 반응이 없게 됩니다.

 

마지막에 0이 한번 더 출력되는 문제는 시리얼 모니터 하단에 보시면 line ending 없음, 새줄, 캐리지 리턴 ... 등 설정하는 부분이 있는데 이게 새 줄이나 캐리지 리턴, Both CR & NL 이렇게 되어있어서 마지막에 종결문자 하나가 더 전달되서 그렇게 됩니다.

 

Serial.available 함수는 데이터가 전달 되었을 때에만 참으로 리턴을 줍니다. 데이터를 한번 전달하면 전달받은 데이터가 있을 때에만 동작을 하게 되고 아무런 데이터가 없을시에는 거짓이 되어 if 문 안에 명령어가 동작하지 않게 됩니다.

 

loop문은 무한으로 반복하고 있는데 이 if문에서 거짓이 되어 동작을 안하는 거 처럼 보이게 되는겁니다.

 

 

 

 

프로필사진

컴솜솜 2020-05-09 05:07:06

답변감사합니다!!

이전글   |    아두이노 gps와 블루투스 연결 2020-04-27
다음글   |    exit status 1 보드 Arduino Uno 컴파일 에러 / 이유를 모르겠습니다 ... 2020-05-01