MPU9265 یک سنسور اندازه گیری شتاب و ژیرو یکپارچه است که می تواند مقادیر شتاب و زاویه ژایرو را از طریق یک رابط I2C به MCU بفرستد . MPU9265 دارای یک واحد پردازش سیگنال DMP است که می تواند الگو های پیچده 9 محوره را پردازش کند . این سنسور قابلیت اندازه گیری شتاب با دقت 2g تا 16g را دارد . همچنین مقادیر زاویه ژایرو را با سرعت حداکثر 2000 نمونه در ثانیه دارد . MPU9265 دارای پایداری و دقت بیشتری نسبت به مدل MPU6050 می باشد که می توانید از آن در کاربرد های حساس مانند کوادکوپتر ها استفاده کنید . همجنین این مازول قابلیت اتصال سنسور های مگنتومتر با رابط I2C را دارد . در تصویر زیر پین های این ماژول نشان داده شده است :

پین های مهم این ماژول به شرح زیر می باشند:

1- VCC و GND پین های تغذیه و زمین ماژول هستند .

2- پین های SDL و SDA پین های ارتباط I2C ماژول می باشند .

3- پین های EDA و ECL همان پین های SDA و SCL ارتباط I2C می باشند که از این دو پین جهت اتصال سنسور های دیگر مانند مگتومتر ها می توان استفاده نمود .

4- INT پین وقفه سنسور می باشد که می توانید شرط وقفه را تعیین کنید .

 

 

مشخصات :

  • ولتاژ تغذیه 3.3 ولت
  • دارای FIFO داخلی
  • اندازه گیری شدت میدان مغتاطیسی در 3 محور
  • اندازه گیری زاویه ژیرو در سه محور
  • رنج ژیرو 250 ، 500 ، 1000 و 2000 درجه بر ثانیه
  • اندازه گیری شتاب در سه محور
  • رنج اندازه گیری شتاب 2 ، 4 ، 8 و 16 g
  • محور اندازه گیری میدان مغناطیسی ±4800Ut

 

 

.

 

راه اندازی ماژول MPU9265 توسط آردوینو :

 

#include <Wire.h>

#include <TimerOne.h>

 

#define    MPU9250_ADDRESS            0x68

#define    MAG_ADDRESS                0x0C

 

#define    GYRO_FULL_SCALE_250_DPS    0x00 

#define    GYRO_FULL_SCALE_500_DPS    0x08

#define    GYRO_FULL_SCALE_1000_DPS   0x10

#define    GYRO_FULL_SCALE_2000_DPS   0x18

 

#define    ACC_FULL_SCALE_2_G        0x00 

#define    ACC_FULL_SCALE_4_G        0x08

#define    ACC_FULL_SCALE_8_G        0x10

#define    ACC_FULL_SCALE_16_G       0x18

 

 

 

// This function read Nbytes bytes from I2C device at address Address.

// Put read bytes starting at register Register in the Data array.

void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data)

{

  // Set register address

  Wire.beginTransmission(Address);

  Wire.write(Register);

  Wire.endTransmission();

 

  // Read Nbytes

  Wire.requestFrom(Address, Nbytes);

  uint8_t index=0;

  while (Wire.available())

    Data[index++]=Wire.read();

}

 

 

// Write a byte (Data) in device (Address) at register (Register)

void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data)

{

  // Set register address

  Wire.beginTransmission(Address);

  Wire.write(Register);

  Wire.write(Data);

  Wire.endTransmission();

}

 

 

 

// Initial time

long int ti;

volatile bool intFlag=false;

 

// Initializations

void setup()

{

  // Arduino initializations

  Wire.begin();

  Serial.begin(115200);

 

  // Set accelerometers low pass filter at 5Hz

  I2CwriteByte(MPU9250_ADDRESS,29,0x06);

  // Set gyroscope low pass filter at 5Hz

  I2CwriteByte(MPU9250_ADDRESS,26,0x06);

 

 

  // Configure gyroscope range

  I2CwriteByte(MPU9250_ADDRESS,27,GYRO_FULL_SCALE_1000_DPS);

  // Configure accelerometers range

  I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_4_G);

  // Set by pass mode for the magnetometers

  I2CwriteByte(MPU9250_ADDRESS,0x37,0x02);

 

  // Request continuous magnetometer measurements in 16 bits

  I2CwriteByte(MAG_ADDRESS,0x0A,0x16);

 

   pinMode(13, OUTPUT);

  Timer1.initialize(10000);         // initialize timer1, and set a 1/2 second period

  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt

 

 

  // Store initial time

  ti=millis();

}

 

 

 

 

// Counter

long int cpt=0;

 

void callback()

{

  intFlag=true;

  digitalWrite(13, digitalRead(13) ^ 1);

}

 

// Main loop, read and display data

void loop()

{

  while (!intFlag);

  intFlag=false;

 

  // Display time

  Serial.print (millis()-ti,DEC);

  Serial.print ("\t");

 

  // _______________

  // ::: Counter :::

 

  // Display data counter

//  Serial.print (cpt++,DEC);

//  Serial.print ("\t");

 

 

 

  // ____________________________________

  // :::  accelerometer and gyroscope :::

 

  // Read accelerometer and gyroscope

  uint8_t Buf[14];

  I2Cread(MPU9250_ADDRESS,0x3B,14,Buf);

 

  // Create 16 bits values from 8 bits data

 

  // Accelerometer

  int16_t ax=-(Buf[0]<<8 | Buf[1]);

  int16_t ay=-(Buf[2]<<8 | Buf[3]);

  int16_t az=Buf[4]<<8 | Buf[5];

 

  // Gyroscope

  int16_t gx=-(Buf[8]<<8 | Buf[9]);

  int16_t gy=-(Buf[10]<<8 | Buf[11]);

  int16_t gz=Buf[12]<<8 | Buf[13];

 

    // Display values

 

  // Accelerometer

  Serial.print (ax,DEC);

  Serial.print ("\t");

  Serial.print (ay,DEC);

  Serial.print ("\t");

  Serial.print (az,DEC); 

  Serial.print ("\t");

 

  // Gyroscope

  Serial.print (gx,DEC);

  Serial.print ("\t");

  Serial.print (gy,DEC);

  Serial.print ("\t");

  Serial.print (gz,DEC); 

  Serial.print ("\t");

 

 

  // _____________________

  // :::  Magnetometer :::

 

 

  // Read register Status 1 and wait for the DRDY: Data Ready

 

  uint8_t ST1;

  do

  {

    I2Cread(MAG_ADDRESS,0x02,1,&ST1);

  }

  while (!(ST1&0x01));

 

  // Read magnetometer data 

  uint8_t Mag[7]; 

  I2Cread(MAG_ADDRESS,0x03,7,Mag);

 

  // Create 16 bits values from 8 bits data

 

  // Magnetometer

  int16_t mx=-(Mag[3]<<8 | Mag[2]);

  int16_t my=-(Mag[1]<<8 | Mag[0]);

  int16_t mz=-(Mag[5]<<8 | Mag[4]);

 

 

  // Magnetometer

  Serial.print (mx+200,DEC);

  Serial.print ("\t");

  Serial.print (my-70,DEC);

  Serial.print ("\t");

  Serial.print (mz-700,DEC); 

  Serial.print ("\t");

 

 

 

  // End of line

 

  Serial.println("");

}

 

Tags:
About Author: USER_4