(SKU:RB-02S073)LSM9DS0- 9軸姿態(tài)傳感器

來自ALSROBOT WiKi
跳轉(zhuǎn)至: 導(dǎo)航搜索
9zzt.jpg

目錄

產(chǎn)品概述

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

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

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

使用方法

引腳定義

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


連接圖示

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

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

應(yīng)用例程

示例代碼

庫文件官方下載地址

#include <SPI.h> // Included for SFE_LSM9DS0 library
#include <Wire.h>
#include <SFE_LSM9DS0.h>
#define LSM9DS0_XM  0x1D // Would be 0x1E if SDO_XM is LOW
#define LSM9DS0_G   0x6B // Would be 0x6A if SDO_G is LOW
LSM9DS0 dof(MODE_I2C, LSM9DS0_G, LSM9DS0_XM);
const byte INT1XM = 2; // INT1XM tells us when accel data is ready
const byte INT2XM = 3; // INT2XM tells us when mag data is ready
const byte DRDYG = 4;  // DRDYG tells us when gyro data is ready
boolean printRaw = true;
void setup()
{
  // Set up interrupt pins as inputs:
  pinMode(INT1XM, INPUT);
  pinMode(INT2XM, INPUT);
  pinMode(DRDYG, INPUT);
  
  Serial.begin(115200); // Start serial at 115200 bps
  uint16_t status = dof.begin();
  Serial.println(status, HEX);
}

void loop()
{
  printMenu();
  while (!Serial.available())
  parseMenu(Serial.read());  
}

void printAccel()
{
  if (digitalRead(INT1XM))
  {
    dof.readAccel();
	
    Serial.print("A: ");
    if (printRaw)
    {
      Serial.print(dof.ax);
      Serial.print(", ");
      Serial.print(dof.ay);
      Serial.print(", ");
      Serial.println(dof.az);
    }
    else
    {
      Serial.print(dof.calcAccel(dof.ax));
      Serial.print(", ");
      Serial.print(dof.calcAccel(dof.ay));
      Serial.print(", ");
      Serial.println(dof.calcAccel(dof.az));
    }
  }
}

void printGyro()
{
  if (digitalRead(DRDYG))
  {
    dof.readGyro();
	
    Serial.print("G: ");
    if (printRaw)
    {
      Serial.print(dof.gx);
      Serial.print(", ");
      Serial.print(dof.gy);
      Serial.print(", ");
      Serial.println(dof.gz);
    }
    else
    {
      Serial.print(dof.calcGyro(dof.gx));
      Serial.print(", ");
      Serial.print(dof.calcGyro(dof.gy));
      Serial.print(", ");
      Serial.println(dof.calcGyro(dof.gz));
    }
  }
}

void printMag()
{
  if (digitalRead(INT2XM))
  {
    dof.readMag();
	
    Serial.print("M: ");
    if (printRaw)
    {
      Serial.print(dof.mx);
      Serial.print(", ");
      Serial.print(dof.my);
      Serial.print(", ");
      Serial.print(dof.mz);
      Serial.print(", ");
      Serial.println(calcHeading(dof.mx, dof.my));
    }
    else
    {
      Serial.print(dof.calcMag(dof.mx), 4);
      Serial.print(", ");
      Serial.print(dof.calcMag(dof.my), 4);
      Serial.print(", ");
      Serial.print(dof.calcMag(dof.mz), 4);
      Serial.print(", ");
      Serial.println(calcHeading(dof.mx, dof.my));
    }
  }
}
float calcHeading(float hx, float hy)
{  
  if (hy > 0)
  {
    return 90 - (atan(hx / hy) * 180 / PI);
  }
  else if (hy < 0)
  {
    return 270 - (atan(hx / hy) * 180 / PI);
  }
  else // hy = 0
  {
    if (hx < 0) return 180;
    else return 0;
  }
}
void streamAll()
{
  if ((digitalRead(INT2XM)) && (digitalRead(INT1XM)) &&
      (digitalRead(DRDYG)))
  {
    printAccel();
    printGyro();
    printMag();
  }
}
void setScale()
{
  char c;
  Serial.println(F("Set accelerometer scale:"));
  Serial.println(F("\t1) +/- 2G"));
  Serial.println(F("\t2) +/- 4G"));
  Serial.println(F("\t3) +/- 6G"));
  Serial.println(F("\t4) +/- 8G"));
  Serial.println(F("\t5) +/- 16G"));
  while (Serial.available() < 1)
    ;
  c = Serial.read();
  switch (c)
  {
    case '1':
      dof.setAccelScale(dof.A_SCALE_2G);
      break;
    case '2':
      dof.setAccelScale(dof.A_SCALE_4G);
      break;
    case '3':
      dof.setAccelScale(dof.A_SCALE_6G);
      break;
    case '4':
      dof.setAccelScale(dof.A_SCALE_8G);
      break;
    case '5':
      dof.setAccelScale(dof.A_SCALE_16G);
      break;
  }
  // Print the gyro scale ranges:
  Serial.println(F("Set gyroscope scale:"));
  Serial.println(F("\t1) +/- 245 DPS"));
  Serial.println(F("\t2) +/- 500 DPS"));
  Serial.println(F("\t3) +/- 2000 DPS"));
  // Wait for a character to come in:
  while (Serial.available() < 1);
  c = Serial.read();
  // Use the setGyroScale function to set the gyroscope
  // full-scale range to any of the possible ranges. These ranges
  // are all defined in SFE_LSM9DS0.h.
  switch (c)
  {
    case '1':
      dof.setGyroScale(dof.G_SCALE_245DPS);
      break;
    case '2':
      dof.setGyroScale(dof.G_SCALE_500DPS);
      break;
    case '3':
      dof.setGyroScale(dof.G_SCALE_2000DPS);
      break;
  }
  Serial.println(F("Set magnetometer scale:"));
  Serial.println(F("\t1) +/- 2GS"));
  Serial.println(F("\t2) +/- 4GS"));
  Serial.println(F("\t3) +/- 8GS"));
  Serial.println(F("\t4) +/- 12GS"));
  while (Serial.available() < 1)
    ;
  c = Serial.read();
  switch (c)
  {
    case '1':
      dof.setMagScale(dof.M_SCALE_2GS);
      break;
    case '2':
      dof.setMagScale(dof.M_SCALE_4GS);
      break;
    case '3':
      dof.setMagScale(dof.M_SCALE_8GS);
      break;
    case '4':
      dof.setMagScale(dof.M_SCALE_12GS);
      break;
  }
}
void setRaw()
{
  if (printRaw)
  {
    printRaw = false;
    Serial.println(F("Printing calculated readings"));
  }
  else
  {
    printRaw = true;
    Serial.println(F("Printing raw readings"));
  }
}
void setODR()
{
  char c;
  Serial.println(F("Set Accelerometer ODR (Hz):"));
  Serial.println(F("\t1) 3.125 \t 6) 100"));
  Serial.println(F("\t2) 6.25  \t 7) 200"));
  Serial.println(F("\t3) 12.5  \t 8) 400"));
  Serial.println(F("\t4) 25    \t 9) 800"));
  Serial.println(F("\t5) 50    \t A) 1600"));
  while (Serial.available() < 1)
    ;
  c = Serial.read();
  switch (c)
  {
    case '1':
      dof.setAccelODR(dof.A_ODR_3125);
      break;
    case '2':
      dof.setAccelODR(dof.A_ODR_625);
      break;
    case '3':
      dof.setAccelODR(dof.A_ODR_125);
      break;
    case '4':
      dof.setAccelODR(dof.A_ODR_25);
      break;
    case '5':
      dof.setAccelODR(dof.A_ODR_50);
      break;
    case '6':
      dof.setAccelODR(dof.A_ODR_100);
      break;
    case '7':
      dof.setAccelODR(dof.A_ODR_200);
      break;
    case '8':
      dof.setAccelODR(dof.A_ODR_400);
      break;
    case '9':
      dof.setAccelODR(dof.A_ODR_800);
      break;
    case 'A':
    case 'a':
      dof.setAccelODR(dof.A_ODR_1600);
      break;
  }
  Serial.println(F("Set Gyro ODR/Cutoff (Hz):"));
  Serial.println(F("\t1) 95/12.5 \t 8) 380/25"));
  Serial.println(F("\t2) 95/25   \t 9) 380/50"));
  Serial.println(F("\t3) 190/125 \t A) 380/100"));
  Serial.println(F("\t4) 190/25  \t B) 760/30"));
  Serial.println(F("\t5) 190/50  \t C) 760/35"));
  Serial.println(F("\t6) 190/70  \t D) 760/50"));
  Serial.println(F("\t7) 380/20  \t E) 760/100"));
  while (Serial.available() < 1);
  c = Serial.read();
  switch (c)
  {
    case '1':
      dof.setGyroODR(dof.G_ODR_95_BW_125);
      break;
    case '2':
      dof.setGyroODR(dof.G_ODR_95_BW_25);
      break;
    case '3':
      dof.setGyroODR(dof.G_ODR_190_BW_125);
      break;
    case '4':
      dof.setGyroODR(dof.G_ODR_190_BW_25);
      break;
    case '5':
      dof.setGyroODR(dof.G_ODR_190_BW_50);
      break;
    case '6':
      dof.setGyroODR(dof.G_ODR_190_BW_70);
      break;
    case '7':
      dof.setGyroODR(dof.G_ODR_380_BW_20);
      break;
    case '8':
      dof.setGyroODR(dof.G_ODR_380_BW_25);
      break;
    case '9':
      dof.setGyroODR(dof.G_ODR_380_BW_50);
      break;
    case 'A':
    case 'a':
      dof.setGyroODR(dof.G_ODR_380_BW_100);
      break;
    case 'B':
    case 'b':
      dof.setGyroODR(dof.G_ODR_760_BW_30);
      break;
    case 'C':
    case 'c':
      dof.setGyroODR(dof.G_ODR_760_BW_35);
      break;
    case 'D':
    case 'd':
      dof.setGyroODR(dof.G_ODR_760_BW_50);
      break;
    case 'E':
    case 'e':
      dof.setGyroODR(dof.G_ODR_760_BW_100);
      break;
  }
  Serial.println(F("Set Magnetometer ODR (Hz):"));
  Serial.println(F("\t1) 3.125 \t 4) 25"));
  Serial.println(F("\t2) 6.25  \t 5) 50"));
  Serial.println(F("\t3) 12.5  \t 6) 100"));
  while (Serial.available() < 1)
    ;
  c = Serial.read();
  switch (c)
  {
    case '1':
      dof.setMagODR(dof.M_ODR_3125);
      break;
    case '2':
      dof.setMagODR(dof.M_ODR_625);
      break;
    case '3':
      dof.setMagODR(dof.M_ODR_125);
      break;
    case '4':
      dof.setMagODR(dof.M_ODR_25);
      break;
    case '5':
      dof.setMagODR(dof.M_ODR_50);
      break;
    case '6':
      dof.setMagODR(dof.M_ODR_100);
      break;
  }
}

void printMenu()
{
  Serial.println();
  Serial.println(F("////////////////////////////////////////////"));
  Serial.println(F("// LSM9DS0 Super Awesome Amazing Fun Time //"));
  Serial.println(F("////////////////////////////////////////////"));
  Serial.println();
  Serial.println(F("1) Stream Accelerometer"));
  Serial.println(F("2) Stream Gyroscope"));
  Serial.println(F("3) Stream Magnetometer"));
  Serial.println(F("4) Stream output from all sensors"));
  Serial.println(F("5) Set Sensor Scales"));
  Serial.println(F("6) Switch To/From Raw/Calculated Readings"));
  Serial.println(F("7) Set Output Data Rates")); 
  Serial.println(); 
}

// parseMenu() takes a char parameter, which should map to one of
// the defined menu options. A switch statement will control what
// happens based on the given character input.
void parseMenu(char c)
{
  switch (c)
  {
    case '1':
      while(!Serial.available())
        printAccel(); // Print accelerometer values
      break;
    case '2':
      while(!Serial.available())
        printGyro(); // Print gyroscope values
      break;
    case '3':
      while(!Serial.available())
        printMag(); // Print magnetometer values
      break;
    case '4':
      while(!Serial.available())
        streamAll(); // Print all sensor readings
      break;
    case '5':
      setScale(); // Set the ranges of each sensor
      break;
    case '6':
      setRaw(); // Switch between calculated and raw output
      break;
    case '7':
      setODR(); // Set the data rates of each sensor
      break;
  }
}

程序效果

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

RB-02S0731.jpg

產(chǎn)品相關(guān)推薦

Erweima.png

產(chǎn)品購買地址

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

周邊產(chǎn)品推薦

Arduino 9 Axes Motion Shield 9軸運(yùn)動擴(kuò)展板

相關(guān)問題解答

Arduino 9 Axes Motion Shield 9軸運(yùn)動擴(kuò)展板 三軸加速度計(jì)

相關(guān)學(xué)習(xí)資料

LSM9DS0- 9軸姿態(tài)傳感器應(yīng)用視頻
電路原理圖
數(shù)據(jù)表(lmv324)
LSM9DS0- 9軸姿態(tài)傳感器官方操作手冊
GitHub(設(shè)計(jì)文件)
奧松機(jī)器人技術(shù)論壇