17.04.2019

Измерение ускорения

Измерение ускорения

Акселерометры применяются для определения ускорения при движении устройства. Будем использовать монитор последовательного порта для получения информации об ускорении от модуля MPU6050.

Компоненты

  • Плата Arduino Uno
  • USB кабель
  • Модуль MPU6050
  • Макетная плата

Схема

Используем выводы A4 (SDA) и A5 (SCL) платы Arduino Uno для связи с модулем MPU6050.

Принципиальная схема

Соединение компонентов

Скетч

Перед тем как написать код, нам нужно стандартным способом подключить специализированные библиотеки I2Cdev и MPU6050. Теперь напишем скетч, который будет считывать данные с модуля и выдавать их в монитор последовательного порта.

#include "Wire.h" 
#include "I2Cdev.h" 
#include "MPU6050.h" 
 
MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;

#define LED_PIN 13

bool blinkState = false;
 
void setup() { 
  Serial.begin(9600);
  Serial.println("Initializing I2C devices..."); 
  
  Wire.begin();
  accelgyro.initialize();
  
  Serial.println("Testing device connections..."); 
  if (accelgyro.testConnection()) { 
    Serial.println("MPU6050 connection successful"); 
  } else { 
    Serial.println("MPU6050 connection failed"); 
    while (1); 
  }

  // Calibrate the gravity acceleration
  // accelgyro.setXAccelOffset(-1200);
  // accelgyro.setYAccelOffset(-2500);
  // accelgyro.setZAccelOffset(1988);

  Serial.print("X.Y.Z offset :\t"); 
  Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); 
  Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); 
  Serial.print(accelgyro.getZAccelOffset()); Serial.print("\n");

  // initialize LED port 
  pinMode(LED_PIN, OUTPUT);
} 
 
void loop() { 
  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); 

  Serial.print("a/g:\t"); 
  Serial.print(ax); Serial.print("\t");
  Serial.print(ay); Serial.print("\t");
  Serial.print(az); Serial.print("\t");
  Serial.print(gx); Serial.print("\t\t");
  Serial.print(gy); Serial.print("\t\t");
  Serial.println(gz);

  // Convert acceleration to g and the gyroscope unit to dps (degree per second)
  Serial.print("a/g:\t"); 
  Serial.print((float)ax / 16384); Serial.print("g\t"); 
  Serial.print((float)ay / 16384); Serial.print("g\t"); 
  Serial.print((float)az / 16384); Serial.print("g\t");

  Serial.print((float)gx / 131); Serial.print("d/s  \t");
  Serial.print((float)gy / 131); Serial.print("d/s  \t");
  Serial.print((float)gz / 131); Serial.print("d/s  \n");
  delay(300);

  blinkState = !blinkState;
  digitalWrite(LED_PIN, blinkState);
}

Подключаем библиотеки, необходимые для работы скетча.

#include "Wire.h" 
#include "I2Cdev.h" 
#include "MPU6050.h"

Создаём объект accelgyro.

MPU6050 accelgyro;

Инициализируем шину I2C, а затем модуль MPU6050.

  Wire.begin();
  accelgyro.initialize();

Проверим связь с модулем.

  if (accelgyro.testConnection()) { 
    Serial.println("MPU6050 connection successful"); 
  } else { 
    Serial.println("MPU6050 connection failed"); 
    while (1); 
  } 

Если вы хотите сделать результаты более близкими к реальности, то вы можете отрегулировать смещение MPU6050 перед его использованием. Если нет жестких требований, то этот шаг можно пропустить.

  // accelgyro.setXAccelOffset(-1200); 
  // accelgyro.setYAccelOffset(-2500); 
  // accelgyro.setZAccelOffset(1988); 

Выводим значения в монитор последовательного порта.

  Serial.print("X.Y.Z offset :\t"); 
  Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); 
  Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); 
  Serial.print(accelgyro.getZAccelOffset()); Serial.print("\n"); 

В функции loop() считываем параметры акселерометра и параметры гироскопа.

  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); 

После этого конвертируем значения в удобный вид и отправляем в монитор последовательного порта. Скомпилируйте и загрузите код на плату Arduino. Откройте монитор последовательного порта, поверните MPU6050, чтобы увидеть как будут меняться значения.

 

Предыдущий урок | В начало | Следующий урок

    Введите код с картинки