【问题标题】:Read data from ADXL355 using python SPI interface on raspberry pi使用树莓派上的 python SPI 接口从 ADXL355 读取数据
【发布时间】:2019-12-03 15:17:23
【问题描述】:

我正在尝试从评估板 EVAL-ADXL355-PMDZ 读取加速度数据。该板连接到在raspbian 上运行的树莓派 4。该电路连接到树莓派中的标准 SPI 引脚(4 线),但芯片选择 (CS) 连接到空闲引脚之一 (12)。

为了测试电路板,我编写了以下代码,使用 spidev 与芯片进行通信,并使用 RPi.GPIO 进行芯片选择:

#!/usr/bin/env python3.7

import time
import spidev
import RPi.GPIO as gpio

pin = 12

gpio.setwarnings(False) # stop warnings when the script runs multiple times
gpio.setmode(gpio.BCM)
gpio.setup(pin, gpio.OUT)

spi = spidev.SpiDev()
spi.open(0,0)
spi.mode = 3
spi.max_speed_hz = 5000000

READBIT = 0x01
WRITEBIT = 0x00

def check_adxl355(pin):
    '''gets true if DEVID_MST is 0x1D'''
    address  = 0x01 << 1 | READBIT
    gpio.output(pin, gpio.LOW)
    id_ = spi.xfer2([address ,0])
    gpio.output(pin, gpio.HIGH)
    return id_[1] == 0x1D

def configure_adxl355(pin):
    '''configure the accelerometer '''
    RANGE = 0x2C << 1 | WRITEBIT
    gpio.output(pin, gpio.LOW)
    o_ = spi.xfer2([RANGE, 0x01]) # RANGE_2G
    gpio.output(pin, gpio.HIGH)

    POWER_CTL = 0x2D << 1 | WRITEBIT
    gpio.output(pin, gpio.LOW)
    o_ = spi.xfer2([POWER_CTL, 0x06]) 
    gpio.output(pin, gpio.HIGH)

print("ADXL355 : {}".format(check_adxl355(pin)))
configure_adxl355(pin)

# read data from the ADXL355
AXIS_START = 0x08 << 1 | READBIT
while 1:
    gpio.output(pin, gpio.LOW)
    axisBytes = spi.xfer2([AXIS_START, 0, 0, 0, 0, 0, 0, 0, 0, 0])[1:] # read 9 bytes
    gpio.output(pin, gpio.HIGH)

    X = (axisBytes[0] << 16 | axisBytes[1] << 8 | axisBytes[2]) >> 4
    Y = (axisBytes[3] << 16 | axisBytes[4] << 8 | axisBytes[5]) >> 4
    Z = (axisBytes[6] << 16 | axisBytes[7] << 8 | axisBytes[8]) >> 4

    print(">> {} {} {}".format(X, Y, Z))

    time.sleep(1)

一般来说,它的作用是配置加速度计和树莓派之间的通信,通过锁定在 mems id 寄存器(check_adxl355)检查 ADXL355 是否连接到引脚 12,配置范围加速度计 (configure_adxl355) 并从 FIFO 寄存器读取样本。运行之前的代码时,结果如下:

pi@raspberrypi:~/adxl355spi $ ./adxl355.py
ADXL355 : True
>> 0 0 0
>> 0 0 0
...

第一个块看起来没问题,因为它报告找到了加速度计,之后不检查加速度计的配置,最后读取加速度数据的块 (X, Y, Z) 仅返回 0,即使加速度计正在移动。

谁能在读取加速度数据时发现问题?

【问题讨论】:

  • 你试过github.com/nuclearfutureslab/adxl355-pi的示例代码了吗?作者提到他的解决方案应该有效,所以我猜它也可能对您有用。将其与正在运行的解决方案进行比较时,也许您可​​以更容易地发现错误。或者至少您可以排除传感器损坏的可能性。
  • 是的,我尝试使用这些示例,但它们不起作用,而且它们使用的引脚与 CS 不同,这就是我使用 RPi.GPIO 的原因
  • @Juan,我不明白你为什么设置 spi.mode = 3。ADXL355 数据表说 (CPOL) = 0 和时钟相位 (CPHA) = 0,所以 spi.mode 应该是 0。 (另一方面,对于 ADXL345,CPOL/CPHA = 1/1,因此 spi.mode 应设置为 3)。

标签: python raspberry-pi accelerometer spi


【解决方案1】:

为了调试这样的问题,您需要从检查硬件通信级别开始,因为 SPI 协议对长线 [>1m] 很敏感,您需要知道在这个级别上是否一切正常。 使用saleae 之类的逻辑分析仪。

另请注意,ADXL 传感器以具有problems 而闻名。

几年前,由于这两个问题,我已经失去了几个晚上。

【讨论】:

    【解决方案2】:

    我已经使用过这些传感器,它们真的很痛苦!

    看看over here。有人已经在 python 中创建了一个库,以便将此传感器与 RPi 上的 SPI 总线结合使用。基本上这正是你所需要的。您可以将 gpio.output(pin, gpio.LOW)gpio.output(pin, gpio.HIGH) 语句复制到该库的 read_data 函数中,或者将其连接到 pi 上的引脚 24(如库文档建议的那样)并查看是否有效。

    此外,从 adxl355.py 文件中,我可以看到您对数据的解释不同:

    # Join data
    x_data = (x_data[0] >> 4) + (x_data[1] << 4) + (x_data[2] << 12)
    y_data = (y_data[0] >> 4) + (y_data[1] << 4) + (y_data[2] << 12)
    z_data = (z_data[0] >> 4) + (z_data[1] << 4) + (z_data[2] << 12)
    
    # Apply two complement
    if x_data & 0x80000 == 0x80000:
        x_data = ~x_data + 1
    
    if y_data & 0x80000 == 0x80000:
        y_data = ~y_data + 1
    
    if z_data & 0x80000 == 0x80000:
        z_data = ~z_data + 1
    

    也许您只是对数据的解释有误,请尝试上述方法,看看是否能解决问题。否则我会建议切换到使用该库。即使它是暂时的,它也可以帮助您找出您的代码出了什么问题。

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多