Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(1)

最初看到淘宝上面有卖 GY91 MPU9250+BMP280 时候,它写着九轴,是九个轴。地球上原来除了 X Y Z 之外,难道还有四五维空间里面的 6 个轴,看清楚后,原来所谓的九轴,是陀螺仪三轴,加速度三轴,磁感应三轴(指南针),才叫做九轴。MPU9250 是 InvenSense 出品,它本身就是一个模块集成了三个东西,还有个自身的温度计(芯片温度),FIFO,Digital Motion Processor(DMP,就是姿势识别,计步器那些),Interrupt(可惜 INT 脚在 GY91 没有了)。而我买了的 GY91 MPU9250+BMP280,又再集成了 Bosch BMP280 在一起。这么看来,价格贵,心里面不止一丝丝安慰,看着功能还有点吓人。

说实话,其实这个产品我是看了很久很久,一直就在购物车里面,最近才舍得拍下。

上一篇只从I2C总线操作 BMP280,这次分三篇博文,我希望全面攻克这整个模块,用于我将来的遥控直升机项目里。上一篇已经介绍过 I2C 的基本操作,这次内容主要是 Data Sheet 资料和操作方式。

第一部分,是 MPU9250。

MPU9250 地址

接线和原理图在上一篇。说明书上说,MPU9250 I2C 从机地址是 110100X,LSB取决于 AD0 是否拉低。从原理图看到是拉低了的,就是 1101000(0x68),见下图:

图片中另一个地址,0x76,是上一篇博文的 BMP280 温度气压传感器地址。

Dump 一下:

看看说明,Device ID 在,WHO AM I 寄存器,地址 0x75:

再看看 Register 描述,只读 value 为 0x71,与上面 Dump 出来结果一致。

但事情还没结束。说明书提到 MPU9250,是磁感应作为一块,加速和陀螺仪为一块,分开两个 die house。看 Register Map 可见,两者是分开描述的,各自有自己的 Device ID。这是因为,磁感应是 Asahi Kasei Microdevices Corporation 生产的 AKM8963 集成进去的,它是连接着 AUX I2C 引脚的,不是我现在接着的总线。GY-91 MPU9250+BMP280 的情况如下面简图:

就是说,还有一个 Device ID,AKM8963的。要它出现,两个办法,第一,利用加速陀螺仪作为 MASTER 让它去读取 AKM8963 的 Device ID Register,或者,Pass-Through Mode,由 Host 接管(本实验的 Host 即 BBB)。两个都操作一次看看。

(1)MPU9250 作为 I2C MASTER 从 AUX I2C 与从机交互

MPU9250 作为 Master 最多只能储存 Slave 的 24 bytes,暂存 AKM 的感应数据,卓卓有余。寄存器是 EXT_SENS_DATA_00 至 23,地址 0x49 至  0x60。多一个从机也是一样,共用的,相关详情、顺序、重置等等的方法,请自己看说明书。

只读的话,关键部位五个,I2C Master Mode Enable(MPU 作为主机),Slave 0 Enable(启用第一个从机配置),Slave 0 I2C Address(从机实际总线地址),Slave 0 Register Address (开始读取的地址),Slave 0 Length (读取或写入的数据长度,多少个 byte)。

Slave 0 Enable 与 Slave 0 Length

从机连线读取数据的配置,在这里:

Enable 和 读取长度,都在 0x27 I2C_SLV0_CTRL 寄存器内设置。bit 7 为 1 时候启用,我只读一个 byte 所以 <3:0> 设成 1 即可。就是I2C_SLV0_CTRL(0x27) 设成 10000001 (0x81)。

Slave 0 Register Address

起始读取位置设置在 0x26 I2C_SLV0_REG。由于 AKM8963 的 Device ID 在 0x00,I2C_SLV0_REG(0x26) 默认值就是 0x00,不用调,我就只读它。

Slave 0 I2C Address

AKM8963 的从机地址,请参看这里:
http://www.akm.com/akm/en/file/datasheet/AK8963.pdf

文档描述截图中下半部的是加上的 LSB R/W bit, 只看地址不用管它,RW 在 MPU 那边配。7 bit 地址就 0001100 至 0001111 可选,视乎接线,我瞎猜,第一个就中了,0001100 (0x0C),然后回到 MPU9250 Data Sheet 的从机地址配置描述:

RW 在 MSB 的。我只读,那整个 I2C_SLV0_ADDR (0x25) 从机地址配置的 8 bit 值,就是 10001100 (0x8C)。

I2C Master Mode Enable

主机模式配置在这里USER_CTRL register (0x6A) 里面,bit5,I2C_MST_EN:

需要给它值,00100000(0x20)。

总结,用命令行的话,就是这样操作:

i2cset -y 1 0x68 0x25 0x8C
i2cset -y 1 0x68 0x27 0x81
i2cset -y 1 0x68 0x6A 0x20

MPU9250 直接读取从机 AKM 磁感应 Register 效果

再 dump 一次看看效果:

刚才说过,用来放从机读取值的第一个寄存器,EXT_SENS_DATA_00,地址 0x49,现在有值了,它就是从 AKM8963 的 0x00 Device ID 寄存器读取到的值,01001000(0x48),与 AKM 的 Data Sheet 描述一致:

成功。

从 MPU9250 对 AKM8963 的寄存器写入值

然后到 MPU 对 AKM 寄存器写入值。说在前面,说明书的建议是 I2C Pass Through 由 Host 做好 AKM 的配置,然后才使用 AUX I2C,从 SLV0 不断读取。

要 AKM 工作测量,就要设置它的工作模式,CNTL1 Register,地址 0x0A:

我选择连续测量模式,100Hz,16bit Output ,参考上图,0x0A 的值就应该设置为 000 1 0110(0x16),测试而已。知道了要设置哪个寄存器,知道要写入什么值,然后就是如何操作 MPU9250 的 AUX Slave 写入。方法就是把写入的值放在 I2C_SLV0_DO (0x63)。但首先,要配置好 SLV0 先。

指定 SLV0 参数,同上 0x25 指定AKM的 I2C地址,不过这次 bit 7 为零,写入模式。写入的寄存器地址是 0x0A。然后启用 SLV0,但这次读取长度不设置,让它是零就 OK了,所以写入 0x80 到 0x27 寄存器:

i2cset -y 1 0x68 0x25 0x0C
i2cset -y 1 0x68 0x26 0x0A
i2cset -y 1 0x68 0x27 0x81

启用 I2C MASTER 模式(如果你之前还没启用的话):

i2cset -y 1 0x68 0x6A 0x20

最后写入值到 I2C_SLV0_DO,让 MPU 传给 AKM,0x16:

i2cset -y 1 0x68 0x63 0x16

怎么验证是否正确写入了?读出来就知道了,把地址 bit 7 改为 1:

i2cset -y 1 0x68 0x25 0x8C

效果:

上图红框,储存在寄存器 EXT_SENS_DATA_00 (0x49)的值 0x16 ,它就是通过 MPU 读取 AKM 的 0x0A 寄存器的值,同样地是我刚刚通过 MPU 写入的值。这样就确认了写入正确。指南针已经处于连续测量状态,你喜欢的还可以用 AKM 的状态寄存器读取状态,或者做些更有意义的事,看看现在的方向:

目标数据,在 0x03 至 0x08,共 6 bytes。

i2cset -y 1 0x68 0x25 0x8C
i2cset -y 1 0x68 0x26 0x03
i2cset -y 1 0x68 0x27 0x86

取得的值,单位是 μT,上图中 X 值占 2 bytes,0x49 地址是 LSB,就是说十进位值为 32:

X 32 μT
Y 65394 μT
Z 65452 μT

(2)Pass Through Mode,从 Host 用 I2C 总线直接连 AKM

Pass Through Mode 的设置,在 INT Pin / ByPass Register,寄存器地址 0x37,说明如下图:

之前提到这说明书建议,出自这里,Pass-Through mode is useful for configuring the external sensors,or for keeping MPU in a low-power mode ….。先看看怎么做,然后才判断到底应该怎样做。

MASTER 禁用然后 Pass Through 启用后,i2cdetect 就会看到 0x0c 直接出现在总线上,0x0c 就是磁感应的 I2C 地址。

操作一下,连续读取模式,然后 dump 就看到磁感应数据了。

就是普通的 I2C 通讯方式,非常简单。其他的写入值到寄存器等等,与其他 I2C 一样,不写出来了。

为何要用 Master Mode

既然 Pass Through 那么简单,为何不用 Pass Through 而要用 Master mode?因为我希望,生死攸关的数据,用最高速度传给控制器,然后它迅速作出适当反应。SPI 比 I2C 快,倾斜角,对于飞控是生死攸关,所以,我选用 SPI 连。

但是,GY91 这模块没有暴露 AKM 指南针的 SPI 接口给我,引脚的片选只有两个,一个是温度计,一个是 MPU,这情况,用 SPI 之后要接 AKM 我别无选择。下一篇,SPI 通讯,读取 Accelerometer/Gyroscope(飞控当前姿态),再通过 Master Mode 用 AUX I2C 定时获取 Magnetometer(飞控航角)。希望在下一篇,事情会变得稍为有趣一些。

时间: 2024-10-12 08:14:17

Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(1)的相关文章

Beaglebone Black &ndash; 连接 GY-91 MPU9250+BMP280 九轴传感器(2)

这次用 SPI.BBB 有两套 SPI 接口可用,两套都是默认 disable,需要用 overlay 方式启用,即: echo BB-SPIDEV0 > /sys/devices/bone_capemgr.9/slots 我的 BBB 当前配置当前配置 /opt/source/Userspace-Arduino/overlay/BB-SPI0-01-00A0.dts /dts-v1/; /plugin/; / {     compatible = "ti,beaglebone"

陀螺仪以及三轴陀螺仪和六轴陀螺仪的区别_六轴陀螺仪和九轴陀螺仪的区别

来源:电子发烧友 链接:http://www.elecfans.com/article/88/142/2017/20171201590857.html 陀螺仪,是一种用来感测与维持方向的装置,基於角动量不灭的理论设计出来的.陀螺仪主要是由一个位於轴心可以旋转的轮子构成. 陀螺仪一旦开始旋转,由於轮子的角动量,陀螺仪有抗拒方向改变的趋向.陀螺仪多用於导航.定位等系统. 1850年法国的物理学家福柯(J.Foucault)为了研究地球自转,首先发现高速转动中的转子(rotor),由于惯性作用它的旋转

九轴陀螺仪--读接口数据

1.使用i2c链接到树莓派的scl , sda 接口vcc给3v引脚,gnd接树莓派gnd就ok. 2.要操作mpu必须使用mpu的寄存器实现对参数的设定以及读取,取官方下载资料看了一下,在github上找了一个python代码,运行不了bug太多了,然后精简了一下.终于能读出数据了,读出来的数据都是6个字节的,后来发现这哥们用python 读取mpu没有做字节合并,重写了一下,后来发现数据都是整数,不管我怎么旋转数字都是正的,看了网上的一片文章说寄存器度出来的是一个无符号整数.后来想了半天,用

《痞子衡嵌入式半月刊》 第 2 期

痞子衡嵌入式半月刊: 第 2 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期. 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿. 上期回顾 :<痞子衡嵌入式半月刊: 第 1 期> 唠两句 如果你第一时间阅读本期,此时应正是立春与雨水交节之时(2020年02月19日 12:56:53).雨水节气标示着降雨开始.雨量渐增,俗话说"

六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植

2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控,虽然事后证实我的猜测是错的,但是在赛前我还是完成了相关代码的准备,这其中就包括了MPU6050的DMP库移植.在移植前我大概搜了一下,发现网上还没有相关的源代码.一起准备电赛的同学还买过一份RL78/G13的飞控代码,虽然也是使用MPU6050进行姿态获取,但是对MPU6050的读取并不是通过DMP

VR了解

转载自知乎 陆小山ccc & 天天: 按照目前VR的硬件形态来划分,VR头戴设备主要分为三种: 1.移动端头显(俗称手机VR) 2.一体机头显(VR一体机) 3.外接头戴式设备(需要外接主机). 移动端头显也就是所谓的VR眼镜盒子,只要放入手机即可观看.如小宅z4,暴风魔镜等等,相当于纸盒vr的进阶,价格在几十到数百不等. 一体机头显,它具有独立CPU.输入和输出显示功能,完全摆脱外置设备.如现在比较火的大朋vr.一体机形态,算得上是真正意义上的VR独立产品,不受空间约束和其他外部影响,但目前V

蚁视新家show,小伙伴们快来加入有范儿有爱的蚁视大家庭吧!

蚁视搬新家啦.新家在学院路上,离中关村很近,离宇宙的中心很近,离好多同学也很近有木有! 新家绝对是超级创客范儿,绝对理想中的工作环境有木有!愿意加入蚁视的小伙伴们,快快来吧! 下面是蚁视新办公室神秘出场~感觉自己萌萌哒! 进门就是蚁视"ANTVR"的大LOGO 左边的格子里摆满了各种有意思的东西. 有ANTVR KIT的各代原型机,可以随意把玩: 有Google Glass.SONY HMZ.Oculus Rift.Epson Glass等等各种智能头盔和眼镜,各种神器各种膜拜: 有X

BeagleBone Black教程之BeagleBone Black设备的连接

BeagleBone Black教程之BeagleBone Black设备的连接 BeagleBone Black开发前须要准备的材料 经过上面的介绍.相信你已经对BeagleBone有了大致的了解,你须要注意到完毕一件事情可能有多种不同的方式. 所以,依赖于你要完毕的项目,须要的材料也会不同,以下的材料能够助你完毕本书的大部分项目.但不是必须的: q  BeagleBone或者Beaglebone Black q  5V直流适配器 q  网线 q  USB A到mini B线 q  面包板 q

BeagleBone Black项目实训手册(大学霸内部资料)

BeagleBone Black项目实训手册(大学霸内部资料) 介绍:本教程是<BeagleBone Black快速入门教程>的后续教程.本教程以项目操作为主,讲解LED项目.声音项目.传感器项目以及显示项目,并对Beaglebone Black的GPIO.PWM以及I2C等特殊的接口进行详细讲解. 试读下载地址:http://pan.baidu.com/s/1eQozxnG BeagleBone Black项目实训手册 目  录 第1章  准备开始 1 1.1  启动你的Beaglebone