Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】168种传感器系模块列实验(163)---BMI160 六轴陀螺仪

[复制链接]
 楼主| 发表于 2021-8-27 14:44 | 显示全部楼层
本帖最后由 eagler8 于 2021-8-27 14:50 编辑

0-0-.jpg

BMI160 技术数据
  • 数字分辨率
    • 加速度计 (A):16 位
    • 陀螺仪(G):16bit
  • 测量范围(可编程)
    • (A):±2g、±4g、±8g、±16g
    • (G):±125°/s、±250°/s、±500°/s、±1000°/s、±2000°/s
  • 灵敏度(校准)
    • (A):±2g:16384LSB/g
      ±4g:8192LSB/g
      ±8g:4096LSB/g
      ±16g:2048LSB/g
    • (G):±125°/s:262.4 LSB/°/s
      ±250°/s:131.2 LSB/°/s
      ±500°/s:65.6 LSB/°/s
      ±1000°/s:32.8 LSB/° /s
      ±2000°/s:16.4 LSB/°/s
  • 零重力偏移(典型值,在整个生命周期内)
    • (A):±40mg
    • (G):± 10°/s
  • 噪声密度(典型值)
    • (A):180 μg/√Hz
    • (G):0.008°/s/√Hz
  • 带宽(可编程):1600 Hz … 25/32 Hz
  • 数字输入/输出:SPI、I²C、4x 数字中断
  • 电源电压 (VDD):1.71 … 3.6 V
  • I/0 电源电压 (VDDIO):1.2 … 3.6 V
  • 温度范围:-40 … +85°C
  • 目前的消费
    • 完全运行:950 μA
    • 低功耗模式:3 μA
  • FIFO 数据缓冲区:1024 字节
  • LGA 封装:2.5 × 3.0 × 0.8 mm³
  • 抗冲击性:10,000 gx 200 μs

BMI160 目标应用
  • 增强现实和沉浸式游戏
  • 3D 扫描和室内测绘
  • 室内导航、行人航位推算和计步
  • 6 轴和 9 轴传感器融合、空中鼠标应用
  • 光学防抖
BMI160 目标设备
  • 手机和平板电脑
  • 可穿戴设备,例如智能手表、头戴式显示器、运动和健身设备
  • 游戏控制器和智能遥控器
  • 玩具,例如四轴飞行器


 楼主| 发表于 2021-8-27 15:02 | 显示全部楼层
本帖最后由 eagler8 于 2021-9-8 19:53 编辑

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  项目之二:使用中断的BMI160简单计步功能

  实验开源代码
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  4.   项目之二:使用中断的BMI160简单计步功能
  5.   实验接线:
  6.   BMI160     UNO
  7.   VIN        5V
  8.   GND        GND
  9.   SCL        A5
  10.   SDA        A4
  11.   SAO        GND
  12.   INT1       D2
  13. */

  14. #include <BMI160Gen.h>

  15. const int bmi160_i2c_addr = 0x68;
  16. const int bmi160_select_pin = 10;
  17. const int bmi160_interrupt_pin = 2;

  18. void bmi160_intr(void){
  19.   Serial.println("BMI160 中断:轻拍!");
  20. }

  21. void setup() {
  22.   Serial.begin(9600);
  23.   while (!Serial);   

  24.   // initialize device
  25.   Serial.println("正在初始化 IMU 设备...");
  26.   //BMI160.begin(BMI160GenClass::SPI_MODE, bmi160_select_pin, bmi160_interrupt_pin);
  27.   BMI160.begin(BMI160GenClass::I2C_MODE, bmi160_i2c_addr, bmi160_interrupt_pin);
  28.   BMI160.attachInterrupt(bmi160_intr);
  29.   BMI160.setIntTapEnabled(true);
  30.   Serial.println("初始化 IMU 设备...完成。");
  31. }

  32. void loop() {
  33. }
复制代码


 楼主| 发表于 2021-8-27 15:07 | 显示全部楼层
本帖最后由 eagler8 于 2021-8-27 15:29 编辑

实验串口返回情况

22.jpg
 楼主| 发表于 2021-8-27 15:14 | 显示全部楼层
本帖最后由 eagler8 于 2021-8-27 15:32 编辑

实验场景图
23.jpg
 楼主| 发表于 2021-8-27 15:41 | 显示全部楼层
本帖最后由 eagler8 于 2021-9-8 19:53 编辑

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  项目之三:读取陀螺仪数据

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  4.   项目之三:读取陀螺仪数据
  5.   实验接线:
  6.   BMI160     UNO
  7.   VIN        5V
  8.   GND        GND
  9.   SCL        A5
  10.   SDA        A4
  11.   SAO        GND
  12.   INT1       D2
  13. */

  14. #include <BMI160Gen.h>

  15. void setup() {
  16.   Serial.begin(9600); // initialize Serial communication
  17.   while (!Serial);    // wait for the serial port to open

  18.   // initialize device
  19.   Serial.println("Initializing IMU device...");
  20.   //BMI160.begin(BMI160GenClass::SPI_MODE, /* SS pin# = */10);
  21.   BMI160.begin(BMI160GenClass::I2C_MODE);
  22.   uint8_t dev_id = BMI160.getDeviceID();
  23.   Serial.print("DEVICE ID: ");
  24.   Serial.println(dev_id, HEX);

  25.   // Set the accelerometer range to 250 degrees/second
  26.   BMI160.setGyroRange(250);
  27.   Serial.println("Initializing IMU device...done.");
  28. }

  29. void loop() {
  30.   int gxRaw, gyRaw, gzRaw;         // raw gyro values
  31.   float gx, gy, gz;

  32.   // read raw gyro measurements from device
  33.   BMI160.readGyro(gxRaw, gyRaw, gzRaw);

  34.   // convert the raw gyro data to degrees/second
  35.   gx = convertRawGyro(gxRaw);
  36.   gy = convertRawGyro(gyRaw);
  37.   gz = convertRawGyro(gzRaw);

  38.   // display tab-separated gyro x/y/z values
  39.   Serial.print("g:\t");
  40.   Serial.print(gx);
  41.   Serial.print("\t");
  42.   Serial.print(gy);
  43.   Serial.print("\t");
  44.   Serial.print(gz);
  45.   Serial.println();
  46.   delay(50);
  47. }

  48. float convertRawGyro(int gRaw) {
  49.   // since we are using 250 degrees/seconds range
  50.   // -250 maps to a raw value of -32768
  51.   // +250 maps to a raw value of 32767
  52.   float g = (gRaw * 250.0) / 32768.0;
  53.   return g;
  54. }
复制代码


 楼主| 发表于 2021-8-27 15:43 | 显示全部楼层
实验串口返回情况

20.jpg
 楼主| 发表于 2021-8-27 15:44 | 显示全部楼层
实验串口绘图器返回情况

21.jpg
 楼主| 发表于 2021-8-27 20:14 | 显示全部楼层
本帖最后由 eagler8 于 2021-9-8 21:01 编辑

  项目之四:从硬件 bmi160 读取计步器
  I2C地址:
  0x68:将 BMI160 的 SDIO 引脚连接到 GND,即默认 I2C 地址
  实验接线:
  BMI160     UNO
  VIN        5V
  GND        GND
  SCL        A5
  SDA        A4
  SAO        GND
  INT1       D2

实验开源代码
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  4.   项目之四:从硬件 bmi160 读取计步器
  5.   I2C地址:
  6.   0x68:将 BMI160 的 SDIO 引脚连接到 GND,即默认 I2C 地址
  7.   实验接线:
  8.   BMI160     UNO
  9.   VIN        5V
  10.   GND        GND
  11.   SCL        A5
  12.   SDA        A5
  13.   SAO        GND
  14.   INT1       D2
  15. */

  16. #include <DFRobot_BMI160.h>

  17. DFRobot_BMI160 bmi160;
  18. const int8_t i2c_addr = 0x68;
  19. bool readStep = false;

  20. #if defined ARDUINO_AVR_UNO || defined ARDUINO_AVR_MEGA2560 || defined ARDUINO_AVR_PRO
  21. //uno和mega2560的中断号为0
  22. int pbIn = 2;
  23. #elif ARDUINO_AVR_LEONARDO
  24. //uno和leonardo的中断号为0
  25. int pbIn = 3;
  26. #else
  27. int pbIn = 13;
  28. #endif
  29. //bmi160 有两个中断接口
  30. int int1 = 1;
  31. int int2 = 2;

  32. void stepChange() {
  33.   //一旦改变了步进控制器,就可以读取该值
  34.   readStep = true;
  35. }

  36. void setup() {
  37.   Serial.begin(115200);
  38.   delay(100);

  39.   //设置并初始化 bmi160 i2c 地址
  40.   while (bmi160.I2cInit(i2c_addr) != BMI160_OK) {
  41.     Serial.println("i2c init fail");
  42.     delay(1000);
  43.   }

  44.   //将中断号设置为 int1 或 int2
  45.   if (bmi160.setInt(int1) != BMI160_OK) {
  46.     Serial.println("set interrput fail");
  47.     while (1);
  48.   }

  49.   //将 bmi160 模式设置为计步器
  50.   if (bmi160.setStepCounter() != BMI160_OK) {
  51.     Serial.println("set step fail");
  52.     while (1);
  53.   }

  54.   //设置 bmi160 电源模型(正常电源模式)
  55.   if (bmi160.setStepPowerMode(bmi160.stepNormalPowerMode) != BMI160_OK){
  56.     Serial.println("set setStepPowerMode fail");
  57.     while (1);
  58.   }

  59. #if defined ARDUINO_AVR_UNO || defined ARDUINO_AVR_MEGA2560 || defined ARDUINO_AVR_LEONARDO || defined ARDUINO_AVR_PRO
  60.   //将板上的引脚设置为连接到 bmi160 的 int1 或 int2
  61.   attachInterrupt(digitalPinToInterrupt(pbIn), stepChange, FALLING);
  62. #else
  63.   attachInterrupt(pbIn, stepChange, FALLING);
  64. #endif
  65.   Serial.println(pbIn);
  66. }

  67. void loop() {
  68.   if (readStep) {
  69.     uint16_t stepCounter = 0;
  70.     //从硬件 bmi160 读取计步器
  71.     if (bmi160.readStepCounter(&stepCounter) == BMI160_OK) {
  72.       Serial.print("计步器 = "); Serial.println(stepCounter);
  73.     }
  74.     readStep = false;
  75.   }
  76. }
复制代码


 楼主| 发表于 2021-8-27 20:15 | 显示全部楼层
实验串口返回情况

30.jpg
 楼主| 发表于 2021-8-27 20:17 | 显示全部楼层
模块参考电原理图之二

27.jpg

29.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-10 00:01 , Processed in 0.074614 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表