본문 바로가기

메이커 프로젝트/아두이노 +

[모듈 1-3] 아두이노 서보모터 제어하기 (feat. For 구문)

 

 


● 모듈 구성 안내

1-3-1. 서보모터란 무엇인가

1-3-2. 서보모터 기본 제어

1-3-3. for 구문으로 서보모터 제어하기

1-3-4. 포텐셜미터(가변저항)으로 서보모터 제어하기


 

● 1-3-1. 서보모터란 무엇인가?

 모터의 종류

- 오늘 우리가 다룰 서보 모터는 <RC 서보모터>로 모터의 위치제어가 주 목적이다.

- 모터의 위치제어란 아래 사진의 모터 위에 있는 흰색(액추에이터)의 각도 조절을 말한다.

 

 

 

 

 모터의 연결

- 서보모터의 3개의 선 중, 적색(+), 갈색(-) 은 각각 VCC와 GND를 공급하여 서보모터에 전력을 공급한다.

 

 - 오렌지 핀은 데이터 핀으로서 20ms(0.02초) 동안 1과 0의 신호 비율을 통해 내가 원하는 서보모터의 각도 값으로 제어 할수 있다.

- 오렌지 핀으로 제어할 수 있는 각도의 범위는 0 에서 179도까지이다. -> 180 단계.

 

 

 


● 1-3-2.  서보모터 기본제어

 

▶ [실습 1-3-2-1] 서보모터 기본 각도 제어

 - 아래와 같이 아두이노 회로 구성을 한다.

 

출처 : 코딩런 : https://codingrun.com/110

 

 - 아래 코드를 복붙하여 아두이노에 업로드 해보자.

 

#include<Servo.h> //Servo 라이브러리를 추가
Servo servo;      //Servo 클래스로 servo객체 생성
int value = 0;    // 각도를 조절할 변수 value

void setup() {
  servo.attach(7);     //servo 서보모터 7번 핀에 연결
                       // 이때 ~ 표시가 있는 PWM을 지원하는 디지털 핀에 연결
}

void loop() {
    value = 0;
    servo.write(value); //value값의 각도로 회전. ex) value가 90이라면 90도 회전
    delay(500);

    value = 45;
    servo.write(value);
    delay(500);

    value = 90;
    servo.write(value);
    delay(500);

    value = 135;
    servo.write(value);
    delay(500);

    value = 179;
    servo.write(value);
    delay(500);
}

   ☞ value 값에 180 이상의 값을 넣어봅시다. 잘 작동하지 않는 다면 이유가 무엇일까요?

 

 

 

 


● 1-3-3.  for 구문으로 서보모터 제어하기

▶ 반복동작을 위한 < for 구문 > 의 기본 구조

 

▶ [실습 1-3-3-1] 서보모터 for 구문으로 제어

  - 아래 코드를 타이핑 하여 넣어보자. (기존 코드 수정, 회로 구성 1-3-2 동일)

 

#include<Servo.h> //Servo 라이브러리를 추가
Servo servo;      //Servo 클래스로 servo객체 생성
int value = 0;    // 각도를 조절할 변수 value
int ii = 0;     // for 구문의 변수 선언


void setup() {
  servo.attach(7);     //맴버함수인 attach : 핀 설정
}

void loop() {
  for(ii = 0; ii < 180 ; ii++) // ii++ : ii 가 1씩 커진다.
  {
    servo.write(ii);
    delay(30);
  }
}

   ☞ 위 코드에 대한 서보모터의 동작을 for구문과 연결시켜 설명해 보자.

 

 

 

 [실습 1-3-3-2] 서보모터 2개의 for 구문 제어

 - 아래 코드를 타이핑 하여 넣어보자. (기존 코드 수정, 회로 구성 1-3-2 동일)

 

#include<Servo.h> //Servo 라이브러리를 추가
Servo servo;      //Servo 클래스로 servo객체 생성
int value = 0;    // 각도를 조절할 변수 value
int ii = 0;     // for 구문의 변수 선언


void setup() {
  servo.attach(7);     //맴버함수인 attach : 핀 설정
}

void loop() {
  for(ii = 0; ii < 180 ; ii++)
  {
    servo.write(ii);
    delay(30);
  }

  for(ii = 179; ii > 0; ii--) // ii-- : ii가 1씩 작아진다.
  {
    servo.write(ii);
    delay(30);
  }
}

   ☞ 위 코드에 대한 서보모터의 동작을 2개의 for구문과 연결시켜 설명해 보자.

 

 

 

 [도전과제 1-3-3] step 변수로 서보모터 동작 크기 정하기

    - 2개의 servo.write( /* 어떻게 들어가야 할까요? */ ); 부분을 채워 동작을 시켜보세요.

 

#include<Servo.h> 
Servo servo;      
int value = 0;   
int ii = 0;    

void setup() {
  servo.attach(7);
}

void loop() {
  // step_size, step_num 선언
  int step_size = 30;  //  한번에 30도씩 서보모터를 움직이겠다.
  // 180도에 step_size를 나누어 180도에서 서보모터가 움직이는 횟수를 구했다.
  float step_num = 180 / step_size; 

  for(ii = 0; ii < step_num ; ii++)
  {
    servo.write( /* 어떻게 들어가야 할까요? */ ); 
    delay(500);
    // 힌트 : 기존의 ii는 1씩 커지면서 1도씩 움직였으니
    // ii에 무언가를 곱하면 되겠쥬?
  }

  for(ii = step_num; ii > 0; ii--) 
  {
    servo.write( /* 어떻게 들어가야 할까요? */ );
    delay(500);
  }
}

   ☞ 동작을 성공한 학생은 step_size에 45, 90도를 주어서 서보모터의 동작을 확인해 보세요.

 

 

 

 


  1-3-4. 포텐셜미터(가변저항)으로 서보모터 제어하기

▶ 포텐셜 미터(가변저항)

 - 포텐셜 미터 3개의 핀중 양 끝 2개의 핀은 VCC, GND에 연결하여 전원을 공급합니다.

 - 가운데 A0 핀은 포텐셜 미터의 로터의 회전값을 전송해 주는 데이터 핀으로

    아두이노의 아날로그 입력핀인  A0 ~ A5 중에 연결해 주어야 합니다.

-  포테셜 미터의 회전값은 로터의 회전 각도의 따라 0 ~ 1023 값으로 변환되어 A0에 출력됩니다.

 

 

 

 [실습 1-3-4] 포텐셜미터로 서보모터 제어하기

 - 아래와 같이 회로 구성을 합니다.

 

출처 : https://sites.google.com/site/physicalcomputingeducation/inputoutput/potentiometer-servo

 

 - 아래의 코드를 아두이노에 업로드 하고 코드의 주석을 통해 코드의 의미를 이해해 보세요.

 

#include <Servo.h>

Servo myServo;      // myServo 객체 생성
int potPin = A0;    // A0를 myServo의 입력핀으로 쓴다.
int potVal;         // potVal 변수에서 포텐셜미터의 입력값을 받는다.
int angle;          // myServo에 입력할 angle.

void setup() {
  myServo.attach(9);
}

void loop() {
  // potPin에서 받아온 포텐셜 미터의 입력 값을 PotVal에 저장
  potVal = analogRead(potPin); 
  
  /* 중요 */
  // 포텐셜 미터의 입력값 potVal의 크기 범위 : 0 ~ 1023
  // 서보모터의 각도 입력값 angle의 범위 : 0 ~ 179
  // 따라서 아래와 같이 map 함수를 통해 potVal값의 크기의 비율을 조정하여 angle에 넣어줘야 한다.
  angle = map(potVal, 0, 1023, 0, 179);

 // 0~179 크기로 변환된 angle값을 서보모터에 입력을 준다.
  myServo.write(angle);
  delay(15);
}

   ☞ map 함수의 역할을 설명해 보세요.

 

 

 

 

 [도전과제 1-3-4] 2개의 서보모터 제어하기.

 

 - 아래 영상을 통해 도전과제의 목표를 확인 하시오.

 

영상 제공 : 컴퓨터전자과 3학년 이00 학생

 

 

  - 아래의 아두이노 회로를 구성하시오. 

 - 아두이노 입출력 핀은 변경해서 사용해도 무관합니다.

 

- 아래 코드를 기반으로 loop() 함수의 내용을 코딩하여 2개의 서보모터를 2개의 포텐셜미터로 제어하는 동작을 구현하시오.

 

#include <Servo.h>

Servo xservo;
Servo yservo;

int xservopin = A0;
int yservopin = A1;

int xval = 0;
int yval = 0;

int xangle = 0;
int yangle = 0;

void setup() {

  xservo.attach(9);
  yservo.attach(10);

}



void loop() {
 
 /* 
 	xservo와 yservo를 2개의 포텐셜 미터로 
 	각각 제어하는 코드를 완성하시오
 */

}  

 

 

 

 

 

 

 


FINISH


 

 

 

글쓴이 : Wonking / 교사 성원경