아이들은 처음이고 선생님도 처음이다. 아이들이 잘 몰라도, 선생님이 어버버해도 괜찮다는 말이다. 좀 더 일찍 만나 수줍은 시간과 어리숙한 시간을 보내고 좀 더 능숙한 실력으로 함께 일하는 시간을 보냈다면 처음은 아니니 지금보다는 서로에게 훨씬 더 잘했을 것이다. 모든 탁월함과 성장은 원래 이렇게 나타나는 법이다. 삶은 우리에게 무턱대고 왔지만 우리는 무턱대고 살 일은 아니다. 좀 더 친근하게 맞이하고 친절하게 대해주고 아쉬워하면서 보내줘야 한다. 그래야 남은 삶이 또 친절하게 우리를 맞이해주지 않을까?
아두이노 프로그래밍이 처음인 아이들과 실습을 하고 있다. 아두이노 프로그래밍을 마치면 창의적 아이디어 발상 기법 여러가지를 함께 알아보고 팁별 미팅을 진행한다. 요번 주와 다음 주 중반까지 중간고사 기간이다. 성적이나 출석, 시험이 어떤 곳에 이르기 위한 과정이라면 즐길 이유는 충분하지 않은가. 아이들이 즐겁게 받아들였으면 좋겠다. 단지 과정일 뿐이다. 쉽게 가르치지 못하면 정말 아는 게 아니다.
오늘은 서보모터 SG90 제어에 대해 알아보는 시간을 갖겠습니다. 가장 쉬운 것부터 시작해서 나중엔 원하는 방식으로 다룰 수 있도록 실습하겠습니다.
SG90 서보모터는 펄스 폭을 조절하여 각도 0도에서 180도까지 제어가 가능한 모터입니다. 실습하는 모터는 이미지는 아래와 같습니다.
서보모터의 3개의 선 중, 적색(+), 갈색(-) 은 각각 VCC와 GND를 공급하여 서보모터에 전력을 공급한다.
우선 서보모터를 아래와 같이 연결합니다. 서보 모터의 붉은 색은 VCC +5V에 연결하고 갈색은 GND에 연결하고 신호를 입력하는 노란색 선은 7번에 연결합니다.
위 그림대로 연결하였다면 아래와 같은 코드를 입력하여 영점 조정을 실행합니다. 즉, servo.write(0) 함수를 실행하여 0도의 위치를 잡는겁니다. 0 값을 90, 180으로 입력하여 초기 상태로 방향을 잡는 것을 확인합니다.
#include <Servo.h>
Servo servo;
int servoPin = 7
void setup() {
servo.attach(servoPin);
servo.write(0);
delay(1000);
}
void loop() {
}
아래 코드는 회로 연결한 상태에서 각도를 바꿔가면서 회전하는 코드이다. 회전각도 중 179는 180으로 입력하여도 상관없고, 초기값을 180으로 주고 역으로 회전하는 방식이나, 초기값을 0도로 주고 증가시켜가며 회전하는 방식이나 동일하다.
#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);
}
포텐셜미터(가변 저항)을 사용해 가변 저항을 회전시키면 정확한 각도로 서보모터가 허전하는지 실습합니다. 연결은 아래와 같이 가변 저항을 연결합니다.
- 포텐셜 미터 3개의 핀중 양 끝 2개의 핀은 VCC, GND에 연결하여 전원을 공급합니다.
- 가운데 A0 핀은 포텐셜 미터의 로터의 회전값을 전송해 주는 데이터 핀으로 아두이노의 아날로그 입력핀인 A0 ~ A5 중에 연결해 주어야 합니다.
- 포테셜 미터의 회전값은 로터의 회전 각도의 따라 0 ~ 1023 값으로 변환되어 A0에 출력됩니다.
아래 코드를 입력하여 가변 저항을 좌우로 돌리면 그에 따라 서보모터가 회전하는 것을 볼 수 있습니다. 씨리얼 모니터로 값을 확인하기 위해 넣은 코드는 빼도 상관없습니다.
#include <Servo.h>
Servo myServo; // myServo 객체 생성
int potPin = A1; // A0를 myServo의 입력핀으로 쓴다.
int potVal; // potVal 변수에서 포텐셜미터의 입력값을 받는다.
int angle; // myServo에 입력할 angle.
void setup() {
myServo.attach(9);
Serial.begin(9600);
}
void loop() {
// potPin에서 받아온 포텐셜 미터의 입력 값을 PotVal에 저장
potVal = analogRead(potPin);
/* 중요 */
// 포텐셜 미터의 입력값 potVal의 크기 범위 : 0 ~ 1023
// 서보모터의 각도 입력값 angle의 범위 : 0 ~ 179
// 따라서 아래와 같이 map 함수를 통해 potVal값의 크기의 비율을 조정하여 angle에 넣어줘야 한다.
angle = map(potVal, 0, 1023, 0, 180);
Serial.print("A0 ");
Serial.println(potVal);
Serial.print("angle ");
Serial.println(angle);
// 0~179 크기로 변환된 angle값을 서보모터에 입력을 준다.
myServo.write(angle);
//delay(100);
}
참고
여기까지 고생하셨습니다. ^^
'개발자 > Arduino' 카테고리의 다른 글
아두이노 RC522 RFID Module 사용하기 (0) | 2022.11.11 |
---|---|
아두이노 프로그래밍 Cheat Sheet (1) | 2022.11.01 |
아두이노 IDE 통합 개발환경 상세 설명 자료 무료 다운로드 (1) | 2022.10.25 |
아두이노 I2C LCD로 문자 출력하기 (1) | 2022.10.25 |
아두이노 전체 라이브러리 5103개 (1) | 2022.10.01 |
4 digit 7 segment up down 카운터 만들기 (0) | 2022.05.02 |
아두이노 7 Segment LED 숫자 표시 (0) | 2022.04.13 |
아두이노 DHT11 온도 습도 센서 실습 (0) | 2022.04.11 |
더욱 좋은 정보를 제공하겠습니다.~ ^^