“SKU:RB-02S113 九軸姿態(tài)檢測(cè)傳感器”的版本間的差異

來自ALSROBOT WiKi
跳轉(zhuǎn)至: 導(dǎo)航、 搜索
?相關(guān)推薦
?使用方法
第35行: 第35行:
 
[[文件:02S11303.png|480px|縮略圖|居中]]
 
[[文件:02S11303.png|480px|縮略圖|居中]]
 
* 例子程序:
 
* 例子程序:
?
<pre style='color:blue'>#include "Wire.h"
+
<pre style='color:blue'>
?
// I2Cdev and MPU9250 must be installed as libraries, or else the .cpp/.h files
+
#include "quaternionFilters.h"
?
// for both classes must be in the include path of your project
+
?
#include "I2Cdev.h"
+
 
#include "MPU9250.h"
 
#include "MPU9250.h"
  
?
// class default I2C address is 0x68
+
#define I2Cclock 400000
?
// specific I2C addresses may be passed as a parameter here
+
#define I2Cport Wire
?
// AD0 low = 0x68 (default for InvenSense evaluation board)
+
#define MPU9250_ADDRESS MPU9250_ADDRESS_AD0  // Use either this line or the next to select which I2C address your device is using
?
// AD0 high = 0x69
+
//#define MPU9250_ADDRESS MPU9250_ADDRESS_AD1
?
MPU9250 accelgyro;
+
?
I2Cdev  I2C_M;
+
  
?
uint8_t buffer_m[6];
+
MPU9250 myIMU0(MPU9250_ADDRESS_AD0, I2Cport, I2Cclock);
?
 
+
MPU9250 myIMU1(MPU9250_ADDRESS_AD1, I2Cport, I2Cclock);
?
int16_t ax, ay, az;
+
?
int16_t gx, gy, gz;
+
?
int16_t  mx, my, mz;
+
?
 
+
?
 
+
?
 
+
?
float heading;
+
?
float tiltheading;
+
?
 
+
?
float Axyz[3];
+
?
float Gxyz[3];
+
?
float Mxyz[3];
+
?
 
+
?
 
+
?
#define sample_num_mdate  5000     
+
?
 
+
?
volatile float mx_sample[3];
+
?
volatile float my_sample[3];
+
?
volatile float mz_sample[3];
+
?
 
+
?
static float mx_centre = 0;
+
?
static float my_centre = 0;
+
?
static float mz_centre = 0;
+
?
 
+
?
volatile int mx_max =0;
+
?
volatile int my_max =0;
+
?
volatile int mz_max =0;
+
?
 
+
?
volatile int mx_min =0;
+
?
volatile int my_min =0;
+
?
volatile int mz_min =0;
+
  
 +
byte c = 0x00;
 +
byte d = 0x00;
 +
bool ledOn = true;
  
 
void setup() {
 
void setup() {
?
   // join I2C bus (I2Cdev library doesn't do this automatically)
+
   // put your setup code here, to run once:
?
  Wire.begin();
+
?
 
+
?
  // initialize serial communication
+
?
  // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
+
?
  // it's really up to you depending on your project)
+
 
   Serial.begin(38400);
 
   Serial.begin(38400);
 +
  while(!Serial){};
  
?
   // initialize device
+
   pinMode(13, OUTPUT);
?
  Serial.println("Initializing I2C devices...");
+
?
  accelgyro.initialize();
+
?
 
+
?
  // verify connection
+
?
Serial.println("Testing device connections...");
+
?
Serial.println(accelgyro.testConnection() ? "MPU9250 connection successful" : "MPU9250 connection failed");
+
?
+
?
delay(1000);
+
?
Serial.println("    ");
+
?
+
?
//Mxyz_init_calibrated ();
+
 
    
 
    
 
}
 
}
  
?
void loop()  
+
void loop() {
?
{    
+
   // put your main code here, to run repeatedly:
?
+
?
getAccel_Data();
+
?
getGyro_Data();
+
?
getCompassDate_calibrated(); // compass data has been calibrated here  
+
?
getHeading(); //before we use this function we should run 'getCompassDate_calibrated()' frist, so that we can get calibrated data ,then we can get correct angle .
+
?
getTiltHeading();         
+
?
+
?
Serial.println("calibration parameter: ");
+
?
Serial.print(mx_centre);
+
?
Serial.print("        ");
+
?
Serial.print(my_centre);
+
?
Serial.print("        ");
+
?
Serial.println(mz_centre);
+
?
Serial.println("    ");
+
?
+
?
+
?
Serial.println("Acceleration(g) of X,Y,Z:");
+
?
Serial.print(Axyz[0]);
+
?
Serial.print(",");
+
?
Serial.print(Axyz[1]);
+
?
Serial.print(",");
+
?
Serial.println(Axyz[2]);
+
?
Serial.println("Gyro(degress/s) of X,Y,Z:");
+
?
Serial.print(Gxyz[0]);
+
?
Serial.print(",");
+
?
Serial.print(Gxyz[1]);
+
?
Serial.print(",");
+
?
Serial.println(Gxyz[2]);
+
?
Serial.println("Compass Value of X,Y,Z:");
+
?
Serial.print(Mxyz[0]);
+
?
Serial.print(",");
+
?
Serial.print(Mxyz[1]);
+
?
Serial.print(",");
+
?
Serial.println(Mxyz[2]);
+
?
Serial.println("The clockwise angle between the magnetic north and X-Axis:");
+
?
Serial.print(heading);
+
?
Serial.println(" ");
+
?
Serial.println("The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:");
+
?
Serial.println(tiltheading);
+
?
Serial.println("  ");
+
?
Serial.println("  ");
+
?
    Serial.println("  ");
+
  
 +
  c = myIMU0.readByte(MPU9250_ADDRESS_AD0, WHO_AM_I_MPU9250);
 +
  d = myIMU1.readByte(MPU9250_ADDRESS_AD1, WHO_AM_I_MPU9250);
  
 +
  Serial.print("Received AD0: 0x");
 +
  Serial.print(c, HEX);
 +
  Serial.print(", AD1: 0x");
 +
  Serial.println(d, HEX);
 +
  digitalWrite(13, ledOn);
 +
  ledOn = !ledOn;
 +
  delay(100);
  
?
delay(300);
 
?
 
?
 
?
 
?
 
?
 
 
}
 
}
?
 
+
</pre>
?
 
+
?
void getHeading(void)
+
?
{
+
?
  heading=180*atan2(Mxyz[1],Mxyz[0])/PI;
+
?
  if(heading <0) heading +=360;
+
?
}
+
?
 
+
?
void getTiltHeading(void)
+
?
{
+
?
  float pitch = asin(-Axyz[0]);
+
?
  float roll = asin(Axyz[1]/cos(pitch));
+
?
 
+
?
  float xh = Mxyz[0] * cos(pitch) + Mxyz[2] * sin(pitch);
+
?
  float yh = Mxyz[0] * sin(roll) * sin(pitch) + Mxyz[1] * cos(roll) - Mxyz[2] * sin(roll) * cos(pitch);
+
?
  float zh = -Mxyz[0] * cos(roll) * sin(pitch) + Mxyz[1] * sin(roll) + Mxyz[2] * cos(roll) * cos(pitch);
+
?
  tiltheading = 180 * atan2(yh, xh)/PI;
+
?
  if(yh<0)    tiltheading +=360;
+
?
}
+
?
 
+
?
 
+
?
 
+
?
void Mxyz_init_calibrated ()
+
?
{
+
?
+
?
Serial.println(F("Before using 9DOF,we need to calibrate the compass frist,It will takes about 2 minutes."));
+
?
Serial.print("  ");
+
?
Serial.println(F("During  calibratting ,you should rotate and turn the 9DOF all the time within 2 minutes."));
+
?
Serial.print("  ");
+
?
Serial.println(F("If you are ready ,please sent a command data 'ready' to start sample and calibrate."));
+
?
while(!Serial.find("ready"));
+
?
Serial.println("  ");
+
?
Serial.println("ready");
+
?
Serial.println("Sample starting......");
+
?
Serial.println("waiting ......");
+
?
+
?
get_calibration_Data ();
+
?
+
?
Serial.println("    ");
+
?
Serial.println("compass calibration parameter ");
+
?
Serial.print(mx_centre);
+
?
Serial.print("    ");
+
?
Serial.print(my_centre);
+
?
Serial.print("    ");
+
?
Serial.println(mz_centre);
+
?
Serial.println("    ");
+
?
}
+
?
 
+
?
 
+
?
void get_calibration_Data ()
+
?
{
+
?
for (int i=0; i<sample_num_mdate;i++)
+
?
{
+
?
get_one_sample_date_mxyz();
+
?
/*
+
?
Serial.print(mx_sample[2]);
+
?
Serial.print(" ");
+
?
Serial.print(my_sample[2]);                            //you can see the sample data here .
+
?
Serial.print(" ");
+
?
Serial.println(mz_sample[2]);
+
?
*/
+
?
 
+
?
 
+
?
+
?
if (mx_sample[2]>=mx_sample[1])mx_sample[1] = mx_sample[2];
+
?
if (my_sample[2]>=my_sample[1])my_sample[1] = my_sample[2]; //find max value
+
?
if (mz_sample[2]>=mz_sample[1])mz_sample[1] = mz_sample[2];
+
?
+
?
if (mx_sample[2]<=mx_sample[0])mx_sample[0] = mx_sample[2];
+
?
if (my_sample[2]<=my_sample[0])my_sample[0] = my_sample[2];//find min value
+
?
if (mz_sample[2]<=mz_sample[0])mz_sample[0] = mz_sample[2];
+
?
+
?
}
+
?
+
?
mx_max = mx_sample[1];
+
?
my_max = my_sample[1];
+
?
mz_max = mz_sample[1];
+
?
+
?
mx_min = mx_sample[0];
+
?
my_min = my_sample[0];
+
?
mz_min = mz_sample[0];
+
?
+
?
 
+
?
+
?
mx_centre = (mx_max + mx_min)/2;
+
?
my_centre = (my_max + my_min)/2;
+
?
mz_centre = (mz_max + mz_min)/2;
+
?
+
?
}
+
?
 
+
?
 
+
?
 
+
?
 
+
?
 
+
?
 
+
?
void get_one_sample_date_mxyz()
+
?
{
+
?
getCompass_Data();
+
?
mx_sample[2] = Mxyz[0];
+
?
my_sample[2] = Mxyz[1];
+
?
mz_sample[2] = Mxyz[2];
+
?
}
+
?
 
+
?
 
+
?
void getAccel_Data(void)
+
?
{
+
?
  accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz);
+
?
  Axyz[0] = (double) ax / 16384;//16384  LSB/g
+
?
  Axyz[1] = (double) ay / 16384;
+
?
  Axyz[2] = (double) az / 16384;
+
?
}
+
?
 
+
?
void getGyro_Data(void)
+
?
{
+
?
  accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz);
+
?
  Gxyz[0] = (double) gx * 250 / 32768;
+
?
  Gxyz[1] = (double) gy * 250 / 32768;
+
?
  Gxyz[2] = (double) gz * 250 / 32768;
+
?
}
+
?
 
+
?
void getCompass_Data(void)
+
?
{
+
?
I2C_M.writeByte(MPU9150_RA_MAG_ADDRESS, 0x0A, 0x01); //enable the magnetometer
+
?
delay(10);
+
?
I2C_M.readBytes(MPU9150_RA_MAG_ADDRESS, MPU9150_RA_MAG_XOUT_L, 6, buffer_m);
+
?
+
?
    mx = ((int16_t)(buffer_m[1]) << 8) | buffer_m[0] ;
+
?
my = ((int16_t)(buffer_m[3]) << 8) | buffer_m[2] ;
+
?
mz = ((int16_t)(buffer_m[5]) << 8) | buffer_m[4] ;
+
?
+
?
//Mxyz[0] = (double) mx * 1200 / 4096;
+
?
//Mxyz[1] = (double) my * 1200 / 4096;
+
?
//Mxyz[2] = (double) mz * 1200 / 4096;
+
?
Mxyz[0] = (double) mx * 4800 / 8192;
+
?
Mxyz[1] = (double) my * 4800 / 8192;
+
?
Mxyz[2] = (double) mz * 4800 / 8192;
+
?
}
+
?
 
+
?
void getCompassDate_calibrated ()
+
?
{
+
?
getCompass_Data();
+
?
Mxyz[0] = Mxyz[0] - mx_centre;
+
?
Mxyz[1] = Mxyz[1] - my_centre;
+
?
Mxyz[2] = Mxyz[2] - mz_centre;
+
?
}</pre>
+
  
 
* 程序效果
 
* 程序效果
?
將程序下載后,將九軸姿態(tài)檢測(cè)傳感器水平靜止放置,打開串口監(jiān)視器,波特率調(diào)整為38400,等待顯示“Initializing I2C devices... Testing device connections... MPU9250 connection successful”后晃動(dòng)傳感器,觀察數(shù)據(jù)變化。
+
將程序下載后,將九軸姿態(tài)檢測(cè)傳感器水平靜止放置,打開串口監(jiān)視器,波特率調(diào)整為38400,晃動(dòng)傳感器,觀察數(shù)據(jù)變化。
?
[[文件:02S11304.png|530px|縮略圖|居中]]
+
  
 
==相關(guān)推薦==
 
==相關(guān)推薦==

2018年12月3日 (一) 17:31的版本

02S11301.png

目錄

產(chǎn)品概述

九軸姿態(tài)檢測(cè)傳感器基于MPU-9150開發(fā)而成,MPU-9150是世界上第一款集成了三軸陀螺儀、三軸加速度計(jì)及三軸磁力計(jì)的芯片。MPU-9150主要應(yīng)用于低功耗、低價(jià)格和高性能消費(fèi)電子產(chǎn)品,包含智能手機(jī)、平板電腦和可穿戴設(shè)備中。MPU-9150包含三個(gè)16位ADC用于陀螺儀信號(hào)進(jìn)行數(shù)字化輸出、三個(gè)16位ADC用于加速度計(jì)信號(hào)數(shù)字化輸出及三個(gè)13位ADC用于磁力計(jì)信號(hào)數(shù)字化輸出。九軸姿態(tài)檢測(cè)傳感器可廣泛應(yīng)用于航模無人機(jī),機(jī)器人,天線云臺(tái),聚光太陽能,地面及水下設(shè)備,虛擬現(xiàn)實(shí),人體運(yùn)動(dòng)分析等需要低成本、高動(dòng)態(tài)三維姿態(tài)測(cè)量的產(chǎn)品設(shè)備中。

規(guī)格參數(shù)

  • 工作電壓:5V
  • 接口類型:IIC通訊接口
  • 輸出信號(hào):數(shù)字信號(hào)
  • 工作溫度:-5℃到75℃
  • 接口類型:KF2510-4P防插反接口
  • 通信接口:IIC 通信
  • 三軸陀螺儀量程可由用戶設(shè)定,包含±250, ±500, ±1000, and ±2000°/sec
  • 三軸加速度量程可由用戶設(shè)定,包含±2g, ±4g, ±8g and ±16g
  • 產(chǎn)品尺寸:30mm x 25mm
  • 固定孔尺寸:23mm x 18mm
  • 重量大?。?g
  • 工作電流:20mA
  • 安裝:4 * M3 定位孔
  • 產(chǎn)品尺寸:
02S11302.png
  • 引腳定義:

(1)-:電源地
(2)+:電源正極
(3)SDA:IIC數(shù)據(jù)信號(hào)
(4)SCL:IIC時(shí)鐘信號(hào)

使用方法

  • 硬件環(huán)境:

(1)Starduino UNO R3 控制器
(2)4P 傳感器連接線
(3)9軸姿態(tài)傳感器

  • 軟件環(huán)境:Arduino IDE 1.8.1
  • 硬件連接
02S11303.png
  • 例子程序:
#include "quaternionFilters.h"
#include "MPU9250.h"

#define I2Cclock 400000
#define I2Cport Wire
#define MPU9250_ADDRESS MPU9250_ADDRESS_AD0   // Use either this line or the next to select which I2C address your device is using
//#define MPU9250_ADDRESS MPU9250_ADDRESS_AD1

MPU9250 myIMU0(MPU9250_ADDRESS_AD0, I2Cport, I2Cclock);
MPU9250 myIMU1(MPU9250_ADDRESS_AD1, I2Cport, I2Cclock);

 byte c = 0x00;
 byte d = 0x00;
 bool ledOn = true;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(38400);
  while(!Serial){};

  pinMode(13, OUTPUT);
  
}

void loop() {
  // put your main code here, to run repeatedly:

  c = myIMU0.readByte(MPU9250_ADDRESS_AD0, WHO_AM_I_MPU9250);
  d = myIMU1.readByte(MPU9250_ADDRESS_AD1, WHO_AM_I_MPU9250);

  Serial.print("Received AD0: 0x");
  Serial.print(c, HEX);
  Serial.print(", AD1: 0x");
  Serial.println(d, HEX);
  digitalWrite(13, ledOn);
  ledOn = !ledOn;
  delay(100);

}
  • 程序效果

將程序下載后,將九軸姿態(tài)檢測(cè)傳感器水平靜止放置,打開串口監(jiān)視器,波特率調(diào)整為38400,晃動(dòng)傳感器,觀察數(shù)據(jù)變化。

相關(guān)推薦

例程下載