428浏览
查看: 428|回复: 47

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

[复制链接]
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。

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


00.jpg



驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 20:12:22

本帖最后由 驴友花雕 于 2021-9-8 21:02 编辑

  项目之四:从硬件 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-9-8 21:05:39

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

通过 setStepPowerMode 设置计步器功耗模式(stepNormalPowerMode 表示正常模式,stepLowPowerMode 表示低功耗模式)

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  4.   项目之九:低功耗模式计步器
  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.stepLowPowerMode) != 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:27:56

本帖最后由 驴友花雕 于 2021-9-8 19:55 编辑

项目之五:获取陀螺仪传感器的数据

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  4.   项目之五:获取陀螺仪传感器的数据
  5.   I2C地址:
  6.   0x68:将 BMI160 的 SDIO 引脚连接到 GND,即默认 I2C 地址
  7.   实验接线:
  8.   BMI160     UNO
  9.   VIN        5V
  10.   GND        GND
  11.   SCL        A5
  12.   SDA        A4
  13.   SAO        GND
  14.   INT1       D2
  15. */
  16. #include <DFRobot_BMI160.h>
  17. DFRobot_BMI160 bmi160;
  18. const int8_t i2c_addr = 0x68;
  19. void setup(){
  20.   Serial.begin(115200);
  21.   delay(100);
  22.   
  23.   //init the hardware bmin160  
  24.   if (bmi160.softReset() != BMI160_OK){
  25.     Serial.println("reset false");
  26.     while(1);
  27.   }
  28.   
  29.   //set and init the bmi160 i2c address
  30.   if (bmi160.I2cInit(i2c_addr) != BMI160_OK){
  31.     Serial.println("init false");
  32.     while(1);
  33.   }
  34. }
  35. void loop(){  
  36.   int i = 0;
  37.   int rslt;
  38.   int16_t accelGyro[6]={0};
  39.   
  40.   //get both accel and gyro data from bmi160
  41.   //parameter accelGyro is the pointer to store the data
  42.   rslt = bmi160.getAccelGyroData(accelGyro);
  43.   if(rslt == 0){
  44.     for(i=0;i<6;i++){
  45.       if (i<3){
  46.         //the first three are gyro datas
  47.         Serial.print(accelGyro[i]*3.14/180.0);Serial.print("\t");
  48.       }else{
  49.         //the following three data are accel datas
  50.         Serial.print(accelGyro[i]/16384.0);Serial.print("\t");
  51.       }
  52.     }
  53.     Serial.println();
  54.   }else{
  55.     Serial.println("err");
  56.   }
  57.   delay(100);
  58.   /*
  59.    * //only read accel data from bmi160
  60.    * int16_t onlyAccel[3]={0};
  61.    * bmi160.getAccelData(onlyAccel);
  62.    */
  63.   /*
  64.    * ////only read gyro data from bmi160
  65.    * int16_t onlyGyro[3]={0};
  66.    * bmi160.getGyroData(onlyGyro);
  67.    */
  68. }
复制代码



回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 09:37:33

01.jpg


博世BMI160

Bosch Sensortec公司推出的最新BMI160惯性测量单元,将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装。采用14管脚LGA封装,尺寸为2.5×3.0×0.8mm3。当加速度计和陀螺仪在全速模式下运行时,耗电典型值低至950µA,仅为市场上同类产品耗电量的50%或者更低。

Bosch BMI160专为智能手机、平板电脑、可穿戴设备设计,内置智能计步算法,可通过寄存器直接读取步数。内置的3轴加速度和3轴陀螺仪可以实现跑步,健身等运动检测。内置LDO电源管理芯片,支持3.2~6V宽电压供电,并且板载I2C电平转换电路,兼容Arduino 3.3V以及5V的控制器直接驱动。
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 09:38:00

BMI160的数据流框图

01-0.jpg

回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 09:55:40

BMI160参数

01-.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 10:00:38

01-1.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 10:01:29

01-2.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 10:11:30

技术规格
工作电压:3.2V~6V
电流消耗:<1mA
接口方式:2.54间距排针
加速度可选标尺:±2g/±4g/±8g/±16g
陀螺仪可选标尺:±125°/s,±250°/s,±500°/s,±1000°/s,±2000°/s
加速度计零点漂移:±40mg
陀螺仪零点漂移:±10°/s
可编程频率:25/32Hz~1600Hz
6D检测定位
16位数据输出
抗冲击:10,000 gx 200μs
2个独立的可编程中断发生器
内置1024 byte FIFO
工作温度:-40℃~+85℃
0-0.jpg

回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 10:13:14

05.jpg
名称: GY-BMI160模块(三轴陀螺仪+三轴加速度计)
使用芯片:BMI160
电源:3-5v(内部低压差稳压器)
通讯方式:标准IIC/SPI通讯协议
内置16bit AD转换芯片,16位数据输出
陀螺仪范围:±125±250±500±1000±2000°/s
加速度范围:±2±4±8±16g
采用沉金PCB,机器焊接工艺,保证质量
2.54mm 间距
模组尺寸 13mm*18mm

06.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 10:29:36

04-.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 10:29:54

04-0.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 10:52:21

BMI160模块接脚定义


04-9.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 11:15:35

BMI160模块参考电原理图

09 (1).jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 11:15:56

11.jpg

10.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 11:29:50

两种 BMI160 分线板


03.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 12:47:16

本帖最后由 驴友花雕 于 2021-9-8 19:57 编辑

  项目之一:动态读取陀螺仪 x/y/z 值

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
  4.   项目之一:动态读取陀螺仪 x/y/z 值
  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 select_pin = 10;
  16. const int i2c_addr = 0x68; //I2C的地址
  17. void setup() {
  18.   Serial.begin(9600);
  19.   while (!Serial);  // 等待串口打开
  20.   // 初始化设备
  21.   //BMI160.begin(BMI160GenClass::SPI_MODE, select_pin);
  22.   BMI160.begin(BMI160GenClass::I2C_MODE, i2c_addr);
  23. }
  24. void loop() {
  25.   int gx, gy, gz;         // 原始陀螺值
  26.   // 从设备读取原始陀螺仪测量值
  27.   BMI160.readGyro(gx, gy, gz);
  28.   // 显示制表符分隔的陀螺仪 x/y/z 值
  29.   Serial.print("xyz:\t");
  30.   Serial.print(gx);
  31.   Serial.print("\t");
  32.   Serial.print(gy);
  33.   Serial.print("\t");
  34.   Serial.print(gz);
  35.   Serial.println();
  36.   delay(600);
  37. }
复制代码


回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 12:50:04

实验串口返回情况

12.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 12:54:16

实验场景图

13.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 13:13:37

打开IDE——工具——串口绘图器


13-.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 13:15:33

实验串口绘图器返回情况(模块平放在桌面上)


15.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 13:20:38

本帖最后由 驴友花雕 于 2021-8-27 13:22 编辑

实验串口绘图器返回情况(手指敲打桌面)
17.jpg
回复

使用道具 举报

驴友花雕  高级技匠
 楼主|

发表于 2021-8-27 13:24:03

实验串口绘图器返回情况(三个方向摇动模块)

18.jpg
回复

使用道具 举报

123下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail