【Arduino】168种传感器系模块列实验(163)---BMI160 六轴陀螺仪
2021-08-274.8万
精华项目
AI 快速预览详细
本文是关于使用BMI160 6轴惯性运动传感器的Arduino实验。传感器结合了16位3轴加速度计和超低功耗3轴陀螺仪,支持I2C/SPI接口。实验内容包括资料代码、仿真编程和图形编程,旨在帮助读者深入了解传感器的工作原理和应用方法。
|
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪 I2C/SPI 14LGA ![]() |





[backcolor=rgb(255, 255, 255)][font="]
[/font][/backcolor]
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪 I2C/SPI 14LGA
项目之九:低功耗模式计步器
[backcolor=rgb(255, 255, 255)][font=ui-monospace, SFMono-Regular, "]通过 setStepPowerMode 设置计步器功耗模式(stepNormalPowerMode 表示正常模式,stepLowPowerMode 表示低功耗模式)[/font][/backcolor]
[backcolor=rgb(255, 255, 255)][font=ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace] 实验开源代码[/font][/backcolor]
[code]/*
【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 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;
}
}[/code]
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪 I2C/SPI 14LGA
项目之八:简易测量X轴的动态波形
实验开源图形编程(Mind+、Mixly、编玩边学)
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪 I2C/SPI 14LGA
项目之七:简易测量三轴数据
实验开源图形编程(Mind+、Mixly、编玩边学)
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪 I2C/SPI 14LGA
项目之六:简易计步器
实验开源图形编程(Mind+、Mixly、编玩边学)
体积小、功耗低的 BMI160 是一款低噪声 16 位 IMU,专为 AR 或室内导航等移动应用而设计,可提供高度准确的传感器数据和实时传感器数据。BMI160 的低电流消耗使电池驱动设备中的应用成为可能。该传感器具有可配置的片上中断引擎,可提供基于运动的手势识别和上下文感知作为始终开启的后台功能。
主要特征
任意运动检测(加速度计)
显着运动检测(加速度计)
步进检测器(加速度计)
敲击感应(加速度计)
方向识别(加速度计)
平面检测(加速度计)
低重力/自由落体检测(加速度计)
高 G 检测(加速度计)
慢动作警报/无动作中断(加速度计)
数据就绪检测(加速度计、陀螺仪和外部传感器)
PMU触发器(陀螺仪)
FIFO 中断((加速度计、陀螺仪和外部传感器)
目标应用
增强现实和沉浸式游戏
室内导航
3D 扫描/室内测绘
高级手势识别
沉浸式游戏
9轴运动检测
空中鼠标应用程序和指针
计步器/计步
移动应用的高级系统电源管理
相机模组的光学防抖
自由落体检测和保修记录
一块扩展板完成Arduino的10类37项实验(代码+图形+仿真)
https://mc.dfrobot.com.cn/thread-280845-1-1.html
连杆形式的腿机构十一种:盘点机器人行走背后的机械原理
https://mc.dfrobot.com.cn/thread-308097-1-1.html
【花雕动手做】超低成本,尝试五十元的麦克纳姆轮小车!
https://mc.dfrobot.com.cn/thread-307863-1-1.html
【花雕动手做】超迷你哦,用徽商香烟盒做个智能小车!
https://mc.dfrobot.com.cn/thread-307907-1-1.html
【花雕动手做】太搞笑啦,一支胶管制成二只蠕动机器人
https://mc.dfrobot.com.cn/thread-308046-1-1.html
【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台
https://mc.dfrobot.com.cn/thread-308063-1-1.html
【花雕动手做】特别苗条,使用微波传感器控制的纤细小车
https://mc.dfrobot.com.cn/thread-308866-1-1.html
【花雕动手做】脑洞大开、五花八门的简易机器人66种
https://mc.dfrobot.com.cn/thread-307900-1-1.html
实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
https://mc.dfrobot.com.cn/thread-308195-1-1.html
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪 I2C/SPI 14LGA
https://mc.dfrobot.com.cn/thread-310371-1-1.html
实验一百六十五:2.4 英寸 TFT LCD 触摸屏模块 XPT2046 PCB ILI9341 240x320 像素 8 位 SPI 串口显示器
https://mc.dfrobot.com.cn/thread-309803-1-1.html
实验一百七十六:6mm大尺寸8x8LED方块方格点阵模块 可级联 红绿蓝白色 可选8级亮度
https://mc.dfrobot.com.cn/thread-309845-1-1.html
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
https://mc.dfrobot.com.cn/thread-310273-1-1.html
实验一百八十五:MAX4466声音传感器 驻极体话筒放大器 麦克风可调功放模块 microphone
https://mc.dfrobot.com.cn/thread-310193-1-1.html
实验一百八十九:TDA1308 硅麦克风 数字咪头放大模块 拾音器放大板 楼氏SUNLEPHANT
https://mc.dfrobot.com.cn/thread-310246-1-1.html
实验一百九十三:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor
https://mc.dfrobot.com.cn/thread-310209-1-1.html
实验二百:RCWL-0515微波雷达感应开关 人体感应 智能感应探测传感器 12-15米远距离2.7G微波检测模块
https://mc.dfrobot.com.cn/thread-310313-1-1.html
实验二百零三:Air724UG合宙 Cat14G模块 DTU物联网UART串口通信数据TCP透传 核心板组合套餐
https://mc.dfrobot.com.cn/thread-310342-1-1.html
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块 NB-IoT广域低功耗无线通信 GPS/北斗精准定位
https://mc.dfrobot.com.cn/thread-310433-1-1.html
实验开源代码
[code]/*
【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 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[6]={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[i]*3.14/180.0);Serial.print("\t");
}else{
//the following three data are accel datas
Serial.print(accelGyro[i]/16384.0);Serial.print("\t");
}
}
Serial.println();
}else{
Serial.println("err");
}
delay(100);
/*
* //only read accel data from bmi160
* int16_t onlyAccel[3]={0};
* bmi160.getAccelData(onlyAccel);
*/
/*
* ////only read gyro data from bmi160
* int16_t onlyGyro[3]={0};
* bmi160.getGyroData(onlyGyro);
*/
}[/code]
1、方向:重力加速度的方向总是竖直向下的。
2、大小:在地球表面附近,重力加速度的大小大约为 9.8 m/s²,但会因地理位置和高度的不同而略有变化。例如,在赤道附近约为 9.78 m/s²,而在极地附近约为 9.83 m/s²12。
3、恒定性:在同一地点,重力加速度是一个恒定的矢量。
计算公式:
根据牛顿的万有引力定律,重力加速度可以通过以下公式计算:
g=GM/r2
其中:
( G ) 是万有引力常数,
( M ) 是地球的质量,
( r ) 是地球半径。
重力加速度(通常用符号 g 表示)是指物体在地球表面附近自由下落时的加速度。它的标准值约为 9.8 m/s²,这意味着物体每秒钟的速度会增加约 9.8 米每秒。
I2C地址:
0x68:将 BMI160 的 SDIO 引脚连接到 GND,即默认 I2C 地址
实验接线:
BMI160 UNO
VIN 5V
GND GND
SCL A5
SDA A4
SAO GND
INT1 D2
实验开源代码
[code]/*
【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 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;
}
}[/code]