개발 | 임베디드

아두이노와 MPU6050 자이로센서를 이용한 모터 제어 실습

devwithham 2024. 12. 5. 20:06
반응형

아두이노와 MPU6050 자이로센서를 이용한 모터 제어 실습

안녕하세요! 오늘은 아두이노와 MPU6050 자이로센서를 활용하여 모터를 제어하는 간단한 프로젝트를 소개하려고 합니다. 이 프로젝트는 자이로센서로부터 얻은 데이터를 기반으로 X축과 Y축 모터의 각도를 조절하는 방식으로 동작합니다. 드론의 자세 제어나 간단한 로봇 제어 등에 활용할 수 있는 유용한 기초 실습이니, 함께 따라해 보시죠!

 

1. 필요한 부품

이번 프로젝트를 진행하기 위해서는 다음과 같은 부품들이 필요합니다:

  • 아두이노 보드 (Uno, Nano 등)
  • MPU6050 자이로센서 모듈
  • 서보 모터 2개
  • 점퍼 와이어
  • 브레드보드
  • 외부 전원 공급 장치 (모터 구동용, 필요 시)

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

아두이노 37종 센서 키트, 1세트, ArdSen-1. 기본 패키지 아두이노 우노 R3 초보자 코딩키트 스텝 1, 1개 아두이노 우노 R3 고급 키트 플러스, 1세트

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 대기
}

코드 설명

  1. 라이브러리 포함 및 객체 생성
    • Wire.h: I2C 통신을 위한 라이브러리
    • MPU6050.h: MPU6050 자이로센서 제어를 위한 라이브러리
    • Servo.h: 서보 모터 제어를 위한 라이브러리
  2. 변수 설정
    • 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: 서보 모터가 연결된 아두이노 핀 번호
  3. 설정 함수 (setup)
    • 시리얼 통신을 초기화하여 디버깅 정보를 출력
    • I2C 통신을 시작하고 MPU6050을 초기화
    • 서보 모터를 지정된 핀에 연결
  4. 메인 루프 함수 (loop)
    • MPU6050에서 현재 모션 데이터를 읽어옴
    • 자이로 데이터(gx, gy)를 서보 모터 각도로 매핑
    • map 함수를 사용하여 자이로 데이터 범위를 모터 각도 범위로 변환
    • constrain 함수를 사용하여 모터 각도가 설정된 범위를 초과하지 않도록 제한
    • 서보 모터에 각도 값을 전달하여 모터를 제어
    • 시리얼 모니터에 자이로 데이터와 서보 각도 정보를 출력 (디버깅용)
    • 20ms 대기 후 반복

4. 실습 및 테스트

회로 연결

  1. MPU6050 자이로센서를 브레드보드에 장착하고 아두이노와 연결합니다.
  2. 서보 모터 두 개를 브레드보드에 연결하고, 아두이노의 디지털 핀 9번과 10번에 연결합니다.
  3. 외부 5V 전원 공급 장치를 사용하여 서보 모터에 전원을 공급하고, GND는 아두이노와 공유합니다.

코드 업로드

  1. 아두이노 IDE를 열고 위의 코드를 복사하여 붙여넣습니다.
  2. X_AXIS_PIN과 Y_AXIS_PIN의 핀 번호를 실제 연결한 핀 번호로 설정합니다.
  3. 코드를 아두이노 보드에 업로드합니다.

동작 확인

  1. 아두이노 보드가 정상적으로 동작하면, 서보 모터가 자이로센서의 움직임에 따라 X축과 Y축으로 각도를 조절하는 것을 확인할 수 있습니다.
  2. 시리얼 모니터를 열어 자이로 데이터와 서보 각도 정보를 확인하며, 모터의 움직임을 디버깅할 수 있습니다.
  3. 자이로센서를 움직여 보면서 서보 모터가 어떻게 반응하는지 관찰해 보세요. 모터의 최소 및 최대 각도는 필요에 따라 조정할 수 있습니다.

5. 결론

이번 포스트에서는 MPU6050 자이로센서를 이용하여 아두이노로 서보 모터를 제어하는 방법을 살펴보았습니다. 자이로센서의 데이터를 기반으로 모터의 각도를 조절함으로써, 드론의 자세 제어나 간단한 로봇 제어 등 다양한 응용이 가능합니다.

이 프로젝트를 통해 센서 데이터 처리와 모터 제어의 기본 개념을 익힐 수 있었길 바랍니다. 더 나아가, 다양한 센서와 액추에이터를 조합하여 더욱 복잡한 시스템을 구축해보는 것도 좋은 도전이 될 것입니다.

궁금한 점이나 추가적인 질문이 있으시면 댓글로 남겨주세요. 즐거운 아두이노 프로젝트 되시길 바랍니다!

반응형