用I2c总线读取陀螺仪值

2024-06-13 07:57:41 发布

您现在位置:Python中文网/ 问答频道 /正文

产品:https://www.adafruit.com/product/2020

数据表:https://cdn-shop.adafruit.com/datasheets/LSM9DS0.pdf

我是学生,这是我第一次使用I2c总线。我试着读取陀螺仪的基本值。我浪费了我生命的一部分来理解I2c是如何工作的。但是在阅读了数据表之后,我做了自己的脚本。 我的价值观就在那里。什么都不动,我也不知道为什么。在

Rotation in X-Axis : -1087
Rotation in Y-Axis : -28797
Rotation in Z-Axis : -15032

这是我的剧本。有人能帮我解决吗?我在和一只小猎犬一起工作。在

^{pr2}$

Tags: inhttpsadafruitcom产品wwwcdni2c
2条回答

根据datasheet,LSM9DS0包含两个子模块:一个包含加速度计和罗盘,另一个包含陀螺仪。每个子模块位于不同的地址,由SA0_XMSA0_G管脚的状态决定。在

Tables 15 and 16 from the datasheet

Adafruit module上,这些引脚被拉高,因此根据数据表中的表15和表16:

  • 加速计和罗盘在地址0x1d00011101
  • 陀螺仪在地址0x6b01101011

基于此,看来你访问的地址是正确的。这也意味着在脚本开始的时候,应该定义一些常量,比如

ACCEL_ADDRESS = 0x1d
GYRO_ADDRESS = 0x6b

使用这些而不是在你的代码周围复制魔法数字。在


现在寄存器地址。由于有两个不同的设备,所以很有可能每个设备都公开一组不同的寄存器。实际上,表17显示了这种情况,尽管有点间接。重要的部分是标题为“从地址”的列,它指的是表15(加速计和罗盘)或表16(陀螺)。(在某些情况下,寄存器的符号名可能有助于区分不同之处,因为它们通常有后缀M(前一个)或{}(后一个),但并不总是这样)。在

Table 17

你的问题就在这里。对于陀螺仪,测量值在地址0x28..0x2d的寄存器中

Gyroscope registers

然而,您正在从0x08..0x0d中读取,这些内容保留在陀螺仪模块中(由于读取结果而得到一些固定的废话,这不会是意外的)。在

您似乎正确地获得了控制寄存器CTRL_REG1_G和{}。在

当然,与地址一样,您应该为要使用的所有寄存器定义常量:

^{pr2}$

等等。。。在


另外,在实际读取测量值之前,我首先要尝试的是读取设备标识寄存器,在本例中是WHO_AM_I_G(0x0F)。在

Device identification register

由于这个寄存器返回一个常量,所以这是一个很好的方法来验证您正在使用正确的设备进行通信,以及通信是否正常工作。在


还有一点:不要复制粘贴代码,而是使用函数。在

例如,重构的第一步可能会产生如下结果:

def read_int16(bus, device, register):
    lsb = bus.read_byte_data(device, register)
    msb = bus.read_byte_data(device, register + 1)

    result = msb * 256 + lsb
    return (result - 65536) if (result > 32767) else result


xGyro = read_int16(bus, GYRO_ADDRESS, OUT_X_L_G)
yGyro = read_int16(bus, GYRO_ADDRESS, OUT_Y_L_G)
zGyro = read_int16(bus, GYRO_ADDRESS, OUT_Z_L_G)

有许多i2c出版物可以让您了解它是如何工作的。大多数陀螺仪和mems设备也基本上在他们的数据表中解释了这一点。但基本上是两条线,有逻辑高电平和逻辑低电平。消息通常以8位段发送。为了发送一个段,时钟线变低,然后数据转换到要发送的级别。数据线必须稳定,然后时钟就会变高。时钟变高时的数据电平是位0(数据低)或1(数据高)。首先发送设备的8位地址(实际上是7位地址,最后一位是信号读或写)。通常要写,你先发送读,然后中断,然后写。读取时,设备地址发送后,接下来的8位或16位是寄存器地址。然后设备将发送信息。写作也是如此。一些mems设备有fifo寄存器和中断,这可能有点不同。有关详细信息,请参阅各自的数据表。在

相关问题 更多 >