(SKU:RB-02S073)LSM9DS0- 9軸姿態(tài)傳感器
目錄 |
產(chǎn)品概述
LSM9DS0-9軸姿態(tài)傳感器選用的是LSM9DS0芯片,它是一種可實(shí)現(xiàn)動(dòng)作感應(yīng)的系統(tǒng)芯片,里面包括了一個(gè)3軸加速計(jì),一個(gè)3軸陀螺儀和一個(gè)3軸磁力計(jì)。在LSM9DS0中,每種傳感器都有良好的檢測(cè)范圍:LSM9DS0線性加速滿量程為±2g/±4g/±6g/±8g/±16g;磁場(chǎng)滿量程為±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ù)
- 模擬電源電壓范圍:2.4V~3.6V
- 3軸加速度計(jì):±2/±4/±6/±8/±16 g
- 3軸陀螺儀:±245/±500/±2000°/S
- 3軸磁力計(jì):±2/±4/±8/±12高斯
- 16位的數(shù)據(jù)輸出
- SPI/ I2C串行接口
- 嵌入式FIFO(先入先出的隊(duì)列);
- 可編程中斷發(fā)生
- 嵌入式自測(cè)試
- 嵌入式溫度傳感器
- 尺寸大?。?3.302cm x 1.524cm
- 重量大小:10g
使用方法
引腳定義
9軸姿態(tài)傳感器 | 引腳定義 |
CSG | 陀螺儀芯片操作方式選擇引腳 |
CSXM | 加速度芯片操作方式選擇引腳 |
SDOG | 地址選擇引腳 |
SDOX | SPI模式輸出陀螺儀數(shù)據(jù) |
SCL | 信號(hào)時(shí)鐘引腳 |
SDA | 數(shù)據(jù)引腳 |
VDD | 電源正極 |
GND | 電源地 |
DEN | 陀螺儀數(shù)據(jù)使能引腳 |
INTG | 陀螺儀可編程中斷 |
DRDYG | 陀螺儀數(shù)據(jù)準(zhǔn)備引腳 |
INT1XM | 加速度中斷1 |
INT2XM | 加速度中斷2 |
連接圖示
首先需要安裝一下LSM9DS0的Arduino庫(kù),然后圖中右側(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 |
應(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; } }
程序效果
下載完程序,然后打開(kāi)串口監(jiān)視器,將波特率調(diào)到115200,然后按照顯示的內(nèi)容輸入相應(yīng)數(shù)字進(jìn)行功能選擇,可以觀察到多種數(shù)據(jù)。
產(chǎn)品相關(guān)推薦
產(chǎn)品購(gòu)買(mǎi)地址
周邊產(chǎn)品推薦
Arduino 9 Axes Motion Shield 9軸運(yùn)動(dòng)擴(kuò)展板
相關(guān)問(wèn)題解答
Arduino 9 Axes Motion Shield 9軸運(yùn)動(dòng)擴(kuò)展板 三軸加速度計(jì)
相關(guān)學(xué)習(xí)資料
LSM9DS0- 9軸姿態(tài)傳感器應(yīng)用視頻
電路原理圖
數(shù)據(jù)表(lmv324)
LSM9DS0- 9軸姿態(tài)傳感器官方操作手冊(cè)
GitHub(設(shè)計(jì)文件)
奧松機(jī)器人技術(shù)論壇