7-2 서보형 라이브러리 함수의 사용

공부하는 학생 A·2024년 2월 17일

아두이노 

목록 보기
34/74

서보모터

서보모터를 제어하는 아두이노 프로그램을 작성하려면 서보 라이브러리가 필요하다.

아두이노 표준 라이브러리인 servo.h는 다음과 같은 함수를 제공

함수설명
void attach(pin)서보모터를 제어할 핀을 설정
void attach(pin, min_us, max_us)펄스 폭 A의 최소, 최댓값까지 지정
void write(angle)특정 각도만큼 모터를 회전 (angle: 0~180)
void writeMicrosecond(us)펄스 폭 A를 us단위로 지정
int read( )현재 각도를 읽음 (반환 값은 [ 0, 180 ]의 정수)
boolean attached( )서보모터 핀이 지정되어 있는지 검사
void detach( )서보모터의 지정된 핀을 내부적으로 제거

Servo myServo

서보 라이브러리의 함수를 사용하여 서보모터를 제어하기 전에 다음과 같이 서보모터 객체를 형성한다. myServo는 새롭게 생성한 서보 객체의 이름이다.

void attach(pin)

이 함수는 서보모터를 어느 핀으로 제어할지 설정하는 함수이다.

myServo.attach(pin);

  • myServo : 사용할 서보 객체 변수(이름)
  • pin : 사용할 핀 번호
  • (예) myServo.attach(9); // 9번 핀으로 서보모터를 제어하도록 설정

myServo.attach(pin,min,max)

  • min : 서보의 최소 각도(0도)에 해당하는 펄스 폭을 마이크로초로 표현, 기본값은 544
  • max : 서보의 최대 각도(180도)에 해당하는 펄스 폭을 마이크로초로 표현, 기본값은 2400

void write(angle)

서보에 angle 값을 전달하여 값을 따라 샤프트를 해당 방향으로 이동시킨다.

myServo.write(angle)

  • myServo : 사용할 서보 객체 변수(이름)
  • angle : 서보에 기록할 값(0~180)
  • (예) myServo.write(90); // 서보를 mid-point로 설정

void writeMicroseconds(us)

서보에 값을 마이크로초(us)에 전달하여 샤프트를 제어한다. 표준 서보에서는 샤프트 각도가 설정된다. 표준 서보에서 파라미터 값 1000은 샤프트를 시계 반대 방향으로, 2000은 시계 방향으로, 1500은 가운데에 위치시킨다.

myServo.writeMicroseconds(us)

  • us : 마이크로초 단위의 매개변수 값 ( int, 정수 )
  • (예) myServo.writeMicroseconds(1500); // 서보를 mid-point로 설정

int read( )

  • 서보의 현재 각도(0도~180도)를 읽어서 변환한다. 이 값은 write( ) 함수에 마지막으로 전달된 값이다.

boolean attached( )

  • 이 함수는 서보가 핀에 연결되어 있는지를 확인한다. 서보가 핀에 연결되어 있으면 true를 반환하고 그렇지 않으면 false를 반환핟.

void detach( )

  • 서보 객체를 핀에 분리한다.

스케치 7-1 회로 제작

스케치 7-1 서보모터 샤프트의 180도 회전 제어

#include <Servo.h>
Servo myServo; // 서보모터를 제어하기 위한 서보 객체의 생성
// 대부분의 보드에서 서보 객체를 12개까지 생성할 수 있다.
int angle = 90; // 서보 위치(각도)를 저장하기 위한 변수
void setup() {
  myServo.attach(12);  // 핀 12번에 연결된 서보를 서보 객체에 배속시킴
}

void loop() {
  for (angle = 0; angle <= 180; angle += 1) { // 0도에서 180도로 1도씩 이동
    myServo.write(angle);            // pos가 가진 각도의 위치로 이동
    delay(15);                       // 서보가 해당 위치에 도달할 때까지 15ms 대기
  }
  for (angle = 180; angle >= 0; angle -= 1) { // 180도에서 0도로 1도씩 이동
    myServo.write(angle);            // pos가 가진 각도의 위치로 이동
    delay(15);                       // 서보가 해당 위치에 도달할 때까지 15ms 대기
  }    
}

스케치 7-1 분석

서보모터의 샤프트를 0도에서 180도까지, 180도에서 0도까지 이동시키는 아두이노 프로그램

스케치 7-2 회로 제작

스케치 7-2 푸시버튼을 이용한 서보모터의 회전 제어

#include <Servo.h>
Servo myServo;    // 서보모터 객체를 생성하고 이름을 myServo로 설정
int motorPin = 12; // 서보모터를 12번 핀에 연결
int pushPin = 7;   // 푸시 버튼을 7번 핀에 연결
int angle = 90;    // 초기에 샤프트는 중간에 위치
int state=0;  // 회전방향 설정. state 값이 0이면 시계 방향, 1이면 반시계 방향으로 회전
void setup() {
  myServo.attach(motorPin); // 서보 모터를 아두이노의 해당 핀에 연결
  pinMode(pushPin,INPUT);  // 푸시 버튼이 연결된 핀을 입력 모드로 설정
  Serial.begin(9600); // 시리얼 모니터와 통신 
  Serial.println("Enter the push button."); // 시리얼 모니터에 문자열 출력
}

void loop() {
  if (digitalRead(pushPin) == HIGH){
    if (state == 0) {  
      angle += 1;               // 각도를 1도씩 증가
      if (angle>=180) state = 1; // 회전 방향을 반시계 방향으로 전환
      myServo.write(angle);     // angle 값을 서보에게 전달하여 기록
      delay(10);
      Serial.println(angle);  // 현재 각도를 시리얼 모니터에 표시
    }
    else {  
      angle -= 1;
      if (angle<=0) state = 0; // 회전 방향을 시계 방향으로 전환
      myServo.write(angle);
      delay(10);
      Serial.println(angle);          
    }
  }
}

스케치 7-2 실행결과

(현재각도를 시리얼 모니터에 표시)

스케치 7-3 회로 제작

스케치 7-3 가변저항을 이용한 서보모터의 회전제어

#include <Servo.h> 
Servo myServo;
void setup() {
  Serial.begin(9600); // 시리얼 모니터와의 통신
  myServo.attach(12);  // 디지털 12번 핀을 이용하여 서보모터를 제어 
}

int val;   // 가변저항의 출력 값을 읽어서 저장할 변수
int angle; // 
void loop() {
  val = analogRead(A0);
  angle = map(val, 0, 1023, 0, 180); // 0~1023의 가변저항 출력값을 0~180도로 매핑
  myServo.write(angle); 
  Serial.println(angle); // 현재 angle 값을 시리얼 모니터에 표시
  delay(50);    
}

스케치 7-3 분석

가변저항은 사용자가 전자 회로 내부의 저항 값을 바꿀 수 있는 부품이다. 가변저항은 세 개의 핀(Vcc,Vin 및 GND)을 가지고 있다. 가변저항기는 Vcc를 통하여 아두이노의 5V를 입력으로 받아서 손잡이를 돌리는 정도에 따라 0V에서 5V 사이의 전압을 출력한다. 아두이노는 가변저항기의 출력 전압의 크기를 0에서 1023의 크기로 나누어 아날로그 핀으로 읽는다.

스케치 7-3 실행결과

(가변 저항을 조절하면 시리얼 모니터에 표시됨)

스케치 7-4 회로 제작

스케치 7-4 시리얼 통신을 이용한 서브모터 제어

#include <Servo.h>    // 서보모터 라이브러리

Servo myServo;    // 서보모터 사용을 위한 객체 생성

int motor = 12;  // 서보모터의 핀 
int angle = 90; // 서보모터 초기 각도 값
void setup() {
  myServo.attach(motor);  // 서보모터 연결
  Serial.begin(9600);  // 시리얼 모니터 시작
  Serial.println("Initial angle : 90 degrees"); // 초기값 출력
  Serial.println("Enter U(u) or D(d)"); // u 또는 d키 입력하기
  Serial.println("U : Increase the angle by 5 degrees.");   // U : 현재 각도에서 5도 증가
  Serial.println("D : Decrease the angle by 5 degrees.");   // D : 현재 각도에서 5도 감소
}

void loop() {
  if(Serial.available())  // 시리얼모니터가 사용가능할 때
  {
    char input = Serial.read(); // 문자 입력받기
    if(input == 'U' || input == 'u')    // U(u) 키를 누를 때
    {
      for(int i = 0; i < 5; i++)  // 현재 각도에서 15도 더해주기
      {
        angle += 1;   
        if(angle >= 180) angle = 180;
        myServo.write(angle); 
        delay(10);
      }
      Serial.println(angle);  // 현재 각도 출력
    } 
    else if(input == 'D' || input == 'd')   // D(d)키를 입력했을 때
    {
      for(int i = 0 ; i < 5 ; i++)  // 현재 각도에서 15도 빼주기
      {
        angle -= 1;
        if(angle <= 0) angle = 0;
        myServo.write(angle);
        delay(10);
      }
      Serial.println(angle);  // 현재 각도 출력
    }
    else if(input == '\n') {  // 엔터키의 입력에는 무반응
    }
    else { // U(u) 또는 D(d) 이외의 문자를 입력하였을 때
      Serial.println("wrong character!!");
    }
  }
}

스케치 7-4 실행결과

( U를 입력하면 5도 증가 D를 입력하면 5도 감소 )

( 잘못된 값을 입력했을 경우 )

profile
Shine like a star, Just like a star

0개의 댓글