micropython-mpu9x50, 一种 InvenSense MPU9250惯性测量单元的驱动

分享于 

11分钟阅读

GitHub

  繁體 雙語
A MicroPython driver for the InvenSense MPU9250 inertial measurement unit for ESP8266
  • 源代码名称:micropython-mpu9x50
  • 源代码网址:http://www.github.com/micropython-IMU/micropython-mpu9x50
  • micropython-mpu9x50源代码文档
  • micropython-mpu9x50源代码下载
  • Git URL:
    git://www.github.com/micropython-IMU/micropython-mpu9x50.git
    Git Clone代码到本地:
    git clone http://www.github.com/micropython-IMU/micropython-mpu9x50
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/micropython-IMU/micropython-mpu9x50
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    到目前为止,这个 repo 包含:

    • vector 3d - 用于IMU设备的向量类
    • imu - MPU9x50设备的基类。 支持 MPU6050.
    • MPU9150 - 用于MPU9150的类
    • MPU9250 - 用于MPU9250的类

    最后,vector 3d将被旋转为其他imu设备驱动程序的共同起点。
    这里可以找到 mpu9150/mpu6050的文档。

    模块 mpu9250

    MPU9250是 InvenSense MPU9250传感器的micropython模块。 它可以测量加速度,转速和三个轴的磁场。
    Breakout: Drotek

    MPU9150 ( 有制造状态"相比,MPU9250有许多优点不推荐用于新的设计")。 磁强计可以连续运行,在 100赫兹处更新。 它支持加速度计和陀螺仪的分离滤波器。 breakout更便宜。 它还支持 SPI,但是这个驱动程序假定一个I2C连接。

    简介

    MPU9250是一个双芯片模块,由 AsahaiKASEI AK8963芯片提供磁强计。 因此磁强计的坐标系与其他组件的坐标系不一致。 这个驱动程序修正了这一点,使每个仪器的轴与加速度计的对应。

    由于驾驶员很可能与传感器融合模块,因此传感器相对于车辆的定位是非常重要 is。 Madgwick算法假设x 指向车辆的前面,y 是右的,z 是向下的。 为了适应传感器垂直安装到这种方向的情况,提供了反转和旋转轴的支持。 驾驶员返回车辆相对坐标。

    将传感器连接到 pyboard

    MPU9250芯片不支持 5V 操作,但是Drotek板有一个电压调节器,因此可以从 3.3或者 5 V 供电。

    pyboard mpu9250
    VIN3V3
    地地地地
    SCLSCL
    SDASDA

    快速入门

    示例假定连接到Pyboard上的'x'i2c接口的MPU9250:

    from mpu9250 importMPU9250imu = MPU9250('X')print(imu.accel.xyz)print(imu.gyro.xyz)print(imu.mag.xyz)print(imu.temperature)print(imu.accel.z)
    模块

    使用驱动程序,只需要导入mpu9250模块并使用 MPU9250 类。

    mpu9250

    MPU9250
    MPU9250传感器的类。
    MPUException
    这将在发生I2C错误时引发。 它是由 python OSError 导出的。

    imu

    InvenSenseMPU
    InvenSense惯性测量单元的基类。

    vector 3d

    Vector3d
    3D 矢量的类。 这在 vector3d.md. 中记录

    MPU9250类

    类具有返回 vector 3d实例的各种属性。 vector 3d的主要属性是返回向量和 xyzxyz 返回的组件,后者返回组件的( x,y,z )的3-tuple。 它还支持对车辆相对坐标进行校准和转换。

    方法

    MPU9250() 构造函数支持下列参数

    • side_str'x'或者'y'( 强制) 定义使用的I2C接口。 或者可以通过初始化的I2C对象。
    • 可以使用 device_addr 0或者 1 ( 可选) 两个设备与AD0引脚上的电压确定的地址一起使用。 如果仅使用一个设备,则在自动检测设备时,此参数可能为无。
    • 换位( 可选) 使轴可以转换为( 请参见下面)。
    • 缩放( 可选) 使轴可以反转为( 请参见下面)。

    转换和缩放的默认设置将导致驱动程序返回传感器相对结果。

    wake()
    唤醒设备

    sleep()
    将设备设置为睡眠模式

    get_accel_irq()
    get_gyro_irq()
    get_mag_irq()
    这些方法有些实验性。 它们可以从中断回调中调用,并仅更新相关 vector 3d对象的整数属性。 当前编写非常规的MicroPython中断回调是一种黑色艺术,因为堆可能会被调用,导致异常。

    主要属性

    sensors
    返回三个 vector 3d对象。加速度计。陀螺仪和磁力计。

    accel_range 整数 0至 3读/写
    返回或者设置当前的加速度计范围: 这将根据以下表确定加速度计的全量程范围。 注意,从驱动程序的x,y,z 值被缩放到g的单位,而不是选定的范围。 范围仅影响全局性能和分辨率。

    范围值( +-g )
    02
    14
    28
    316

    gyro_range 整数 0至 3读/写
    根据下面的表确定陀螺的全刻度范围。 注意,驱动程序的x。y。z 值被缩放为 degs/s的单位,而不考虑所选的范围。 范围仅影响全局性能和分辨率。

    范围值 +- degs/秒
    0250
    1500
    21000
    32000

    temperature 浮点只读
    以摄氏度返回芯片温度

    accel vector 3d实例只读
    返回保存当前加速度计数据的Vector3d。 单位是g。

    gyro vector 3d实例只读
    返回保存当前陀螺数据的Vector3d。 单位度/单位。

    mag vector 3d实例只读
    返回保存当前磁强计数据的Vector3d。 按照这里驱动程序配置,MPU9250以 10mS 个间隔读取磁强计。 单位为( microtesla )。

    访问 vector 3d实例x,y,z 或者xyz属性将导致读取设备并返回最新数据。 如果磁强计被访问,在 10mS 和unit更新后再次访问,旧数据将被返回,计数器会被增加。 第一次获取新数据和读取数据时,将清除计数器。

    当磁强计读取最近的数据时,vector 3d实例将返回最新的有效数据和增量 mag_stale_countmag_stale_count ( 如果读取速率低于 100赫兹,则为任意非零值)的高值表示错误条件。

    mag_stale_count 整数只读
    如上所述:驱动程序返回out-of-date值的连续读取序列中的连续次数数。

    accel_filter_range 整数 0至 7读/写
    数字低通滤波器使加速度计读数中的振动效果降低。 下表给出了滤波器的近似带宽和延迟。

    值 bw(Hz) 延迟( 毫秒)
    04601.94
    11845.8
    2927.8
    34111.8
    42019.8
    51035.7
    6566.96
    74601.94

    注意:在我的测试选项 7中产生了垃圾。

    gyro_filter_range 整数 0至 7读/写

    数字低通滤波器使陀螺读数中的振动效果降低。 下表给出了滤波器的近似带宽和延迟。

    值 bw(Hz) 延迟( 毫秒)
    02500.97
    11842.9
    2923.9
    3415.9
    4209.9
    51017.85
    6533.48
    736000.17

    请参见下面的"其他MPU9250属性"。

    中断回调中的

    MicroPython中断回调禁止使用堆,它排除了许多标准 python 技术,包括异常处理和浮点数据的使用。 目前,代码是否会使用堆并不总是显而易见的,因此任何使用这些技术的方法都应该被考虑。 以下MPU9250方法提供对设备的访问,该设备必须在回调中执行。

    get_accel_irq()
    get_gyro_irq()
    get_mag_irq()
    这些方法读取设备并更新 vector 3d对象的整数值。 这些值直接从设备中保存未跳过的值,因这里坐标是设备相对且没有校准。校正或者。

    注意,加速度计和陀螺仪的缩放因子只依赖于选定的范围,因这里可以在回调中编码。 为了从磁强计获得最准确的读数,工厂设置修正应应用。 这些在属性 mag_correction 中,但浮点值不能在回调中使用。 选项( 取决于应用程序) 在回调之外应用它们,或者在初始化代码中将它们转换为缩放整数。

    请参见测试/irqtest。py示例代码。

    其他MPU9250属性

    passthrough 布尔读取/写入
    设置直通模式。默认情况下激活( true )。 这需要激活,以使磁强计界面链接到 ipqos,SCL垫。

    sample_rate 8位整数读/写
    确定传感器寄存器的更新速率。 值应在 0到 255范围内。 更新速率由速率= internal_sample_rate/( 1 + sample_rate ) 给出。 由于这里驱动程序支持的功能子集,因这里你可以能希望从零默认值更改这个子集。

    mag_correction 浮点 3 -tuple
    保存工厂设置磁强计校正值。

    chip_id
    芯片( 113 )的ID在传感器上硬编码。 读取这里属性将通过读取返回给用户的值来测试与IMU的通信。 如果值不正确,将引发 ValueError。

    mpu_addr
    加速度计和陀螺仪的I2C地址。

    mag_addr
    磁强计的I2C地址。

    timeout
    I2C操作超时。

    异常处理

    错误值,例如

    imu = MPU9250('Z')

    将产生有意义的错误消息的ValueError。
    当任何与IMU通信发生的情况下,I2C总线就可以锁定。 这通常是硬件故障造成的,例如设备连接不正确或者导线太长。 在这里实例中,将使用dscriptive消息引发自定义 MPUException。 这是从 python的OSError派生的: 用户可能在希望继续操作的希望中。 在我的经验中,这种情况很少发生: 如果需要I2C总线才能清除电源周期,则需要将它的清除。

    校准演示
    >>>from mpu9250 importMPU9250>>> a = MPU9250('x')>>> a.mag.cal
    (0, 0, 0)>>>import pyb>>> sw = pyb.Switch()>>> a.mag.calibrate(sw) # User rotates unit about each axis then presses the Pyboard switch>>> a.mag.cal
    (35.30567, 18.92022, -9.428905)>>>

    相关文章