Uživatelské nástroje

Nástroje pro tento web


education:arduino_mpu-9250

MPU-9250

MPU-9250

  • Tříosý gyroskop, akcelerometr, magnetometr
  • Komunikace přes I2C, nebo SPI
  • Napájení 2.4 - 3.6V
  • 16-bit ADC pro každou měřenou veličinu
  • Nastavitelné rozsahy pro maximální přesnost
  • WOM2) režim pro nižší spotřebu

invensense-imu
Podrobná dokumentace knihovny
Data sheet

MPU9250 ARDUINO ESP32
I2C SDA A4 GPIO21
SCL A5 GPIO22
SPI SCL 13 GPIO18
AD0 12 GPIO19
SDA 11 GPIO23
NCS LIBOVOLNÝ
Volitelné3) INT LIBOVOLNÝ
FSYNC LIBOVOLNÝ

I2C adresa senzoru se nastavuje logickou úrovní na pinu AD0. To umožňuje používání 2 těchto senzorů na jedné I2C sběrnici.

WOM
EnableWom(threshold_mg, wom_rate);
V režimu WOM senzor vyhodnocuje data z akcelerometru v nastavených intervalech4). Když pohyb přesáhne nastavenou mez5), na pinu INT se objeví logická 1.

Data Ready Interrupt
EnableDrdyInt();
Druhé využití INT pinu je signalizace nových dat

Nastavení
ConfigSrd(srd); - Sample Rate Divider umožňuje nastavit rychlost vzorkování
ConfigAccelRange(range); ConfigGyroRange(range); - Tyto funkce umožňují nastavení rozsahu
ConfigDlpfBandwidth(dlpf); - Funkce umožňuje nastavení digitální dolní propusti (Digital Low Pass Filter)

Rozsahy

Gyroskop Akcelerometr Magnetometr
±250 °/s ±2 g ±4800 µT
±500 °/s ±4 g
±1000 °/s ±8 g
±2000 °/s ±16 g
MPU-9250.ino
#include "mpu9250.h"  // Kód je psaný pro verzi knihovny 6.0.3
 
bfs::Mpu9250 imu;
 
void SensorInterrupt() {
  Serial.println("Pohyb");
}
 
void setup() {
  Serial.begin(115200);
  Serial.println("\nMPU9250 test");
 
  Wire.begin();                                    // nastavení I2C: Wire.begin(SDA, SCL);
  Wire.setClock(400000);                           // rychlost I2C komunikace (400kHz)
  imu.Config(&Wire, bfs::Mpu9250::I2C_ADDR_PRIM);  // I2C, adresa: |AD0=LOW I2C_ADDR_PRIM| |AD0=HIGH I2C_ADDR_SEC|
  //imu.Config(&SPI, 5); // SPI bus, CS pin
 
  if (!imu.Begin()) {  // spuštění komunikace se senzorem
    Serial.println("CHYBA komunikace se senzorem");
    while (1) {}
  }
 
  // práh 40mg, rychlost dat z akcelerometru 15.63Hz
  //imu.EnableWom(40, bfs::Mpu9250::WOM_RATE_15_63HZ);  // Wake on motion
  //pinMode(2, INPUT); // INT pin sentoru na pinu 2 Arduina/ESP32
  //attachInterrupt(2, SensorInterrupt, RISING);
 
  if (!imu.ConfigSrd(19)) Serial.println("CHYBA nastavovani SRD");  // rychlost vzorkovani[Hz] = 1000/(srd + 1)
  if (!imu.ConfigAccelRange(bfs::Mpu9250::ACCEL_RANGE_4G)) Serial.println("CHYBA nastavovani rozsahu akcelerometru");
  if (!imu.ConfigGyroRange(bfs::Mpu9250::GYRO_RANGE_1000DPS)) Serial.println("CHYBA nastavovani rozsahu gyroskopu");
  if (!imu.ConfigDlpfBandwidth(bfs::Mpu9250::DLPF_BANDWIDTH_20HZ)) Serial.println("CHYBA nastavovani DLPF");
 
  PrintSRD();
  PrintAccelRange();
  PrintGyroRange();
  PrintDlpfBbandwidth();
  delay(5000);
}
 
void loop() {
  PrintData();
  delay(500);
}
 
void PrintSRD() {
  uint8_t srd = imu.srd();
  Serial.print("SRD: "); 
  Serial.print(srd);
  Serial.print(" -> ");
  Serial.print(1000.0 / (srd + 1));
  Serial.println("Hz");
}
 
void PrintAccelRange() {
  Serial.print("Rozsah akcelerometru: +-");
  switch (imu.accel_range()) {
    case 0x00: Serial.println("2g"); break;
    case 0x08: Serial.println("4g"); break;
    case 0x10: Serial.println("8g"); break;
    case 0x18: Serial.println("16g"); break;
  };
}
 
void PrintGyroRange() {
  Serial.print("Rozsah gyroskopu: +-");
  switch (imu.gyro_range()) {
    case 0x00: Serial.println("250°/s"); break;
    case 0x08: Serial.println("500°/s"); break;
    case 0x10: Serial.println("1000°/s"); break;
    case 0x18: Serial.println("2000°/s"); break;
  }
}
 
void PrintDlpfBbandwidth() {
  Serial.print("Sirka pasma DLPF: ");
  switch (imu.dlpf_bandwidth()) {
    case 0x01: Serial.println("184Hz"); break;
    case 0x02: Serial.println("92Hz"); break;
    case 0x03: Serial.println("41Hz"); break;
    case 0x04: Serial.println("20Hz"); break;
    case 0x05: Serial.println("10Hz"); break;
    case 0x06: Serial.println("5Hz"); break;
  };
}
 
void PrintData() {
  if (imu.Read()) {
    Serial.println("\nimu\tmag\tacc X\tacc Y\tacc Z\tgyr X\tgyr Y\t gyr Z\tmag X\tmag Y\tmag Z\ttemp");
    Serial.print(imu.new_imu_data());   Serial.print("\t");
    Serial.print(imu.new_mag_data());   Serial.print("\t");
    Serial.print(imu.accel_x_mps2());   Serial.print("\t");
    Serial.print(imu.accel_y_mps2());   Serial.print("\t");
    Serial.print(imu.accel_z_mps2());   Serial.print("\t");
    Serial.print(imu.gyro_x_radps());   Serial.print("\t");
    Serial.print(imu.gyro_y_radps());   Serial.print("\t");
    Serial.print(imu.gyro_z_radps());   Serial.print("\t");
    Serial.print(imu.mag_x_ut());       Serial.print("\t");
    Serial.print(imu.mag_y_ut());       Serial.print("\t");
    Serial.print(imu.mag_z_ut());       Serial.print("\t");
    Serial.println(imu.die_temp_c());
  }
}
1)
Digital-Low-Pass-Filter
2)
Wake-On-Motion
3)
Není nutné zapojovat
4)
wom_rate
5)
threshold_mg
education/arduino_mpu-9250.txt · Poslední úprava: 2023/08/18 12:37 autor: 127.0.0.1