龙邱MPU9250传感器 | 使用ESP32 模块进行测试

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了龙邱MPU9250传感器 | 使用ESP32 模块进行测试相关的知识,希望对你有一定的参考价值。

简 介: 利用ESP32 MicroPython对于来自于龙邱的MPU9250进行初步测试。

关键词 MPU9250I2CESP32软件I2C

 

§01 MPU9250


  边存在几个上学期来自于 龙邱的MPU9250传感器 ,为了利用其今后做实验,使用ESP32 MicroPython实验板对其初步进行测试。

▲ 图1.1.0 MPU9250 模块

一、基本信息

  根据 MPU9250 TB网页上 的介绍这个模块是一款九轴IMU。在芯片的丝印上显示 “MP92”字样。

1、芯片信息

  MPU9250 九轴产品中文说明书 : https://max.book118.com/html/2017/0906/132114737.shtm 可以知道该模块的基本信息:

  • 工作电压: 3.3V;
  • 编程接口: SPI, I2C

2、模块接口

▲ 图1.1.1 模块接口

【表1-1-1 模块接口】

序号名称功能
PIN1GND电源地
PIN23V33.3V电源
PIN3SCL/SCKI2C/SPI 时钟信号
PIN4SDA/SDII2C数据信号;SPI数据输入
PIN5AD0/SDOI2C地址选择(1101001);SPI数据输出
PIN6CS片选信号
PIN7INT1终端数字输出信号
PIN8FSYNC数字同步输入帧,若不同接地

(1) I2C接口

I2C地址:
AD0=0:1101000
AD0=1:1101001

(2) SPI接口

▲ 图1.1.2 SPI 接口时序特性

  下面是选择芯片不同的接口形式:

  • nCS 接高电平: I2C总线;
  • nCS接低电平:SPI 总线;

▲ 图1.1.3 两种不同接口的配置

▲ 图1.1.4 I2C总线使用模式

二、上电测试

1、接口上拉电阻

  使用万用表测量模块的 CLKSDK3.3V之间之间的电阻,为10kΩ,这说明在模块中内部使用了R4,R510kΩ)使用了上拉电阻对于 SDKCLK进行了偏置。

2、端口配置

MP9255模块端口:
A0: GND
CS: 3.3V
FSYNC:GND
INT:NULL

▲ 图1.2.1 配置模块端口

 

§02 ESP32测试


一、基本测试

1、管脚配置

  根据 MicroPython ESP32手册 中关于 软件I2C配置,可以使用ESP32任意管脚作为I2C管脚。

  根据 ESP32-S模块转接板设计与实现 对于ESP32转接模块描述,使用PIO的最右边两个管脚分别作为I2C关节。

ESP32I2C管脚:
SCL:IO2
SDA:IO15

▲ 图2.1.1 I2C管脚配置

  ◎ 注: 使用RXD2,TXD2作为I2C的 SCL,SDA会出现输出低电平的情况,原因不详。

▲ 图2.1.2 连接I2C引脚

2、扫描设备

  扫描I2C设备,可以获得: 【104】: 0b1101000

from machine                import Pin,Timer,SoftI2C
import time
import math

led0 = Pin(5, Pin.OUT)
led1 = Pin(18, Pin.OUT)

i2c = SoftI2C(scl=Pin(16), sda=Pin(17), freq=100000)
scan = i2c.scan()

print(scan)
print('Begin ...')

while True:
    led0.on()
    led1.off()
    time.sleep_ms(200)
    led0.off()
    led1.on()
    time.sleep_ms(200)

二、读取数据

  在 MPU9250的详细功能 给出了MPU9250 界面读写的详细过程。 MPU9250 数据手册 下载链接。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2021-09-20
#
# Note:
#============================================================
from machine                import Pin,Timer,SoftI2C
import time
import math
led0 = Pin(5, Pin.OUT)
led1 = Pin(17, Pin.OUT)
i2c = SoftI2C(scl=Pin(2), sda=Pin(15), freq=100000)
#------------------------------------------------------------
MPU9250_ADDRESS            = 0x68
MAG_ADDRESS                = 0x0c
GYRO_FULL_SCALE_250_DPS    = 0x00
GYRO_FULL_SCALE_500_DPS    = 0x08
GYRO_FULL_SCALE_1000_DPS   = 0x10
GYRO_FULL_SCALE_2000_DPS   = 0x18
ACC_FULL_SCALE_2_G        = 0x00
ACC_FULL_SCALE_4_G        = 0x08
ACC_FULL_SCALE_8_G        = 0x10
ACC_FULL_SCALE_16_G       = 0x18
#------------------------------------------------------------
def MPU9250Setup():
    i2c.writeto_mem(MPU9250_ADDRESS, 27, bytearray(GYRO_FULL_SCALE_2000_DPS))
                                    # Configure gyroscope range
    i2c.writeto_mem(MPU9250_ADDRESS, 28, bytearray(ACC_FULL_SCALE_16_G))
                                    # Configure accelerometer range
    i2c.writeto_mem(MPU9250_ADDRESS, 0x37, bytearray(0x2))
                                    # Set by pass mode for magnetometer
#    time.sleep_ms(10)
#    i2c.writeto_mem(MAG_ADDRESS, 0x0a, bytearray(0x16))
                                    # Request first magnetometer single measurement
#------------------------------------------------------------
def bytes2short(b):
    a = int.from_bytes(b, 'big', True)
    if a > 0x7fff:
        return -(0x10000 - a)
    else:  return a
def MPU9250read():
    buf = bytearray(14)
    buf = i2c.readfrom_mem(MPU9250_ADDRESS, 0x3b, 14)
    ax = bytes2short(buf[0:2])
    ay = bytes2short(buf[2:4])
    az = bytes2short(buf[4:6])
    gx = bytes2short(buf[8:10])
    gy = bytes2short(buf[10:12])
    gz = bytes2short(buf[12:14])
    temp = bytes2short(buf[6:8])
    return (ax,ay,az),(gx,gy,gz), temp
#------------------------------------------------------------
MPU9250Setup()
print(MPU9250read())
#------------------------------------------------------------
while True:
    led0.on()
    led1.off()
    time.sleep_ms(200)
    led0.off()
    led1.on()
    time.sleep_ms(200)
    print(MPU9250read())
#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

 

试结论 ※


  试了ESP32的 软件 I2C总线功能。并利用ESP32读取MPU9250 的加速度以及陀螺仪的数据。

  遗留问题: 在读取磁力计数据的时候遇到了问题。无法正确访问磁力计的数据。


■ 相关文献链接:

● 相关图表链接:

以上是关于龙邱MPU9250传感器 | 使用ESP32 模块进行测试的主要内容,如果未能解决你的问题,请参考以下文章

项目ES32获取mpu9250数据网页交互显示 (程序1) esp32获取mpu9250数据

项目ES32获取mpu9250数据网页交互显示

MPU9250 卡在使用 WOM 的 ESP8266 的复位循环中

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

[Motion]MPU9250的Motion Driver

[Motion]MPU9250的基本框架