“(SKU:RB-02S073)LSM9DS0- 9軸姿態(tài)傳感器”的版本間的差異

來自ALSROBOT WiKi
跳轉至: 導航、 搜索
?產品相關推薦
第99行: 第99行:
 
==應用例程==
 
==應用例程==
 
===示例代碼===
 
===示例代碼===
?
<pre style='color:blue'>LSM9DS0_Simple.ino
+
[https://github.com/sparkfun/SparkFun_LSM9DS0_Arduino_Library 庫文件官方下載地址]<br/>
?
SFE_LSM9DS0 Library Simple Example Code
+
<pre style='color:blue'>
?
Jim Lindblom @ SparkFun Electronics
+
#include <SPI.h>  
?
Original Creation Date: February 18, 2014
+
?
https://github.com/sparkfun/LSM9DS0_Breakout
+
?
 
+
?
The LSM9DS0 is a versatile 9DOF sensor. It has a built-in
+
?
accelerometer, gyroscope, and magnetometer. Very cool! Plus it
+
?
functions over either SPI or I2C.
+
?
 
+
?
This Arduino sketch is a demo of the simple side of the
+
?
SFE_LSM9DS0 library. It'll demo the following:
+
?
* How to create a LSM9DS0 object, using a constructor (global
+
?
  variables section).
+
?
* How to use the begin() function of the LSM9DS0 class.
+
?
* How to read the gyroscope, accelerometer, and magnetometer
+
?
  using the readGryo(), readAccel(), readMag() functions and the
+
?
  gx, gy, gz, ax, ay, az, mx, my, and mz variables.
+
?
* How to calculate actual acceleration, rotation speed, magnetic
+
?
  field strength using the calcAccel(), calcGyro() and calcMag()
+
?
  functions.
+
?
* How to use the data from the LSM9DS0 to calculate orientation
+
?
  and heading.
+
?
 
+
?
Hardware setup: This library supports communicating with the
+
?
LSM9DS0 over either I2C or SPI. If you're using I2C, these are
+
?
the only connections that need to be made:
+
?
    LSM9DS0 --------- Arduino
+
?
    SCL ---------- SCL (A5 on older 'Duinos')
+
?
    SDA ---------- SDA (A4 on older 'Duinos')
+
?
    VDD ------------- 3.3V
+
?
    GND ------------- GND
+
?
(CSG, CSXM, SDOG, and SDOXM should all be pulled high jumpers on
+
?
  the breakout board will do this for you.)
+
?
 
+
?
If you're using SPI, here is an example hardware setup:
+
?
    LSM9DS0 --------- Arduino
+
?
          CSG -------------- 9
+
?
          CSXM ------------- 10
+
?
          SDOG ------------- 12
+
?
          SDOXM ------------ 12 (tied to SDOG)
+
?
          SCL -------------- 13
+
?
          SDA -------------- 11
+
?
          VDD -------------- 3.3V
+
?
          GND -------------- GND
+
?
 
+
?
The LSM9DS0 has a maximum voltage of 3.6V. Make sure you power it
+
?
off the 3.3V rail! And either use level shifters between SCL
+
?
and SDA or just use a 3.3V Arduino Pro. 
+
?
 
+
?
Development environment specifics:
+
?
    IDE: Arduino 1.0.5
+
?
    Hardware Platform: Arduino Pro 3.3V/8MHz
+
?
    LSM9DS0 Breakout Version: 1.0
+
?
 
+
?
This code is beerware. If you see me (or any other SparkFun
+
?
employee) at the local, and you've found our code helpful, please
+
?
buy us a round!
+
?
 
+
?
Distributed as-is; no warranty is given.
+
?
*****************************************************************/
+
?
 
+
?
// The SFE_LSM9DS0 requires both the SPI and Wire libraries.
+
?
// Unfortunately, you'll need to include both in the Arduino
+
?
// sketch, before including the SFE_LSM9DS0 library.
+
?
#include <SPI.h> // Included for SFE_LSM9DS0 library
+
 
#include <Wire.h>
 
#include <Wire.h>
 
#include <SFE_LSM9DS0.h>
 
#include <SFE_LSM9DS0.h>
?
 
+
#define LSM9DS0_XM  0x1D  
?
///////////////////////
+
#define LSM9DS0_G  0x6B  
?
// Example I2C Setup //
+
?
///////////////////////
+
?
// Comment out this section if you're using SPI
+
?
// SDO_XM and SDO_G are both grounded, so our addresses are:
+
?
#define LSM9DS0_XM  0x1D // Would be 0x1E if SDO_XM is LOW
+
?
#define LSM9DS0_G  0x6B // Would be 0x6A if SDO_G is LOW
+
?
// Create an instance of the LSM9DS0 library called `dof` the
+
?
// parameters for this constructor are:
+
?
// [SPI or I2C Mode declaration],[gyro I2C address],[xm I2C add.]
+
 
LSM9DS0 dof(MODE_I2C, LSM9DS0_G, LSM9DS0_XM);
 
LSM9DS0 dof(MODE_I2C, LSM9DS0_G, LSM9DS0_XM);
?
 
?
///////////////////////
 
?
// Example SPI Setup //
 
?
///////////////////////
 
?
/* // Uncomment this section if you're using SPI
 
?
#define LSM9DS0_CSG  9  // CSG connected to Arduino pin 9
 
?
#define LSM9DS0_CSXM 10 // CSXM connected to Arduino pin 10
 
?
LSM9DS0 dof(MODE_SPI, LSM9DS0_CSG, LSM9DS0_CSXM);
 
?
*/
 
?
 
?
// Do you want to print calculated values or raw ADC ticks read
 
?
// from the sensor? Comment out ONE of the two #defines below
 
?
// to pick:
 
 
#define PRINT_CALCULATED
 
#define PRINT_CALCULATED
?
//#define PRINT_RAW
+
#define PRINT_SPEED 500
?
 
+
?
#define PRINT_SPEED 500 // 500 ms between prints
+
?
 
+
 
void setup()
 
void setup()
 
{
 
{
?
   Serial.begin(115200); // Start serial at 115200 bps
+
   Serial.begin(115200);  
?
  // Use the begin() function to initialize the LSM9DS0 library.
+
?
  // You can either call it with no parameters (the easy way):
+
 
   uint16_t status = dof.begin();
 
   uint16_t status = dof.begin();
?
  // Or call it with declarations for sensor scales and data rates: 
 
?
  //uint16_t status = dof.begin(dof.G_SCALE_2000DPS,
 
?
  //                            dof.A_SCALE_6G, dof.M_SCALE_2GS);
 
?
 
?
  // begin() returns a 16-bit value which includes both the gyro
 
?
  // and accelerometers WHO_AM_I response. You can check this to
 
?
  // make sure communication was successful.
 
 
   Serial.print("LSM9DS0 WHO_AM_I's returned: 0x");
 
   Serial.print("LSM9DS0 WHO_AM_I's returned: 0x");
 
   Serial.println(status, HEX);
 
   Serial.println(status, HEX);
第221行: 第124行:
 
   printAccel(); // Print "A: ax, ay, az"
 
   printAccel(); // Print "A: ax, ay, az"
 
   printMag();  // Print "M: mx, my, mz"
 
   printMag();  // Print "M: mx, my, mz"
?
 
?
  // Print the heading and orientation for fun!
 
 
   printHeading((float) dof.mx, (float) dof.my);
 
   printHeading((float) dof.mx, (float) dof.my);
 
   printOrientation(dof.calcAccel(dof.ax), dof.calcAccel(dof.ay),  
 
   printOrientation(dof.calcAccel(dof.ax), dof.calcAccel(dof.ay),  
 
                   dof.calcAccel(dof.az));
 
                   dof.calcAccel(dof.az));
 
   Serial.println();
 
   Serial.println();
?
 
+
 
 
   delay(PRINT_SPEED);
 
   delay(PRINT_SPEED);
 
}
 
}
第233行: 第134行:
 
void printGyro()
 
void printGyro()
 
{
 
{
?
  // To read from the gyroscope, you must first call the
 
?
  // readGyro() function. When this exits, it'll update the
 
?
  // gx, gy, and gz variables with the most current data.
 
 
   dof.readGyro();
 
   dof.readGyro();
?
 
?
  // Now we can use the gx, gy, and gz variables as we please.
 
?
  // Either print them as raw ADC values, or calculated in DPS.
 
 
   Serial.print("G: ");
 
   Serial.print("G: ");
 
#ifdef PRINT_CALCULATED
 
#ifdef PRINT_CALCULATED
?
  // If you want to print calculated values, you can use the
 
?
  // calcGyro helper function to convert a raw ADC value to
 
?
  // DPS. Give the function the value that you want to convert.
 
 
   Serial.print(dof.calcGyro(dof.gx), 2);
 
   Serial.print(dof.calcGyro(dof.gx), 2);
 
   Serial.print(", ");
 
   Serial.print(", ");
第261行: 第153行:
 
void printAccel()
 
void printAccel()
 
{
 
{
?
  // To read from the accelerometer, you must first call the
 
?
  // readAccel() function. When this exits, it'll update the
 
?
  // ax, ay, and az variables with the most current data.
 
 
   dof.readAccel();
 
   dof.readAccel();
?
 
?
  // Now we can use the ax, ay, and az variables as we please.
 
?
  // Either print them as raw ADC values, or calculated in g's.
 
 
   Serial.print("A: ");
 
   Serial.print("A: ");
 
#ifdef PRINT_CALCULATED
 
#ifdef PRINT_CALCULATED
?
  // If you want to print calculated values, you can use the
 
?
  // calcAccel helper function to convert a raw ADC value to
 
?
  // g's. Give the function the value that you want to convert.
 
 
   Serial.print(dof.calcAccel(dof.ax), 2);
 
   Serial.print(dof.calcAccel(dof.ax), 2);
 
   Serial.print(", ");
 
   Serial.print(", ");
第290行: 第173行:
 
void printMag()
 
void printMag()
 
{
 
{
?
  // To read from the magnetometer, you must first call the
 
?
  // readMag() function. When this exits, it'll update the
 
?
  // mx, my, and mz variables with the most current data.
 
 
   dof.readMag();
 
   dof.readMag();
?
 
?
  // Now we can use the mx, my, and mz variables as we please.
 
?
  // Either print them as raw ADC values, or calculated in Gauss.
 
 
   Serial.print("M: ");
 
   Serial.print("M: ");
 
#ifdef PRINT_CALCULATED
 
#ifdef PRINT_CALCULATED
?
  // If you want to print calculated values, you can use the
 
?
  // calcMag helper function to convert a raw ADC value to
 
?
  // Gauss. Give the function the value that you want to convert.
 
 
   Serial.print(dof.calcMag(dof.mx), 2);
 
   Serial.print(dof.calcMag(dof.mx), 2);
 
   Serial.print(", ");
 
   Serial.print(", ");
第315行: 第189行:
 
#endif
 
#endif
 
}
 
}
?
 
?
// Here's a fun function to calculate your heading, using Earth's
 
?
// magnetic field.
 
?
// It only works if the sensor is flat (z-axis normal to Earth).
 
?
// Additionally, you may need to add or subtract a declination
 
?
// angle to get the heading normalized to your location.
 
?
// See: http://www.ngdc.noaa.gov/geomag/declination.shtml
 
 
void printHeading(float hx, float hy)
 
void printHeading(float hx, float hy)
 
{
 
{
 
   float heading;
 
   float heading;
?
 
+
 
 
   if (hy > 0)
 
   if (hy > 0)
 
   {
 
   {
第339行: 第206行:
 
     else heading = 0;
 
     else heading = 0;
 
   }
 
   }
?
 
+
 
 
   Serial.print("Heading: ");
 
   Serial.print("Heading: ");
 
   Serial.println(heading, 2);
 
   Serial.println(heading, 2);
 
}
 
}
?
 
?
// Another fun function that does calculations based on the
 
?
// acclerometer data. This function will print your LSM9DS0's
 
?
// orientation -- it's roll and pitch angles.
 
 
void printOrientation(float x, float y, float z)
 
void printOrientation(float x, float y, float z)
 
{
 
{
?
   float pitch, roll;
+
   float pitch, roll;
?
 
+
 
   pitch = atan2(x, sqrt(y * y) + (z * z));
 
   pitch = atan2(x, sqrt(y * y) + (z * z));
 
   roll = atan2(y, sqrt(x * x) + (z * z));
 
   roll = atan2(y, sqrt(x * x) + (z * z));
 
   pitch *= 180.0 / PI;
 
   pitch *= 180.0 / PI;
 
   roll *= 180.0 / PI;
 
   roll *= 180.0 / PI;
?
 
 
   Serial.print("Pitch, Roll: ");
 
   Serial.print("Pitch, Roll: ");
 
   Serial.print(pitch, 2);
 
   Serial.print(pitch, 2);
 
   Serial.print(", ");
 
   Serial.print(", ");
 
   Serial.println(roll, 2);
 
   Serial.println(roll, 2);
?
}</pre>
+
}
 +
</pre>
 
===程序效果===
 
===程序效果===
 
下載完程序,然后打開串口監(jiān)視器,將波特率調到115200,然后按照顯示的內容輸入相應數字進行功能選擇,可以觀察到多種數據。
 
下載完程序,然后打開串口監(jiān)視器,將波特率調到115200,然后按照顯示的內容輸入相應數字進行功能選擇,可以觀察到多種數據。

2015年10月9日 (五) 11:22的版本

9zzt.jpg

目錄

產品概述

LSM9DS0-9軸姿態(tài)傳感器選用的是LSM9DS0芯片,它是一種可實現(xiàn)動作感應的系統(tǒng)芯片,里面包括了一個3軸加速計,一個3軸陀螺儀和一個3軸磁力計。在LSM9DS0中,每種傳感器都有良好的檢測范圍:LSM9DS0線性加速滿量程為±2g/±4g/±6g/±8g/±16g;磁場滿量程為±2 /±4 /±8 /±12高斯;陀螺儀滿量程為±245 /±500 /±2000°/S。9軸姿態(tài)傳感器還包含了I2C串行總線接口,支持標準和快速模式(100 kHz和400 kHz)及SPI串行接口標準。

規(guī)格參數

  1. 模擬電源電壓范圍:2.4V~3.6V
  2. 3軸加速度計:±2/±4/±6/±8/±16 g
  3. 3軸陀螺儀:±245/±500/±2000°/S
  4. 3軸磁力計:±2/±4/±8/±12高斯
  5. 16位的數據輸出
  6. SPI/ I2C串行接口
  7. 嵌入式FIFO(先入先出的隊列);
  8. 可編程中斷發(fā)生
  9. 嵌入式自測試
  10. 嵌入式溫度傳感器
  11. 尺寸大?。?3.302cm x 1.524cm
  12. 重量大?。?0g

使用方法

引腳定義

9軸姿態(tài)傳感器 引腳定義
CSG 陀螺儀芯片操作方式選擇引腳
CSXM 加速度芯片操作方式選擇引腳
SDOG 地址選擇引腳
SDOX SPI模式輸出陀螺儀數據
SCL 信號時鐘引腳
SDA 數據引腳
VDD 電源正極
GND 電源地
DEN 陀螺儀數據使能引腳
INTG 陀螺儀可編程中斷
DRDYG 陀螺儀數據準備引腳
INT1XM 加速度中斷1
INT2XM 加速度中斷2


連接圖示

首先需要安裝一下LSM9DS0的Arduino庫,然后圖中右側的小紅色芯片為電平轉換芯片。

9軸姿態(tài)傳感器 Arduino
CSG、CSXM、SDOG、SDOXM、DEN、INTG 不接
SCL SCL
SDA SDA
VDD 3.3V
GND GND
DRDYG D4
INT1XM D2
INT2XM D3


9zzt1.jpg

應用例程

示例代碼

庫文件官方下載地址

#include <SPI.h> 
#include <Wire.h>
#include <SFE_LSM9DS0.h>
#define LSM9DS0_XM  0x1D 
#define LSM9DS0_G   0x6B 
LSM9DS0 dof(MODE_I2C, LSM9DS0_G, LSM9DS0_XM);
#define PRINT_CALCULATED
#define PRINT_SPEED 500
void setup()
{
  Serial.begin(115200); 
  uint16_t status = dof.begin();
  Serial.print("LSM9DS0 WHO_AM_I's returned: 0x");
  Serial.println(status, HEX);
  Serial.println("Should be 0x49D4");
  Serial.println();
}

void loop()
{
  printGyro();  // Print "G: gx, gy, gz"
  printAccel(); // Print "A: ax, ay, az"
  printMag();   // Print "M: mx, my, mz"
  printHeading((float) dof.mx, (float) dof.my);
  printOrientation(dof.calcAccel(dof.ax), dof.calcAccel(dof.ay), 
                   dof.calcAccel(dof.az));
  Serial.println();
  
  delay(PRINT_SPEED);
}

void printGyro()
{
  dof.readGyro();
  Serial.print("G: ");
#ifdef PRINT_CALCULATED
  Serial.print(dof.calcGyro(dof.gx), 2);
  Serial.print(", ");
  Serial.print(dof.calcGyro(dof.gy), 2);
  Serial.print(", ");
  Serial.println(dof.calcGyro(dof.gz), 2);
#elif defined PRINT_RAW
  Serial.print(dof.gx);
  Serial.print(", ");
  Serial.print(dof.gy);
  Serial.print(", ");
  Serial.println(dof.gz);
#endif
}

void printAccel()
{
  dof.readAccel();
  Serial.print("A: ");
#ifdef PRINT_CALCULATED
  Serial.print(dof.calcAccel(dof.ax), 2);
  Serial.print(", ");
  Serial.print(dof.calcAccel(dof.ay), 2);
  Serial.print(", ");
  Serial.println(dof.calcAccel(dof.az), 2);
#elif defined PRINT_RAW 
  Serial.print(dof.ax);
  Serial.print(", ");
  Serial.print(dof.ay);
  Serial.print(", ");
  Serial.println(dof.az);
#endif

}

void printMag()
{
  dof.readMag();
  Serial.print("M: ");
#ifdef PRINT_CALCULATED
  Serial.print(dof.calcMag(dof.mx), 2);
  Serial.print(", ");
  Serial.print(dof.calcMag(dof.my), 2);
  Serial.print(", ");
  Serial.println(dof.calcMag(dof.mz), 2);
#elif defined PRINT_RAW
  Serial.print(dof.mx);
  Serial.print(", ");
  Serial.print(dof.my);
  Serial.print(", ");
  Serial.println(dof.mz);
#endif
}
void printHeading(float hx, float hy)
{
  float heading;
  
  if (hy > 0)
  {
    heading = 90 - (atan(hx / hy) * (180 / PI));
  }
  else if (hy < 0)
  {
    heading = - (atan(hx / hy) * (180 / PI));
  }
  else // hy = 0
  {
    if (hx < 0) heading = 180;
    else heading = 0;
  }
  
  Serial.print("Heading: ");
  Serial.println(heading, 2);
}
void printOrientation(float x, float y, float z)
{
  float pitch, roll;  
  pitch = atan2(x, sqrt(y * y) + (z * z));
  roll = atan2(y, sqrt(x * x) + (z * z));
  pitch *= 180.0 / PI;
  roll *= 180.0 / PI;
  Serial.print("Pitch, Roll: ");
  Serial.print(pitch, 2);
  Serial.print(", ");
  Serial.println(roll, 2);
}

程序效果

下載完程序,然后打開串口監(jiān)視器,將波特率調到115200,然后按照顯示的內容輸入相應數字進行功能選擇,可以觀察到多種數據。

RB-02S0731.jpg

產品相關推薦

Erweima.png

產品購買地址

9軸姿態(tài)傳感器

周邊產品推薦

Arduino 9 Axes Motion Shield 9軸運動擴展板

相關問題解答

Arduino 9 Axes Motion Shield 9軸運動擴展板 三軸加速度計

相關學習資料

產品應用視頻 電路原理圖
數據表(lmv324)
安裝指南
GitHub(設計文件)
奧松機器人技術論壇