我正在尝试从评估板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
)的块仅返回{{1 }}即使加速度计正在移动。
有人在读取加速度数据时发现问题吗?
答案 0 :(得分:0)
为了调试此类问题,您需要首先检查硬件通信级别,因为SPI协议对长导线[> 1m]敏感,并且您需要知道在该级别是否一切正常。 使用saleae之类的逻辑分析器。
还要注意,ADXL传感器以problems而闻名。
几年前,我因这两个问题迷失了几个晚上。
答案 1 :(得分:0)
我已经使用了这些传感器,它们可能真的很痛苦!
看看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
也许您只是错误地解释了数据,请尝试上述操作并查看是否可以解决问题。否则,我建议切换到使用该库。即使是暂时的,它也可以帮助您找出代码的问题所在。