在树莓派

时间:2019-12-03 15:17:23

标签: python raspberry-pi accelerometer spi

我正在尝试从评估板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 }}即使加速度计正在移动。

有人在读取加速度数据时发现问题吗?

2 个答案:

答案 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

也许您只是错误地解释了数据,请尝试上述操作并查看是否可以解决问题。否则,我建议切换到使用该库。即使是暂时的,它也可以帮助您找出代码的问题所在。