● 모듈 구성 안내
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] 서보모터 기본 각도 제어
- 아래와 같이 아두이노 회로 구성을 한다.
- 아래 코드를 복붙하여 아두이노에 업로드 해보자.
#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] 포텐셜미터로 서보모터 제어하기
- 아래와 같이 회로 구성을 합니다.
- 아래의 코드를 아두이노에 업로드 하고 코드의 주석을 통해 코드의 의미를 이해해 보세요.
#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개의 서보모터 제어하기.
- 아래 영상을 통해 도전과제의 목표를 확인 하시오.
- 아래의 아두이노 회로를 구성하시오.
- 아두이노 입출력 핀은 변경해서 사용해도 무관합니다.
- 아래 코드를 기반으로 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 / 교사 성원경
'메이커 프로젝트 > 아두이노 +' 카테고리의 다른 글
아두이노 DC 모터 제어하기 (0) | 2021.09.03 |
---|---|
[모듈 1-6] 아두이노 부저로 소리내기(feat. 전자 피아노 만들기) (2) | 2020.09.22 |
[ 모듈 1-5 ] 아두이노 초음파 센서 제어하기(feat. processing 아두이노 시각화) (2) | 2020.09.22 |
[모듈 1-4] 아두이노 시리얼통신 제어(Feat. 로봇팔 만들기) (3) | 2020.09.08 |
[모듈 1-2] 아두이노 스위치 제어(feat. if-else 구문) (10) | 2020.09.06 |