아두이노와 MPU6050 자이로센서를 이용한 모터 제어 실습
안녕하세요! 오늘은 아두이노와 MPU6050 자이로센서를 활용하여 모터를 제어하는 간단한 프로젝트를 소개하려고 합니다. 이 프로젝트는 자이로센서로부터 얻은 데이터를 기반으로 X축과 Y축 모터의 각도를 조절하는 방식으로 동작합니다. 드론의 자세 제어나 간단한 로봇 제어 등에 활용할 수 있는 유용한 기초 실습이니, 함께 따라해 보시죠!
1. 필요한 부품
이번 프로젝트를 진행하기 위해서는 다음과 같은 부품들이 필요합니다:
- 아두이노 보드 (Uno, Nano 등)
- MPU6050 자이로센서 모듈
- 서보 모터 2개
- 점퍼 와이어
- 브레드보드
- 외부 전원 공급 장치 (모터 구동용, 필요 시)
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.



2. 회로 구성
MPU6050 자이로센서 연결
MPU6050은 I2C 통신을 통해 아두이노와 데이터를 주고받습니다. 다음과 같이 연결합니다:
- VCC: 아두이노의 5V
- GND: 아두이노의 GND
- SCL: 아두이노의 A5 (Uno 기준)
- SDA: 아두이노의 A4 (Uno 기준)
서보 모터 연결
서보 모터는 PWM 신호를 통해 제어됩니다. 두 개의 서보 모터를 X축과 Y축으로 제어하기 위해 다음과 같이 연결합니다:
- 서보X 핀: 아두이노의 디지털 핀 (예: 9번)
- 서보Y 핀: 아두이노의 디지털 핀 (예: 10번)
- 서보 전원: 외부 5V 전원 공급 장치 (아두이노의 5V는 모터 구동에 충분하지 않을 수 있습니다)
- 공통 GND: 아두이노의 GND와 외부 전원 GND를 연결
3. 코드 설명
다음은 MPU6050 자이로센서 값을 읽어 서보 모터를 제어하는 아두이노 코드 예제입니다. 이 코드는 MPU6050 라이브러리와 Servo 라이브러리를 사용합니다.
#include <Wire.h>
#include <MPU6050.h>
#include <Servo.h>
// MPU6050 객체 생성
MPU6050 mpu;
// 서보 모터 객체 생성
Servo servoX;
Servo servoY;
// 가속도 및 자이로 데이터 변수
int16_t ax, ay, az;
int16_t gx, gy, gz;
// 모터의 최대 및 최소 각도 설정
const int servoX_min_angle = 0; // X축 모터 최소 각도
const int servoX_max_angle = 180; // X축 모터 최대 각도
const int servoY_min_angle = 0; // Y축 모터 최소 각도
const int servoY_max_angle = 180; // Y축 모터 최대 각도
// 자이로센서에서 읽은 각도 값의 범위 설정
const int16_t gyroX_min = -17000; // X축 자이로센서 최소 값
const int16_t gyroX_max = 17000; // X축 자이로센서 최대 값
const int16_t gyroY_min = -17000; // Y축 자이로센서 최소 값
const int16_t gyroY_max = 17000; // Y축 자이로센서 최대 값
// 서보 모터 핀 번호 설정
const int X_AXIS_PIN = 9; // X축 모터에 연결된 핀 번호
const int Y_AXIS_PIN = 10; // Y축 모터에 연결된 핀 번호
void setup() {
Serial.begin(9600); // 시리얼 통신 시작
Wire.begin(); // I2C 통신 시작
mpu.initialize(); // MPU6050 초기화
// 서보 모터 연결
servoX.attach(X_AXIS_PIN);
servoY.attach(Y_AXIS_PIN);
}
void loop() {
// MPU6050에서 모션 데이터 읽기
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// X축 모터 제어
int servoX_angle = map(gx, gyroX_min, gyroX_max, servoX_min_angle, servoX_max_angle);
servoX.write(constrain(servoX_angle, servoX_min_angle, servoX_max_angle));
// Y축 모터 제어
int servoY_angle = map(gy, gyroY_min, gyroY_max, servoY_min_angle, servoY_max_angle);
servoY.write(constrain(servoY_angle, servoY_min_angle, servoY_max_angle));
// 데이터 출력 (디버깅용)
Serial.print("Gyro X: "); Serial.print(gx);
Serial.print(" | Servo X Angle: "); Serial.print(servoX_angle);
Serial.print(" || Gyro Y: "); Serial.print(gy);
Serial.print(" | Servo Y Angle: "); Serial.println(servoY_angle);
delay(20); // 20ms 대기
}
코드 설명
- 라이브러리 포함 및 객체 생성
- Wire.h: I2C 통신을 위한 라이브러리
- MPU6050.h: MPU6050 자이로센서 제어를 위한 라이브러리
- Servo.h: 서보 모터 제어를 위한 라이브러리
- 변수 설정
- ax, ay, az: 가속도 데이터
- gx, gy, gz: 자이로 데이터
- servoX_min_angle, servoX_max_angle: X축 모터의 최소 및 최대 각도
- servoY_min_angle, servoY_max_angle: Y축 모터의 최소 및 최대 각도
- gyroX_min, gyroX_max, gyroY_min, gyroY_max: 자이로센서의 값 범위
- X_AXIS_PIN, Y_AXIS_PIN: 서보 모터가 연결된 아두이노 핀 번호
- 설정 함수 (setup)
- 시리얼 통신을 초기화하여 디버깅 정보를 출력
- I2C 통신을 시작하고 MPU6050을 초기화
- 서보 모터를 지정된 핀에 연결
- 메인 루프 함수 (loop)
- MPU6050에서 현재 모션 데이터를 읽어옴
- 자이로 데이터(gx, gy)를 서보 모터 각도로 매핑
- map 함수를 사용하여 자이로 데이터 범위를 모터 각도 범위로 변환
- constrain 함수를 사용하여 모터 각도가 설정된 범위를 초과하지 않도록 제한
- 서보 모터에 각도 값을 전달하여 모터를 제어
- 시리얼 모니터에 자이로 데이터와 서보 각도 정보를 출력 (디버깅용)
- 20ms 대기 후 반복
4. 실습 및 테스트
회로 연결
- MPU6050 자이로센서를 브레드보드에 장착하고 아두이노와 연결합니다.
- 서보 모터 두 개를 브레드보드에 연결하고, 아두이노의 디지털 핀 9번과 10번에 연결합니다.
- 외부 5V 전원 공급 장치를 사용하여 서보 모터에 전원을 공급하고, GND는 아두이노와 공유합니다.
코드 업로드
- 아두이노 IDE를 열고 위의 코드를 복사하여 붙여넣습니다.
- X_AXIS_PIN과 Y_AXIS_PIN의 핀 번호를 실제 연결한 핀 번호로 설정합니다.
- 코드를 아두이노 보드에 업로드합니다.
동작 확인
- 아두이노 보드가 정상적으로 동작하면, 서보 모터가 자이로센서의 움직임에 따라 X축과 Y축으로 각도를 조절하는 것을 확인할 수 있습니다.
- 시리얼 모니터를 열어 자이로 데이터와 서보 각도 정보를 확인하며, 모터의 움직임을 디버깅할 수 있습니다.
- 자이로센서를 움직여 보면서 서보 모터가 어떻게 반응하는지 관찰해 보세요. 모터의 최소 및 최대 각도는 필요에 따라 조정할 수 있습니다.
5. 결론
이번 포스트에서는 MPU6050 자이로센서를 이용하여 아두이노로 서보 모터를 제어하는 방법을 살펴보았습니다. 자이로센서의 데이터를 기반으로 모터의 각도를 조절함으로써, 드론의 자세 제어나 간단한 로봇 제어 등 다양한 응용이 가능합니다.
이 프로젝트를 통해 센서 데이터 처리와 모터 제어의 기본 개념을 익힐 수 있었길 바랍니다. 더 나아가, 다양한 센서와 액추에이터를 조합하여 더욱 복잡한 시스템을 구축해보는 것도 좋은 도전이 될 것입니다.
궁금한 점이나 추가적인 질문이 있으시면 댓글로 남겨주세요. 즐거운 아두이노 프로젝트 되시길 바랍니다!