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

关键词MPU9250I2CESP32软件I2C

esp32输出电压_stm32


 

§01 MPU9250


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

esp32输出电压_物联网_02


▲ 图1.1.0 MPU9250 模块


一、基本信息

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

1、芯片信息

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

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

2、模块接口

esp32输出电压_esp32输出电压_03


▲ 图1.1.1 模块接口




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


序号

名称

功能

PIN1

GND

电源地

PIN2

3V3

3.3V电源

PIN3

SCL/SCK

I2C/SPI 时钟信号

PIN4

SDA/SDI

I2C数据信号;SPI数据输入

PIN5

AD0/SDO

I2C地址选择(1101001);SPI数据输出

PIN6

CS

片选信号

PIN7

INT1

终端数字输出信号

PIN8

FSYNC

数字同步输入帧,若不同接地

(1) I2C接口


I2C地址:

AD0=0:1101000


AD0=1:1101001


(2) SPI接口

esp32输出电压_esp32输出电压_04


▲ 图1.1.2 SPI 接口时序特性


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

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

esp32输出电压_esp32输出电压_05


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


esp32输出电压_stm32_06


▲ 图1.1.4 I2C总线使用模式


二、上电测试

1、接口上拉电阻

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

2、端口配置


MP9255模块端口:

A0: GND


CS: 3.3V


FSYNC:GND


INT:NULL


esp32输出电压_esp32输出电压_07


▲ 图1.2.1 配置模块端口


 

§02 ESP32测试


一、基本测试

1、管脚配置

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

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


ESP32I2C管脚:

SCL:IO2


SDA:IO15


esp32输出电压_物联网_08


▲ 图2.1.1 I2C管脚配置


◎ 注:

esp32输出电压_物联网_09


▲ 图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 数据手册 下载链接。

  • 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 的加速度以及陀螺仪的数据。

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