본문 바로가기
아두이노

서보모터 함수선언과 제어

by SwMaker_Jun 2024. 3. 25.
728x90
반응형

1. 아두이노 함수 선언

     아두이노는 C언어 기반으로   void 함수이름(){   }  형식으로 문법을 선언할 수 있다. 

 

 

2. 함수 선언과 각도 제어

     아두이노에서 함수를 선언하여 특정 작업을 수행하는 코드 블록을 만들 수 있습니다.

 

     이 예제에서는 move90과 move180이라는 두 개의 함수를 선언하여 서보모터를 각각 90도와 180도 위치로

     움직이게 합니다.

   

     먼저, Servo.h 라이브러리를 포함시키고 서보모터 객체를 생성합니다. 그 다음, setup() 함수에서 서보모터를

     특정 핀에 연결합니다. loop() 함수 내에서는 두 개의 사용자 정의 함수를 번갈아가며 호출하여 서보모터가

     0도에서 90도, 그리고 0도에서 180도로 움직이게 합니다.

 

사용자 정의 함수 move90()과 move180()

  • move90(): 서보모터를 0도에서 90도로 천천히 움직이게 하는 함수선언
  • move180(): 서보모터를 0도에서 180도로 천천히 움직이게 하는 함수선언
#include <Servo.h>
Servo servo_1;  // 서보모터 객체 생성

// 서보모터를 0도에서 90도로 움직이는 함수 선언
void move90() {
  for(int angle = 0; angle <= 90; angle++) { // 0도에서 시작하여 90도까지
    servo_1.write(angle);
    delay(15); // 각도 변경 사이의 짧은 지연
  }
}

// 서보모터를 0도에서 180도로 움직이는 함수 선언
void move180() {
  for(int angle = 0; angle <= 180; angle++) { // 0도에서 시작하여 180도까지
    servo_1.write(angle);
    delay(15); // 각도 변경 사이의 짧은 지연
  }
}



void setup() {
  servo_1.attach(3); // 서보모터를 디지털 3번 핀에 연결
  servo_1.write(0);  // 서보모터 처음 각도 세팅
}

void loop() {
  move90();  // 서보모터를 90도로 움직임
  delay(1000); // 1초 대기
  move180(); // 서보모터를 180도로 움직임
  delay(1000); // 1초 대기
}

 

이 코드는 먼저 서보모터를 0도에서 90도로 천천히 움직이게 한 다음, 1초 후

서보모터를 0도에서 180도로 천천히 움직이고 다시 1초를 기다립니다.

 

move90()move180() 함수는 서보모터의 움직임을 제어하기 위해

for 루프와 servo_1.write() 메서드를 사용합니다.

 

각 함수는 서보모터를 점진적으로 원하는 각도로 회전시키며,

각도 변경 사이에는 짧은 지연(delay(15))을 둬서 움직임을 더 부드럽게 만듭니다.

 

 

3. 시리얼통신으로 제어하기

     아두이노와 서보모터를 사용하여 시리얼 통신을 통해 특정 문자를 받았을 때

     서보모터를 각각 90도와 180도로 움직이게 하는 예제입니다. 

#include<Servo.h> 
Servo servo_1;

void move90() {
  for(int angle = 0; angle <= 90; angle++) { 
    servo_1.write(angle);
    delay(15); 
  }
}

void move180() {
  for(int angle = 0; angle <= 180; angle++) { 
    servo_1.write(angle);
    delay(15); 
  }
}


void setup() {
  Serial.begin(9600);    
  servo_1.attach(3); 
  servo_1.write(0);  // 서보모터 처음 각도 세팅
}

void loop() {
  while (Serial.available() > 0) {                   // 시리얼 통신으로 데이터가 들어올 때까지 대기
    char data = Serial.read();                       // 시리얼 통신으로 받은 데이터를 읽어옴
    if (data == 'a') {                               // 만약 데이터가 'a'이면
      move90();
    }
    if (data == 'b') {                               // 만약 데이터가 'b'이면
      move180();
    }
  }
}

 

  • loop() 함수 내부에서 Serial.available() > 0을 통해 시리얼 버퍼에 데이터가 있는지 확인합니다. 데이터가 있으면, Serial.read()를 사용하여 1바이트(문자)를 읽어옵니다.
  • 읽어온 데이터가 'a'인 경우 move90() 함수를 호출하여 서보모터를 90도로 움직입니다.
  • 읽어온 데이터가 'b'인 경우 move180() 함수를 호출하여 서보모터를 180도로 움직입니다.

 

이 코드를 사용하면, 시리얼 모니터나 다른 시리얼 통신을 지원하는 장치에서 'a'나 'b' 문자를 아두이노로 전송함으로써

서보모터를 원하는 각도로 조절할 수 있습니다.

이는 예를 들어, 원격 제어 시스템이나 인터랙티브한 프로젝트에 유용하게 사용될 수 있습니다.

 

 

 

 

서보모터와 해 볼만한 프로젝트

     

https://www.youtube.com/watch?v=bLnAJ-mSElE&t=35s

가변저항과 융합한 프로젝트

 

 

https://www.youtube.com/watch?v=HsUPwkwDK8Q

아두이노와 함께할 수 있는 프로젝트

 

 

https://swmakerjun.tistory.com/37

 

핸드이노 의수를 활용한 가위, 바위, 보 코드

1초 간격으로 가위 바위 보 동작하기 서보모터 라이브러리와 객체선언 셋업함수 서보모터 디지털핀 세팅과 165도로 각도 유지시키기 # 여기서 delay 5초를 준이유는 아두이노 리셋 버튼을 누르고

swmakerjun.tistory.com

 

728x90
반응형