استفاده از دیتای شتاب سنج سنسور mpu9250

با سلام و احترام

بنده براي راه اندازي سنسور mpu9250 نياز دارم كه فقط شتاب سنجش رو فعال كنم و داده ها رو بر حسب متربر مجذور ثانيه ثبت كنم البته به گونه اي كه بتونم دامنه شتاب رو اگر نياز شد تغيير دهم. بنده از كد زير استفاده كردم نمي دونم درست هست يا خير؟ خروجي داده ها رو نميدونم برحسب چي هست.

ممنون ميشم راهنمايي كنيد.

#include <Wire.h>
#include <TimerOne.h>

#define MPU9250_ADDRESS 0x68
#define MAG_ADDRESS 0x0C

#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

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();
}
void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data)
{
Wire.beginTransmission(Address);
Wire.write(Register);
Wire.write(Data);
Wire.endTransmission();
}
long int ti;
volatile bool intFlag=false;
void setup()
{
Wire.begin();
Serial.begin(115200);
I2CwriteByte(MPU9250_ADDRESS,29,0x06);
I2CwriteByte(MPU9250_ADDRESS,26,0x06);

I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_16_G);

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
}
long int cpt=0;
void callback()
{
intFlag=true;
digitalWrite(13, digitalRead(13) ^ 1);
}
void loop()
{
while (!intFlag);
intFlag=false;
uint8_t Buf[14];
I2Cread(MPU9250_ADDRESS,0x3B,14,Buf);

int16_t ax=-(Buf[0]<<8 | Buf[1]);
int16_t ay=-(Buf[2]<<8 | Buf[3]);
int16_t az=Buf[4]<<8 | Buf[5];

Serial.print (ax);
Serial.print ( " \t");
Serial.print (ay);
Serial.print ( " \t");
Serial.println (az);
Serial.print (“\t”);
delay(20);
}

سلام وقت بخیر

مهندس طبق کد برنامه ایی که قرار داده اید و مطابق تابع I2Cread(MPU9250_ADDRESS,0x3B,14,Buf) شما فقط دارید شتاب حول محور X  و تنها بایت MSB را در خروجی پرینت میکنید و کاملا دیتایی که به شما نمایش داده میشود اشتباه است.

طبق این USER Manual  اگر مطالعه بفرمایید خروجی سنسور به ازای هر تغییر به مقدار 16 بیت معادل 2 بایت است.

https://invensense.tdk.com/wp-content/uploads/2015/02/RM-MPU-9250A-00-v1.6.pdf

در ضمن جهت گرفتن دیتای شتاب حول سه محور x,y,z شما باید تابعی به شکل زیر داشته باشید.

اگر به تابع زیر دقت کنید متوجه میشید که به ازای هر محور 2 بار تابع i2c_readByte استفاده شده است به این معنی که مثلا در متغییر Buf[0] بایت اول مربوط به شتاب محور x و در متغییر Buf[1]  بایت دوم مربوط به شتاب حول محور x قرار میگیرد.

uint8_t MPU9250_accelUpdate(void) {
	i2c_readByte(address,0x3B,&accelBuf[0]);
	i2c_readByte(address,0x3C,&accelBuf[1]);
	i2c_readByte(address,0x3D,&accelBuf[2]);
	i2c_readByte(address,0x3E,&accelBuf[3]);
	i2c_readByte(address,0x3F,&accelBuf[4]);
	i2c_readByte(address,0x40,&accelBuf[5]);	
	return 0;

}

1 پسندیده

ممنون مهندس لطفا اگر مقدور هست کد کاملش رو برام بفرستید.

خواهش میکنم. این لینک گیت هابش هست

البته برای میکرو stm32 راه اندازی کرده ولی شما از توابع mpu میتونید در برنامه خودتون استفاده کنید.