Mg996r 서보모터 제어 - Mg996r seobomoteo jeeo

● 모듈 구성 안내

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] 서보모터 기본 각도 제어

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

출처 : 코딩런 : //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] 포텐셜미터로 서보모터 제어하기

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

출처 : //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 / 교사 성원경

Toplist

최신 우편물

태그