驴友花雕 发表于 2021-8-27 09:34:42

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

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

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






驴友花雕 发表于 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

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

#include <DFRobot_BMI160.h>

DFRobot_BMI160 bmi160;
const int8_t i2c_addr = 0x68;
bool readStep = false;

#if defined ARDUINO_AVR_UNO || defined ARDUINO_AVR_MEGA2560 || defined ARDUINO_AVR_PRO
//uno和mega2560的中断号为0
int pbIn = 2;
#elif ARDUINO_AVR_LEONARDO
//uno和leonardo的中断号为0
int pbIn = 3;
#else
int pbIn = 13;
#endif
//bmi160 有两个中断接口
int int1 = 1;
int int2 = 2;

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

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

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

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

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

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

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

void loop() {
if (readStep) {
    uint16_t stepCounter = 0;
    //从硬件 bmi160 读取计步器
    if (bmi160.readStepCounter(&stepCounter) == BMI160_OK) {
      Serial.print("计步器 = "); Serial.println(stepCounter);
    }
    readStep = false;
}
}

驴友花雕 发表于 2021-9-8 21:05:39

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

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

实验开源代码

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

#include <DFRobot_BMI160.h>

DFRobot_BMI160 bmi160;
const int8_t i2c_addr = 0x68;
bool readStep = false;

#if defined ARDUINO_AVR_UNO || defined ARDUINO_AVR_MEGA2560 || defined ARDUINO_AVR_PRO
//uno和mega2560的中断号为0
int pbIn = 2;
#elif ARDUINO_AVR_LEONARDO
//uno和leonardo的中断号为0
int pbIn = 3;
#else
int pbIn = 13;
#endif
//bmi160 有两个中断接口
int int1 = 1;
int int2 = 2;

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

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

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

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

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

//设置 bmi160 电源模型(微功耗电源模式)
if (bmi160.setStepPowerMode(bmi160.stepLowPowerMode) != BMI160_OK) {
    Serial.println("set setStepPowerMode fail");
    while (1);
}

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

void loop() {
if (readStep) {
    uint16_t stepCounter = 0;
    //从硬件 bmi160 读取计步器
    if (bmi160.readStepCounter(&stepCounter) == BMI160_OK) {
      Serial.print("计步器 = "); Serial.println(stepCounter);
    }
    readStep = false;
}
}

驴友花雕 发表于 2021-8-27 20:27:56

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

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

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪I2C/SPI 14LGA
项目之五:获取陀螺仪传感器的数据
I2C地址:
0x68:将 BMI160 的 SDIO 引脚连接到 GND,即默认 I2C 地址
实验接线:
BMI160   UNO
VIN      5V
GND      GND
SCL      A5
SDA      A4
SAO      GND
INT1       D2
*/

#include <DFRobot_BMI160.h>
DFRobot_BMI160 bmi160;
const int8_t i2c_addr = 0x68;

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

//init the hardware bmin160
if (bmi160.softReset() != BMI160_OK){
    Serial.println("reset false");
    while(1);
}

//set and init the bmi160 i2c address
if (bmi160.I2cInit(i2c_addr) != BMI160_OK){
    Serial.println("init false");
    while(1);
}
}

void loop(){
int i = 0;
int rslt;
int16_t accelGyro={0};

//get both accel and gyro data from bmi160
//parameter accelGyro is the pointer to store the data
rslt = bmi160.getAccelGyroData(accelGyro);
if(rslt == 0){
    for(i=0;i<6;i++){
      if (i<3){
      //the first three are gyro datas
      Serial.print(accelGyro*3.14/180.0);Serial.print("\t");
      }else{
      //the following three data are accel datas
      Serial.print(accelGyro/16384.0);Serial.print("\t");
      }
    }
    Serial.println();
}else{
    Serial.println("err");
}
delay(100);
/*
   * //only read accel data from bmi160
   * int16_t onlyAccel={0};
   * bmi160.getAccelData(onlyAccel);
   */

/*
   * ////only read gyro data from bmi160
   * int16_t onlyGyro={0};
   * bmi160.getGyroData(onlyGyro);
   */
}


驴友花雕 发表于 2021-8-27 09:37:33




博世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的数据流框图



驴友花雕 发表于 2021-8-27 09:55:40

BMI160参数


驴友花雕 发表于 2021-8-27 10:00:38


驴友花雕 发表于 2021-8-27 10:01:29


驴友花雕 发表于 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℃


驴友花雕 发表于 2021-8-27 10:13:14


名称: 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


驴友花雕 发表于 2021-8-27 10:29:36


驴友花雕 发表于 2021-8-27 10:29:54


驴友花雕 发表于 2021-8-27 10:52:21

BMI160模块接脚定义



驴友花雕 发表于 2021-8-27 11:15:35

BMI160模块参考电原理图


驴友花雕 发表于 2021-8-27 11:15:56




驴友花雕 发表于 2021-8-27 11:29:50

两种 BMI160 分线板



驴友花雕 发表于 2021-8-27 12:47:16

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

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

实验开源代码

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

#include <BMI160Gen.h>

const int select_pin = 10;
const int i2c_addr = 0x68; //I2C的地址

void setup() {
Serial.begin(9600);
while (!Serial);// 等待串口打开

// 初始化设备
//BMI160.begin(BMI160GenClass::SPI_MODE, select_pin);
BMI160.begin(BMI160GenClass::I2C_MODE, i2c_addr);
}

void loop() {
int gx, gy, gz;         // 原始陀螺值

// 从设备读取原始陀螺仪测量值
BMI160.readGyro(gx, gy, gz);

// 显示制表符分隔的陀螺仪 x/y/z 值
Serial.print("xyz:\t");
Serial.print(gx);
Serial.print("\t");
Serial.print(gy);
Serial.print("\t");
Serial.print(gz);
Serial.println();
delay(600);
}

驴友花雕 发表于 2021-8-27 12:50:04

实验串口返回情况


驴友花雕 发表于 2021-8-27 12:54:16

实验场景图


驴友花雕 发表于 2021-8-27 13:13:37

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



驴友花雕 发表于 2021-8-27 13:15:33

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



驴友花雕 发表于 2021-8-27 13:20:38

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

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

驴友花雕 发表于 2021-8-27 13:24:03

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


页: [1] 2 3
查看完整版本: 【Arduino】168种传感器系模块列实验(163)---BMI160 六轴陀螺仪