Mechanic 공방

18. 아두이노 서보 모터 실습 (2) 본문

아두이노 (Arduino)

18. 아두이노 서보 모터 실습 (2)

H-Mechanic 2020. 8. 23. 12:28
728x90
반응형

이번 포스팅에서는 원하는 각도를 입력했을 때 서보 모터가 입력값만큼만 움직이도록 제어하는 실습을 해보고자 한다.

 

[회로도]

회로도는 저번 실습과 동일하다.

[코드 설명]

#include <Servo.h>

int servo_pin = 8;
int ang_init = 0;
int ang_in;
int ang_sum = 0;

Servo servo;

void setup() {
  Serial.begin(9600);
  servo.attach(servo_pin);
  servo.write(ang_init);
}

void loop() {
  while (Serial.available() == 0) {}
  ang_in = Serial.parseInt();
  ang_sum += ang_in;
  servo.write(ang_sum);
  Serial.print("input angle: ");
  Serial.print(ang_in);
  Serial.print("/ total angle: ");
  Serial.println(ang_sum);
  ang_in = Serial.read();
  Serial.println(" ");
  if (ang_sum > 180) {
    Serial.println("Max angle... Reset to Zero");
    servo.write(ang_init);
    ang_sum = 0;
  }
}

 

본 실습에서는 Serial Monitor 상에 원하는 각도를 입력하게 되면 각도가 누적되어 구동하도록 제어하고자 한다.

 

아두이노에서는 Serial Monitor 상에서 직접 값을 입력하여 코드 상에서 사용할 수 있는데, 이 때 사용하는 함수 구문은 ‘Serial.parseInt()’이다.

 

Int 형의 변수를 입력받을 때 사용하는 구문으로, 위 코드 상에서는 입력받은 값을 ‘ang_in’이라는 변수에 저장하도록 하였다.

 

코드의 하단 부분에 ‘Serial.read()’ 구문 역시 값을 받아들이는 구문인데, 위의 구문과 달리 Serial Monitor 상에 어떤 값이 들어왔다는 것만 인식할 수 있다.

 

즉 서보모터를 구동시키기 위한 각도 값(10진수)을 입력해도, 그 값이 그대로 들어오는 것이 아닌 아두이노 상에서 값이 들어왔다는 인식만 할 수 있다.

 

위 코드에서는 입력 받은 값을 ‘ang_in’ 변수에 저장하고, 이를 ‘ang_sum’이라는 변수에 누적시키면서 구동한다.

 

값을 입력받고 구동하는 과정에서 ‘ang_sum’ 값이 서보모터가 구동할 수 있는 제한 각도를 넘어가게 되면 자동으로 값을 0으로 리셋하는 방식이다.

 

즉, Serial Monitor를 실행시키고 '30 -> 90 -> 50 -> 20'의 순서대로 각각 숫자를 입력하게 되면, 서보 모터는 30도 회전 후 120도까지 회전을 하고, 170도까지 회전한 뒤 다시 0도로 돌아오게 되는 동작을 한다.

 

이번 실습에서 알 수 있는 것은 서보 모터의 경우 단순히 원하는 각도를 입력하게 되면 모든 각도 입력을 0도에서부터로 인식하게 된다.

 

즉, 위에서와 같이 숫자를 입력할 경우, 'ang_sum' 변수가 없이 'ang_in' 변수만 있다고 하면, 30도를 회전하고 다시 90도를 회전할 때 0도로 돌아간 뒤 그 지점에서부터 90도를 회전하게 된다.

 

아래 그림을 보면 이해하기 쉬울 것이다.

반면에 위 코드처럼 'ang_sum' 변수를 사용하여 제어를 하게 되면, 아래와 같이 각도가 누적되어 움직이게 된다.

 

다음 실습에서는 가변 저항을 사용한 서보 모터 제어를 해보도록 하겠다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

질문 댓글은 언제든지 환영입니다~^^

728x90
반응형