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
- Nastavitelných 6 šířek pásma DLPF1)
- 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()); } }