【发布时间】: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