【雕爷学编程】Arduino动手做(152)---BMI160 六轴陀螺仪模块2

news2024/11/15 4:59:37

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

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百五十二:BMI160模块 6DOF 6轴 角速度 陀螺仪+重力加速度传感器IICSPI

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
项目之三:读取陀螺仪数据
Arduino实验开源代码

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪 I2C/SPI 14LGA

 项目之三:读取陀螺仪数据

 实验接线:

 BMI160   UNO

 VIN    5V

 GND    GND

 SCL    A5

 SDA    A4

 SAO    GND

 INT1    D2

*/

#include <BMI160Gen.h>

void setup() {

 Serial.begin(9600); // initialize Serial communication

 while (!Serial);  // wait for the serial port to open

 // initialize device

 Serial.println("Initializing IMU device...");

 //BMI160.begin(BMI160GenClass::SPI_MODE, /* SS pin# = */10);

 BMI160.begin(BMI160GenClass::I2C_MODE);

 uint8_t dev_id = BMI160.getDeviceID();

 Serial.print("DEVICE ID: ");

 Serial.println(dev_id, HEX);

 // Set the accelerometer range to 250 degrees/second

 BMI160.setGyroRange(250);

 Serial.println("Initializing IMU device...done.");

}

void loop() {

 int gxRaw, gyRaw, gzRaw;     // raw gyro values

 float gx, gy, gz;

 // read raw gyro measurements from device

 BMI160.readGyro(gxRaw, gyRaw, gzRaw);

 // convert the raw gyro data to degrees/second

 gx = convertRawGyro(gxRaw);

 gy = convertRawGyro(gyRaw);

 gz = convertRawGyro(gzRaw);

 // display tab-separated gyro x/y/z values

 Serial.print("g:\t");

 Serial.print(gx);

 Serial.print("\t");

 Serial.print(gy);

 Serial.print("\t");

 Serial.print(gz);

 Serial.println();

 delay(50);

}

float convertRawGyro(int gRaw) {

 // since we are using 250 degrees/seconds range

 // -250 maps to a raw value of -32768

 // +250 maps to a raw value of 32767

 float g = (gRaw * 250.0) / 32768.0;

 return g;

}

实验串口返回情况

在这里插入图片描述
实验串口绘图器返回情况

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

项目之四:从硬件 bmi160 读取计步器

I2C地址:

0x68:将 BMI160 的 SDIO 引脚连接到 GND,即默认 I2C 地址

实验接线:

BMI160 UNO

VIN 5V

GND GND

SCL A5

SDA A4

SAO GND

INT1 D2

Arduino实验开源代码

/*

 【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;

 }

}

实验串口返回情况

在这里插入图片描述

模块参考电原理图之二

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
项目之五:获取陀螺仪传感器的数据
Arduino实验开源代码

/*

 【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;

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);

  */

}

实验串口返回情况

在这里插入图片描述
实验串口绘图器返回情况
在这里插入图片描述
在这里插入图片描述

BMI160 传感器 API概述
体积小、功耗低的 BMI160 是一款低噪声 16 位 IMU,专为 AR 或室内导航等移动应用而设计,可提供高度准确的传感器数据和实时传感器数据。BMI160 的低电流消耗使电池驱动设备中的应用成为可能。该传感器具有可配置的片上中断引擎,可提供基于运动的手势识别和上下文感知作为始终开启的后台功能。

主要特征
任意运动检测(加速度计)
显着运动检测(加速度计)
步进检测器(加速度计)
敲击感应(加速度计)
方向识别(加速度计)
平面检测(加速度计)
低重力/自由落体检测(加速度计)
高 G 检测(加速度计)
慢动作警报/无动作中断(加速度计)
数据就绪检测(加速度计、陀螺仪和外部传感器)
PMU触发器(陀螺仪)
FIFO 中断((加速度计、陀螺仪和外部传感器)

目标应用
增强现实和沉浸式游戏
室内导航
3D 扫描/室内测绘
高级手势识别
沉浸式游戏
9轴运动检测
空中鼠标应用程序和指针
计步器/计步
移动应用的高级系统电源管理
相机模组的光学防抖
自由落体检测和保修记录

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

项目之九:低功耗模式计步器

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

Arduino实验开源代码

/*
  【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;
  }
}

BMI160 6轴惯性运动传感器电原理图

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

走进Linux世界【三、Linux文件与路径】

第三章 Linux文件与路径 1、文件结构 ​ Windows和Linux文件系统区别 ​ 在windows平台下&#xff0c;打开“此电脑”&#xff0c;我们可以看到盘符分区 ​ 每个驱动器都有自己的根目录结构&#xff0c;这样形成了多个树并列的情形 ​ 但是在 Linux 下&#xff0c;我们是看…

创建和分析二维桁架和梁结构研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用完全分析

前言 上一个记录中的 虚拟地址里的虚拟内存区域没有说的很完全 这次补充一下 同时记录一些 物理地址空间 内存映射原理 最后直接通过进程使用函数完成虚拟空间到物理空间的映射 物理地址空间 物理地址是处理器在系统总线上看到的地址。使用RISC的处理器通常只实现一个物理地…

递归函数(详解+实战)

目录 递归函数介绍 递归函数的作用 案例&#xff1a;实现10以内阶乘 递归思想 递归的编写 斐波那契数列(实战) 循环实现 递归实现 递归函数介绍 递归函数是指在函数的定义中调用函数本身的过程。递归函数可以用于解决那些可以通过将大问题拆分为更小的相似子问题来解决的…

窗口看门狗 WWDG

窗口看门狗介绍 Q: 什么是窗口看门狗&#xff1f; A: 窗口看门狗用于监测单片机程序运行时效是否精准&#xff0c;主要检测软件异常(独立看门狗检测的是硬件异常)&#xff0c;一般用于需要精准检测&#xff08;独立看门狗不太精准&#xff09;程序运行时间的场合。 窗口看门狗…

MySQL数据库操作篇3(聚合函数分组查询)

通过MySQL提供的聚合函数&#xff0c;可以很方便的进行一些计算来辅助查询&#xff0c;所谓聚合函数就是将表中的数据统计后进行的某种处理 分组查询可以理解成将一张表按照某个属性分成多张表&#xff0c;属性值相同的在一张表里 比如说学生表&#xff0c;按照性别这个属性分组…

java+大数据实战 短链项目

一.前言 1.1课程大致包含技术 首先选这套课的目的是 包含了我所学的大部分技术 比如springboot ssm redis kafka flink clickhouse 等 1.2 外界客观原因 就业环境一般 目前来看暂时还没但是有后续潜在的毕业 或者 离职 1.3技术追求 个人的技术追求暂时是在技术总监 技术…

vue3功能实现

在vue2中&#xff0c;要实现一些方法&#xff08;增删改查&#xff09;一般都是写在一起的。如下图所示&#xff1a; 但是在vue3中&#xff0c;实现一个方法需要用到很多文件。 方法定义方法如下&#xff1a; export function classSign(phone: string) {return sign_reques…

TypeScript基础篇 - 类型的思考方式

目录 重新认识&#xff1a;什么是类型&#xff1f; 类型是人类的思考方式 类型是错误检查的利器 总结&#xff1a;为什么我们用TS&#xff1f; 一张ai生成图~ 重新认识&#xff1a;什么是类型&#xff1f; 汽车可以跑怎么理解&#xff1f; car.run() 【面向对象】car imp…

【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

微服务架构Ribbon与OpenFeign的使用 【快速入门】

一、实现负载均衡&#x1f349; 1.什么是负载均衡&#x1f95d; 通俗的讲&#xff0c; 负载均衡就是将负载&#xff08;工作任务&#xff0c;访问请求&#xff09;进行分摊到多个操作单元&#xff08;服务器,组件&#xff09;上进行执行。 根据负载均衡发生位置的不同,一般分…

Terraform(一)

IaC 自动化配置与编排神器 - Terraform 1. 相关概念1.1 什么是 IaCIaC 的两种实现方式IaC 的好处IaC 优点IaC 工具为什么 IaC 对 DevOps 很重要&#xff1f; 1.2 什么是 Terraform1.3 Terraform 的主要特性1.4 Terraform 架构1.5 Terraform 核心概念1.6 Terraform 生命周期1.7 …

高等数学❤️第一章~第二节~极限❤️无穷小量与无穷大量~无穷小量概念及其性质与比较详解

【精讲】高等数学中的无穷小量概念及其性质与比较 博主&#xff1a;命运之光的主页 专栏&#xff1a;高等数学 目录 【精讲】高等数学中的无穷小量概念及其性质与比较 导言 一、无穷小量的概念 二、无穷小量的性质 三、无穷小量的比较 四、无穷小量的应用 必需记忆知识点…

【C++刷题集】-- day4

目录 选择题​​​​​​​ 单选 编程题 计算糖果⭐ 【题目解析】 【解题思路】 进制转换⭐​​​​​​​ 【题目解析】 【解题思路】 选择题 单选 1、 有以下程序 #include<iostream> #include<cstdio> using namespace std; int main() {int m 0123, n 123…

(文章复现)售电市场环境下电力用户选择售电公司行为研究(附matlab代码)

参考文献&#xff1a; [1]孙云涛,宋依群,姚良忠等.售电市场环境下电力用户选择售电公司行为研究[J].电网技术,2018,42(04):1124-1131. 1.基本原理 1 .1演化博弈 与古典博弈理论相比较&#xff0c;演化博弈假设参与人是有限理性的&#xff0c;参与人会根据自己和他人的经验选…

【前端】网页开发精讲与实战 CSS Day 4

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;前端 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有…

Vue+Ts+Echart使用以及后台接口对接逻辑【实战】

官网传送门 一.echarts介绍 是一个js插件 性能好可流畅远行PC和移动设备 兼容主流浏览器 提供很多图标,用户且可自行修改。 2.使用npm安装 npm install echarts二.echarts基本使用、自定义图例、选择7天日期查询图表数据内容 获取本地时间以及当前时间前几天后几天 /*** 获…

安装Visual Studio Installer Projects 2022插件

VS主界面--扩展--管理扩展--搜索VS插件“Visual Studio Installer Projects 2022”并安装。

JavaWeb(5)——HTML、CSS、JS 快速入门

一、JavaScript 对象 二、JavaScript BOM对象 和 DOM对象 关于BOM主要对 Window 和 location 进行说明&#xff1a; 三、JavaScript 事件监听 事件绑定 常见事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…