아이들은 처음이고 선생님도 처음이다. 아이들이 잘 몰라도, 선생님이 어버버해도 괜찮다는 말이다. 좀 더 일찍 만나 수줍은 시간과 어리숙한 시간을 보내고 좀 더 능숙한 실력으로 함께 일하는 시간을 보냈다면 처음은 아니니 지금보다는 서로에게 훨씬 더 잘했을 것이다. 모든 탁월함과 성장은 원래 이렇게 나타나는 법이다. 삶은 우리에게 무턱대고 왔지만 우리는 무턱대고 살 일은 아니다. 좀 더 친근하게 맞이하고 친절하게 대해주고 아쉬워하면서 보내줘야 한다. 그래야 남은 삶이 또 친절하게 우리를 맞이해주지 않을까?
아두이노 프로그래밍이 처음인 아이들과 실습을 하고 있다. 아두이노 프로그래밍을 마치면 창의적 아이디어 발상 기법 여러가지를 함께 알아보고 팁별 미팅을 진행한다. 요번 주와 다음 주 중반까지 중간고사 기간이다. 성적이나 출석, 시험이 어떤 곳에 이르기 위한 과정이라면 즐길 이유는 충분하지 않은가. 아이들이 즐겁게 받아들였으면 좋겠다. 단지 과정일 뿐이다. 쉽게 가르치지 못하면 정말 아는 게 아니다.
오늘은 서보모터 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' 카테고리의 다른 글
| 아두이노 금속감지 센서 LJ12A3 (1) | 2022.12.08 |
|---|---|
| 아두이노 RC522 RFID Module 사용하기 (0) | 2022.11.11 |
| 아두이노 프로그래밍 Cheat Sheet (1) | 2022.11.01 |
| 아두이노 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 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩