본문 바로가기

ESP32

ESP32 MPU-6050 가속도계 인터페이스 컬리브레이션

반응형

ESP32, MPU-6050 가속도계, 자이로스코프 및 온도 센서

 

이 가이드에서는 ESP32에서 MPU-6050 가속도계 및 자이로스코프 모듈을 사용하는 방법을 설명합니다. MPU-6050 IMU(관성 측정 장치)는 3축 가속도계와 3축 자이로스코프 센서로 구성되어 있습니다. 가속도계는 중력 가속도를 측정하고, 자이로스코프는 회전 속도를 측정합니다. 또한, 이 모듈은 온도도 측정합니다. 이 센서는 움직이는 물체의 방향을 파악하는 데 이상적입니다.

 

 

ESP32 MPU-6050 모듈 가속도계 자이로스코프 온도 센서 아두이노

 

이 가이드에서는 두 가지 예시를 다루겠습니다.

  1. 자이로스코프, 가속도 및 온도 값을 수신합니다(직렬 모니터).
  2. OLED 디스플레이에 자이로스코프 및 가속도 측정값을 표시합니다.

 

MPU-6050 자이로스코프 가속도계 센서 소개

 

MPU -6050 은 3축 가속도계와 3축 자이로스코프가 내장된 모듈입니다.

 

MPU-6050 모듈 가속도계 자이로스코프 온도 센서

 

자이로스코프는 회전 속도(라디안/초)를 측정하는데, 이는 X, Y, Z축을 따라 시간에 따른 각도 변화(롤, 피치, 요)를 나타냅니다. 이를 통해 물체의 방향을 파악할 수 있습니다.

 

 

 

 

roll, pitch and yaw 롤 피치 요 각도

 

가속도계는 가속도(물체 속도의 변화율)를 측정합니다. 중력(9.8m/s²)과 같은 정적 힘이나 진동 또는 움직임과 같은 동적 힘을 감지합니다 . MPU-6050은 X, Y, Z축의 가속도를 측정합니다. 이상적으로 정지된 물체의 경우 Z축 가속도는 중력과 같고, X축과 Y축 가속도는 0이어야 합니다.

 

가속도계에서 얻은 값을 이용하면 삼각법을 사용하여 롤각과 피치각을 계산할 수 있습니다. 하지만 요각은 계산할 수 없습니다.

 

두 센서의 정보를 결합하면 센서 방향에 대한 더욱 정확한 정보를 얻을 수 있습니다.

 

MPU-6050 핀 배치

 

다음은 MPU-6050 센서 모듈의 핀 배열도입니다.

  • VCC 센서에 전원을 공급하십시오 (3.3V 또는 5V).
  • 접지 일반 GND
  • SCL I2C 통신용 SCL 핀(GPIO 22)
  • SDA I2C 통신용 SDA 핀(GPIO 21)
  • XDA MPU-6050과 다른 I2C 센서를 연결하는 데 사용됩니다.
  • XCL MPU-6050과 다른 I2C 센서를 연결하는 데 사용됩니다.
  • AD0 이 핀을 사용하여 I2C 주소를 변경하십시오.
  • INT 인터럽트 핀 - 새로운 측정 데이터가 있음을 나타내는 데 사용할 수 있습니다.

 

 

아두이노 라이브러리 설치

 

센서에서 값을 읽는 방법은 여러 가지가 있습니다. 이 튜토리얼에서는 Adafruit MPU6050 라이브러리를 사용하겠습니다. 이 라이브러리를 사용하려면 Adafruit Unified Sensor 라이브러리와 Adafruit Bus IO 라이브러리도 설치해야 합니다.

 

아두이노 IDE를 열고 스케치 > 라이브러리 포함 > 라이브러리 관리 로 이동하세요. 라이브러리 관리자가 열릴 것입니다. 검색창에 “ adafruit mpu6050 ”을 입력하고 라이브러리를 설치하세요. 설치하는 중에 다른 라이브러를 함께 설치하는 내용을 물어올 경우 모두 설치하세요.

 

아두이노 IDE에 Adafruit MPU6050 자이로스코프 가속도계 센서 라이브러리를 설치하세요.

 

 

다음으로 " Adafruit Unified Sensor " 를 검색하세요 . 아래로 쭉 스크롤하여 라이브러리를 찾고 설치하세요.

 

Adafruit Unified Library Arduino IDE를 설치하세요.

 

마지막으로 " Adafruit Bus IO "를 검색하여 설치하세요.

 

Adafruit Bus IO 라이브러리를 Arduino IDE에 설치하세요.

 

라이브러리를 설치한 후 아두이노 IDE를 다시 시작하십시오.

 

VS Code와 PlatformIO를 함께 사용하는 경우, 다음 줄들을 platformio.ini 파일에 복사하세요.

 

lib_deps = adafruit/Adafruit MPU6050 @ ^2.0.3

adafruit/Adafruit Unified Sensor @ ^1.1.4

 

MPU-6050 센서 판독값 얻기: 가속도계, 자이로스코프 및 온도

 

이 섹션에서는 MPU-6050 센서에서 가속도(x, y, z), 각속도(x, y, z) 및 온도와 같은 센서 판독값을 얻는 방법을 알아봅니다.

 

회로 연결 – ESP32 및 MPU-6050

 

저는 지금 ESP32-C6과 연결해 테스트합니다. ESP32-C6에서 I2C 연결 핀 번호는 

 

SDA - GPIO 8

DCL - GPIO 9

 

다른 핀으로 설정할 때는 이 코드를 사용하세요.

 

 Wire.begin(SDA, SCL); 

 

다음 회로도에 표시된 대로 ESP32를 MPU-6050 센서에 연결하십시오. SCL 핀을 다음과 같이 연결하십시오.GPIO 22그리고 SDA 핀은GPIO 21.

 

MPU-6050 가속도계 및 자이로스코프를 ESP32에 연결하는 회로도

 

코드 - MPU-6050 센서 판독값 가져오기: 가속도계, 자이로스코프 및 온도

 

Adafruit 라이브러리는 이 센서에 대한 여러 예제를 제공합니다. 이 섹션에서는 센서 판독값을 시리얼 모니터에 출력하는 기본 예제를 살펴보겠습니다.

 

파일 > 예제 > Adafruit MPU6050 > basic_readings 로 이동하세요 . 다음 코드가 로드될 것입니다.

 

이 장치는 x, y, z축의 각속도(자이로스코프)와 가속도, 그리고 온도를 측정합니다.

 

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu;

void setup(void) {
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit MPU6050 test!");

  // Try to initialize!
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  Serial.println("MPU6050 Found!");

  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);
}

void loop() {
  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  /* Print out the values */
  Serial.print("Acceleration X: ");
  Serial.print(a.acceleration.x);
  Serial.print(", Y: ");
  Serial.print(a.acceleration.y);
  Serial.print(", Z: ");
  Serial.print(a.acceleration.z);
  Serial.println(" m/s^2");

  Serial.print("Rotation X: ");
  Serial.print(g.gyro.x);
  Serial.print(", Y: ");
  Serial.print(g.gyro.y);
  Serial.print(", Z: ");
  Serial.print(g.gyro.z);
  Serial.println(" rad/s");

  Serial.print("Temperature: ");
  Serial.print(temp.temperature);
  Serial.println(" degC");

  Serial.println("");
  delay(500);
}

 

 

코드 작동 방식

 

먼저 MPU-6050 센서에 필요한 라이브러리인 Adafruit_MPU6050과 Adafruit_Sensor를 포함시켜 주세요.

 

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>

 

 

센서를 처리하기 위해 mpu라는 이름의 Adafruit_MPU6050 객체를 생성합니다.

Adafruit_MPU6050 mpu;


setup() 함수


setup() 내에서 시리얼 모니터를 115200 보드 속도로 초기화합니다.

Serial.begin(115200);


MPU-6050 센서를 초기화합니다.

if (!mpu.begin()) {
  Serial.println("센서 초기화 실패");
  while (1)
    yield();
}


가속도계 측정 범위를 설정합니다:

mpu.setAccelerometerRange(MPU6050_RANGE_8_G);


자이로스코프 측정 범위 설정:

mpu.setGyroRange(MPU6050_RANGE_500_DEG);


필터 대역폭 설정:

mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);

 

loop() 함수

 

loop() 함수 내에서 센서 측정값을 읽어와 시리얼 모니터에 표시하겠습니다.

먼저, 현재 측정값이 포함된 새로운 센서 이벤트를 가져와야 합니다.

sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);


마지막으로 측정값을 출력합니다. 가속도의 경우:

a.acceleration.x: x축 가속도를 가져옵니다;
a.acceleration.y: y축 가속도를 가져옵니다;
a.acceleration.z: z축 가속도를 가져옵니다.


가속도는 초당 미터 제곱(m/s²) 단위로 측정됩니다.

 

Serial.print("Acceleration X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");

 

 

자이로스코프 판독값을 얻으려면:

 

g.gyro.x: x축의 각속도를 구합니다.

g. gyro.y: y축의 각속도를 구합니다.

g. gyro.z: z축의 각속도를 구합니다.

 

각속도는 라디안/초(rad/s) 단위로 측정됩니다.

 

Serial.print("Rotation X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s");

 

 

마지막으로 온도를 출력하세요. 온도는 섭씨로 표시됩니다. 온도 값을 확인하려면 temp.temperature를 사용하세요.

 

Serial.print("Temperature: ");

Serial.print(temp.temperature);

Serial.println(" degC");

 

새로운 센서 측정값은 500밀리초마다 표시됩니다.

 

delay(500);

 

데모

 

ESP32 보드에 코드를 업로드하세요. 도구 > 보드 로 이동 하여 사용 중인 ESP32 보드를 선택합니다. 도구 > 포트 로 이동하여 보드가 연결된 포트를 선택합니다. 마지막으로 업로드 버튼을 클릭합니다.

 

시리얼 모니터를 115200bps의 전송 속도로 열고, 보드에 내장된 RST 버튼을 누르십시오. 센서 측정값이 표시됩니다.

 

센서 방향을 바꾸면 값이 그에 따라 변하는 것을 볼 수 있습니다.

 

MPU-6050 센서 판독값 시리얼 모니터 (아두이노 IDE)

 

센서 교정

 

이상적으로는 센서가 정지 상태일 때 모든 축의 자이로스코프 값이 0이어야 하지만, 우리의 경우에는 그렇지 않습니다. 센서가 정지 상태일 때 얻는 자이로스코프 값은 다음과 같습니다.

 

x: 0.06 라디안/초

y: -0.02 rad/s

z: 0.00 rad/s

 

실제 적용 시에는 오차를 고려하여 코드의 값을 수정해야 보다 정확한 측정값을 얻을 수 있습니다.

 

가속도 값도 마찬가지입니다. z축 가속도는 중력(9.8 m/s²)에 더 가까워야 하고 , x축과 y축 가속도는 0에 더 가까워야 합니다. 센서가 정지 상태일 때 얻는 근사값은 다음과 같습니다.

 

x: 0.71 m/ s²

y: 0.28 m/ s²

z: 9.43 m/ s²

 

 

OLED 디스플레이에 MPU-6050 측정값을 표시

 

아래 회로도에 표시된 대로 모든 부품을 연결하십시오. OLED 디스플레이와 MPU-6050 센서는 서로 다른 I2C 주소를 사용하므로 동일한 I2C 버스(ESP32의 동일한 핀)에 연결할 수 있습니다.

 

 

ESP32, MPU-6050 및 OLED 디스플레이 배선 회로도

 

ESP32에서 OLED 디스플레이를 사용하는 방법에 대한 자세한 내용은 다음 링크를 참조하세요: ESP32 OLED 디스플레이와 Arduino IDE

 

코드 - MPU-6050 센서 측정값을 OLED 디스플레이에 표시

 

이 예제를 사용하려면 Adafruit SSD1306 라이브러리가 설치되어 있는지 확인하십시오. 이 라이브러리는 Arduino 라이브러리 관리자를 통해 설치할 수 있습니다.

 

Sketch > Library > Manage Libraries 로 이동하여 “ SSD1306 ” 을 검색하고 Adafruit에서 SSD1306 라이브러리를 설치하세요.

 

Arduino IDE에 I2C OLED 디스플레이 SSD1306 라이브러리를 설치하세요.

 

이 예제를 보려면 다음 코드를 복사하거나 파일 > 예제 > Adafruit MPU6050 > MPU6050_oled 로 이동하세요.

 

#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>

Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup() {
  Serial.begin(115200);
  // while (!Serial);
  Serial.println("MPU6050 OLED demo");

  if (!mpu.begin()) {
    Serial.println("Sensor init failed");
    while (1)
      yield();
  }
  Serial.println("Found a MPU-6050 sensor");

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ; // Don't proceed, loop forever
  }
  display.display();
  delay(500); // Pause for 2 seconds
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setRotation(0);
}

void loop() {
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  display.clearDisplay();
  display.setCursor(0, 0);

  Serial.print("Accelerometer ");
  Serial.print("X: ");
  Serial.print(a.acceleration.x, 1);
  Serial.print(" m/s^2, ");
  Serial.print("Y: ");
  Serial.print(a.acceleration.y, 1);
  Serial.print(" m/s^2, ");
  Serial.print("Z: ");
  Serial.print(a.acceleration.z, 1);
  Serial.println(" m/s^2");

  display.println("Accelerometer - m/s^2");
  display.print(a.acceleration.x, 1);
  display.print(", ");
  display.print(a.acceleration.y, 1);
  display.print(", ");
  display.print(a.acceleration.z, 1);
  display.println("");

  Serial.print("Gyroscope ");
  Serial.print("X: ");
  Serial.print(g.gyro.x, 1);
  Serial.print(" rps, ");
  Serial.print("Y: ");
  Serial.print(g.gyro.y, 1);
  Serial.print(" rps, ");
  Serial.print("Z: ");
  Serial.print(g.gyro.z, 1);
  Serial.println(" rps");

  display.println("Gyroscope - rps");
  display.print(g.gyro.x, 1);
  display.print(", ");
  display.print(g.gyro.y, 1);
  display.print(", ");
  display.print(g.gyro.z, 1);
  display.println("");

  display.display();
  delay(100);
}

 

 

코드 작동 방식

 

먼저 MPU-6050 센서와 OLED 디스플레이에 필요한 라이브러리를 포함시키세요.

 

#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>

 

 

센서를 처리하기 위해 mpu라는 이름의 Adafruit_MPU6050 객체를 생성합니다.

Adafruit_MPU6050 mpu;


OLED 디스플레이를 처리하기 위해 display라는 이름의 Adafruit_SSD1306 객체를 생성합니다. 이는 128×64 픽셀 디스플레이용입니다.

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);


setup() 함수


setup() 내에서 시리얼 모니터를 115200 보드 속도로 초기화합니다.

Serial.begin(115200);


MPU-6050 센서를 초기화합니다.

 

if (!mpu.begin()) {
  Serial.println("Sensor init failed");
  while (1)
    yield();
}


OLED 디스플레이를 초기화합니다.

 

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
  Serial.println(F("SSD1306 allocation failed"));
  for (;;)
    ; // Don't proceed, loop forever
}
display.display();


디스플레이의 글꼴 크기와 색상을 설정합니다.

display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);

 

 

loop() 함수


loop() 함수 내에서 센서 측정값을 읽어와 OLED에 표시합니다.

가속도계, 자이로스코프, 온도 센서 각각의 측정값을 위한 이벤트를 생성하는 것으로 시작합니다.

sensors_event_t a, g, temp;


새로운 센서 측정값을 읽어옵니다.

mpu.getEvent(&a, &g, &temp);


각 loop()에서 디스플레이를 지워 새로운 측정값을 출력합니다.

display.clearDisplay();


디스플레이 커서를 (0, 0) – 즉, 왼쪽 상단 모서리로 설정합니다. 텍스트는 이 위치부터 출력됩니다.

display.setCursor(0, 0);


다음 코드 줄은 시리얼 모니터에 가속도계 측정값을 출력합니다.

 

Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");

 

다음 코드는 OLED 디스플레이에 가속도 x, y, z 값을 표시합니다.

display.println("Accelerometer - m/s^2");
display.print(a.acceleration.x, 1);
display.print(", ");
display.print(a.acceleration.y, 1);
display.print(", ");
display.print(a.acceleration.z, 1);
display.println("");

 

자이로스코프 측정값을 시리얼 모니터에 표시합니다.

 

Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");

 

마지막으로, 자이로스코프 측정값을 디스플레이에 출력합니다.

 

display.println("Gyroscope - rps");
display.print(g.gyro.x, 1);
display.print(", ");
display.print(g.gyro.y, 1);
display.print(", ");
display.print(g.gyro.z, 1);
display.println("");

 

마지막으로, display.display()를 호출하여 측정값을 OLED에 실제로 표시합니다.

display.display();


새로운 측정값은 100밀리초마다 표시됩니다.

delay(100);

 

데모

 

ESP32 보드에 코드를 업로드하세요. 도구 > 보드로 이동 하여 사용 중인 ESP32 보드를 선택합니다. 도구 > 포트 로 이동하여 보드가 연결된 포트를 선택합니다. 그런 다음 업로드 버튼을 클릭합니다.

 

시리얼 모니터를 115200bps의 전송 속도로 열고, 보드에 내장된 RST 버튼을 누르십시오. 센서 측정값이 시리얼 모니터와 OLED 디스플레이 모두에 표시됩니다.

 

MPU-6050 센서 판독값 OLED 시리얼 모니터 예시

 

마무리

 

MPU-6050은 가속도계 및 자이로스코프입니다. x, y, z축의 가속도와 각속도를 측정합니다. 또한 온도도 측정할 수 있습니다.

 

이 센서 모듈은 I2C 통신 프로토콜을 통해 통신합니다. 따라서 배선은 매우 간단합니다. 센서를 ESP32의 기본 I2C 핀에 연결하기만 하면 됩니다.

 

이 튜토리얼에서는 센서를 연결하고 센서 값을 읽는 방법을 배웠습니다. 이 시작 가이드가 유용했기를 바랍니다. 다른 인기 센서에 대한 가이드도 준비되어 있습니다.

 

이 튜토리얼의 출처는 이 링크를 따라가세요. 제공자에게 감사합니다.

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩