在这个Raspberry Pi加速度传感器项目中,我记录了下如何用Raspberry Pi驱动ADXL345加速度传感器,还展示了如何编程一个Python脚本来与它交互。
ADXL345是一款采用I2C和SPI串行接口的低功耗、3轴(可跟踪X、Y和Z加速度)MEMS加速度传感器。
MEMS是微电子机械系统的意思,它有一个微观组件,用于计算传感器感受到的加速度。
因为支持I2C和SPI串行协议,Raspberry Pi可以很方便地以ADXL345交互,因为不需要任何额外的硬件来解析来自加速度传感器的数据。
Raspberry Pi还有很多其他的传感器,可以和这个加速度计一起使用。例如,距离传感器在测量传感器与物体的距离方面会很好。
设备清单
以下是在树莓派上设置ADXL345加速度计所需的所有设备,点击链接直达优惠购买
建议
可选
树莓派ADXL345加速度传感器配置
在这部分教程中,将展示如何将数字ADXL345加速度计连接到树莓派。
ADXL345是一个数字传感器,所以不需要额外的电路,如模拟到数字转换器。数字传感器可以直接连接到树莓派上。
下面请跟随指南来看看如何设置Raspberry Pi与ADXL345加速度计吧。
ADXL345加速度传感器电路
下面包括了两种方法来展示如何将加速度计连接到Raspberry Pi。
可以按照图示或利用文字步骤了解需要使用的电线和GPIO引脚。
- 将加速度计的GND引脚连接到树莓派的物理引脚6(GND)。
- 将加速计的VCC引脚连接到Raspberry Pi的物理引脚1(3v3)。
- 将加速度计的SDA引脚连接到树莓派的物理引脚3(SDA)。
- 将加速度计的SCL引脚连接到树莓派的物理引脚5(SCL)。
配置Raspberry Pi与加速度传感器交互
1. 在Raspberry Pi从ADXL345加速计中读取数据之前,必须对Pi的配置进行一些更改。
首先,让运行以下两个命令来确保所有软件包都是最新的。
sudo apt-get update
sudo apt-get upgrade
2. 当Raspberry Pi完成更新后,需要启动Raspberry配置工具,这样就可以在Raspberry Pi上启用I2C。
运行以下命令启动 raspi 配置工具。
sudo raspi-config
3. 在这个屏幕上,导航到 “5 Interfacing Options“菜单。
可以使用箭头键来浏览 raspi-config 工具菜单。使用 ENTER 键选择特定选项。
4. 现在在接口选项菜单中选择 “P5 I2C”。
当被问是否要启用ARM I2C接口时,选择”<YES>”。
5. 启用I2C接口后,需要通过运行以下命令重新启动Raspberry Pi。
sudo reboot
6. 现在已经启用了I2C并重新启动了Raspberry Pi,可以安装依赖包来与加速度传感器交互了。
运行以下命令进行安装。
sudo apt-get install python3-dev python3-pip python3-smbus i2c-tools -y
6. 安装了所有所需的软件包后,现在检查一下Raspberry Pi是否能看到ADXL345加速度计。
可以运行以下命令来实现。
sudo i2cdetect -y 1
从这个命令中,应该看到命令行上显示了相当多的内容。在这个结果中,至少应该看到一个数字,如 “53”。
如果什么都没有出现,请确保已经将ADXL345加速度计正确连接到Raspberry Pi,并且传感器引脚上的所有焊接点都是干净的。如果看到错误,请尝试重新启用I2C。
编写Python脚本以与ADXL345加速度计交互
1. 现在需要的包都已经安装到树莓派上了,可以编写一个小的Python脚本。这个脚本是为了能够从加速度计中读取信息。
为了与ADXL345交互,需要利用Adafruit的ADXL34x Python库,运行以下pip命令。
sudo pip3 install adafruit-circuitpython-ADXL34x
2. 安装好库后,现在可以继续编写Python脚本。
通过运行以下命令写入这个文件。
nano ~/accelerometer.py
3. 在新脚本中,写下以下几行代码:
import time
先导入 “time “库,利用 “time “库,可以让脚本短时间内进入睡眠状态。
import board
这里导入Adafruit的 “board
“库。这个独特的库是为了了解设备上有哪些引脚可用。
因此,可以使用类似 “board.scl “这样的东西来代替指定一个特定的引脚,这将返回当前微控制器的正确引脚。在我的例子中,是Raspberry Pi。
import busio
接下来,导入Adafruit的 “busio “模块。这个模块包含各种不同的库来处理各种串行协议。使用该模块库来处理I2C串行协议。
import adafruit_adxl34x
现在导入 “adafruit_adxl34x “库。这个库包含了从ADXL345加速度计中读取信息所需的所有代码,并让操作变得非常简单。
i2c = busio.I2C(board.SCL, board.SDA)
在这里,利用 “busio “库为当前板子的SCL和SDA引脚准备一个I2C连接。将句柄存储到 “i2c “变量中。
accelerometer = adafruit_adxl34x.ADXL345(i2c)
现在将ADXL345库实例化到 “accelerometer“对象中。利用这个对象来读取和获取传感器的信息。在库的构造函数中,传递I2C句柄。
while True:
print("%f %f %f"%accelerometer.acceleration)
time.sleep(0.5)
在这里,使用 “while True: “开始一个无限循环。
在这个无限循环中,打印出X、Y和Z加速度值,这些值是由库从加速度计中读取出来的。
打印出X、Y和Z值后,让脚本休眠半秒。
4. 加速计代码的最终版本应该是下面这个样子。请对照这个检查你的最终代码。
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
accelerometer = adafruit_adxl34x.ADXL345(i2c)
while True:
print("%f %f %f"%accelerometer.acceleration)
time.sleep(1)
所有都妥当之后,可以按CTRL+X然后按Y然后按ENTER键来保存它。
5. 现在代码已经完成了,运行下面的命令来运行这个脚本。
python3 ~/accelerometer.py
6. 通过运行这段代码,应该开始看到从加速度计读入的数值。
0.117680 0.313813 8.355266
0.117680 0.313813 8.394492
0.117680 0.313813 8.355266
0.117680 0.353039 8.316039
0.117680 0.431493 8.316039
0.117680 0.313813 8.276813
7. 现在知道加速度计正在返回数据,而且树莓Pi正在正确读取,可以探索ADXL345库的一些其他功能。
探索ADXL345加速度计库
1. 在本节Raspberry Pi加速度计教程中,看看Adafruit的ADXL345加速度计库提供的其他一些功能。
特别关注库在启用时可以自动检测的 “events“。
首先,使用下面的命令打开 “accelerometer.py “脚本。
nano ~/accelerometer.py
2. 在该文件中,找到并添加如下所示的行。
寻找
accelerometer = adafruit_adxl34x.ADXL345(i2c)
在上一行下面加上以下几行:
accelerometer.enable_freefall_detection(threshold=10, time=25)
这一行使库中的自由落体检测事件得以实现,它需要两个变量,一个是阈值,另一个是时间。它需要两个变量,一个是阈值,另一个是时间。
阈值是指所有轴上的加速度必须低于该值才能认为是下降。比例系数是62.5毫克,所以我的例子是10*62.5=625毫克。
接下来,时间变量是指所有轴上的加速度必须小于阈值的时间,这样的情况被识别为下降。比例系数是5ms,所以我的例子是25×5=125ms。
accelerometer.enable_motion_detection(threshold=18)
这一行启用了库中的运动检测事件。它接收一个变量,即阈值。
阈值变量是所有轴上的加速度必须超过的值,才能检测到运动。如果你发现这个值太敏感或不够敏感,你可以修改这个值。比例系数是62.5毫克,所以我们的例子是18*62.5=1125毫克。
accelerometer.enable_tap_detection(tap_count=1, threshold=20, duration=50, latency=20, window=255)
这一行是启用了库敲击检测功能
tap_count 变量是指想检测单次敲击还是两次敲击。设置为1代表单次分接,2代表两次分接。
接下来是阈值变量,这是希望检测的灵敏度,数值越高,代码检测的灵敏度就越低。和其他阈值变量一样,系数是62.5毫克。
持续时间变量是指运动发生的时间长度(纳秒)。如果运动的持续时间过长,则不会被检测为轻敲。该值需要以毫秒为单位。
现在,延迟变量是初始脉冲后开始寻找第二个分接的时间长度。延时值的单位应该是ms。
最后,window 变量是代码寻找第二个敲击的时间长度。同样,这个值的单位应该是 ms。
寻找
print("%f %f %f"%accelerometer.acceleration)
在下面增加以下几行
print("Dropped: %s"%accelerometer.events["freefall"])
print("Tapped: %s"%accelerometer.events['tap'])
print("Motion detected: %s"%accelerometer.events['motion'])
这些额外的行打印出在脚本中之前激活的所有事件的状态。这些打印行让我们知道当前是否有事件被触发。
通常情况下,不会在同一时间检查所有这些事件。
3. 在对加速度计代码做了所有修改后,它应该有点像我下面的代码。
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
accelerometer = adafruit_adxl34x.ADXL345(i2c)
accelerometer.enable_freefall_detection(threshold=10, time=25)
accelerometer.enable_motion_detection(threshold=18)
accelerometer.enable_tap_detection(tap_count=1, threshold=20, duration=50, latency=20, window=255)
while True:
print("%f %f %f"%accelerometer.acceleration)
print("Dropped: %s"%accelerometer.events["freefall"])
print("Tapped: %s"%accelerometer.events['tap'])
print("Motion detected: %s"%accelerometer.events['motion'])
time.sleep(0.5)
都写好后,可以按CTRL + X,然后按Y,然后按ENTER键来保存它。
4. 现在代码已经完成,运行下面的命令来运行这个脚本。
python3 ~/accelerometer.py
5. 运行这段代码,应该开始看到文本被打印到命令行,显示收到的X、Y、Z位置以及所有事件的状态。
0.235360 0.353039 8.355266
Dropped: False
Tapped: False
Motion detected: False
完成了这一切,你现在应该对如何将ADXL345加速度计与Raspberry Pi一起使用有了一定的了解。
希望这篇Raspberry Pi加速度传感器的教程能够告诉你设置ADXL345的所有基础知识。如果你有任何问题和反馈,请不要犹豫,在下面留言。
欢迎转载,请留下出处链接:Labno3 » 树莓派如何测量加速度,使用ADXL345加速度传感器