概述
ADXL345是一款低功耗,三轴MEMS加速度计模块,具有I2C和SPI接口。这些模块的Adafruit Breakout板载板载3.3v电压调节和电平转换功能,使其易于与Arduino等5v微控制器接口。
ADXL345具有4个灵敏度范围,从+/- 2G到+/- 16G。它支持10Hz到3200Hz的输出数据速率。
工作原理:
MEMS-微型机电系统传感器由硅晶片上的微机械结构组成。该结构由多晶硅弹簧悬挂,当在X,Y和/或Z轴上受到加速度时,它可以在任何方向上平滑偏转。挠曲会导致固定板和连接到悬挂结构的板之间的电容发生变化。每个轴上的电容变化都会转换为与该轴上的加速度成比例的输出电压。
组装和接线
该板随附所有预焊接的表面贴装组件。随附的接头板可以焊接,以便在面包板上或带有0.1英寸连接器的情况下方便使用。但是,对于承受极高加速度,冲击或振动的应用,建议使用锁定连接器或直接焊接。
组装:
放置标头:如有必要,将标头切成适当大小,然后插入标头-
添加分组讨论:对齐分组讨论板并将其放在面包板上的排针上。
然后焊接!请务必焊接所有引脚以确保良好的电气接触。
I2C接线: ADXL345分支的I2C地址为0x53。只要每个设备具有唯一的地址,它就可以与其他I2C设备共享I2C总线。 I2C通信仅需要4个连接:
GND-》 GND
VIN-》 + 5v
SCL-》 SCL(“经典Arduinos”上的模拟5)
Adafruit分支具有电平转换和调节电路因此您可以从3-5V供电,并为i2c使用3V或5V逻辑电平
编程和校准
:下载并安装ADXL345库。如果尚未安装Adafruit Sensor库,您还将需要它。
本指南将帮助您完成安装过程。
测试:点击“文件-》示例-》 Adafruit_ADXL345-》 sensortest”以从库中加载示例草图。
然后单击编译/上传按钮进行编译并将草图上传到Arduino。您应该看到类似于以下的输出。观察移动木板时值的变化。
校准: ADXL芯片在出厂时已校准精度足以满足大多数用途。对于要求更高精确度的关键应用,您可能希望自己重新校准传感器。
校准不会改变传感器的输出。但是它告诉您在每个轴上的两个方向上,已知的稳定参考力所对应的传感器输出。知道这一点后,您可以根据传感器读数计算出校正后的输出。
重力作为校准参考加速度可以以重力或“ G”为单位进行测量,其中1G表示在地球表面的重力。重力是一个相对稳定的力,可以为地面住宅的接地提供方便和可靠的校准参考。
校准方法:要将传感器校准为重力参考,需要确定每个轴与重力拉力轴精确对齐时的传感器输出。实验室质量校准使用精密定位夹具。这里描述的方法很简单,仅用一块木头就能获得令人惊讶的良好结果。
安装传感器:首先将传感器牢固地安装到模块或盒子上。只要所有侧面成直角,大小都不重要。只要是相当坚硬的材料就不重要。
加载校准草图:加载并运行下面的校准草图。打开串行监视器,等待提示。
将模块定位:
将模块放置在坚固的平面上,例如坚固的桌子上。在串行监视器中键入一个字符,然后按回车键。草图将对该轴进行测量并打印结果。
重新放置块:旋转块,使桌子的另一侧平坦,然后键入另一个键来测量该轴。
重复: 对块的所有六个侧面重复以测量每个轴的正向和负向。
(提示:) 用于被分线板和/或电线遮挡的侧面,将方块按在桌子底部,同时
校准结果:一旦对所有六个面都进行了采样,串行监视器中打印的值将代表每个轴上+/- 1G力的实际测量值。这些值可用于重新缩放读数以提高准确性。
校准草图:
下载:文件
复制代码
#include
#include
#include
/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
float AccelMinX = 0;
float AccelMaxX = 0;
float AccelMinY = 0;
float AccelMaxY = 0;
float AccelMinZ = 0;
float AccelMaxZ = 0;
void setup(void)
{
Serial.begin(9600);
Serial.println(“ADXL345 Accelerometer Calibration”);
Serial.println(“”);
/* Initialise the sensor */
if(!accel.begin())
{
/* There was a problem detecting the ADXL345 。。. check your connections */
Serial.println(“Ooops, no ADXL345 detected 。。. Check your wiring!”);
while(1);
}
}
void loop(void)
{
Serial.println(“Type key when ready.。。”);
while (!Serial.available()){} // wait for a character
/* Get a new sensor event */
sensors_event_t accelEvent;
accel.getEvent(&accelEvent);
if (accelEvent.acceleration.x 《 AccelMinX) AccelMinX = accelEvent.acceleration.x;
if (accelEvent.acceleration.x 》 AccelMaxX) AccelMaxX = accelEvent.acceleration.x;
if (accelEvent.acceleration.y 《 AccelMinY) AccelMinY = accelEvent.acceleration.y;
if (accelEvent.acceleration.y 》 AccelMaxY) AccelMaxY = accelEvent.acceleration.y;
if (accelEvent.acceleration.z 《 AccelMinZ) AccelMinZ = accelEvent.acceleration.z;
if (accelEvent.acceleration.z 》 AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z;
Serial.print(“Accel Minimums: ”); Serial.print(AccelMinX); Serial.print(“ ”);Serial.print(AccelMinY); Serial.print(“ ”); Serial.print(AccelMinZ); Serial.println();
Serial.print(“Accel Maximums: ”); Serial.print(AccelMaxX); Serial.print(“ ”);Serial.print(AccelMaxY); Serial.print(“ ”); Serial.print(AccelMaxZ); Serial.println();
while (Serial.available())
{
Serial.read(); // clear the input buffer
}
} #include
#include
#include
/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
float AccelMinX = 0;
float AccelMaxX = 0;
float AccelMinY = 0;
float AccelMaxY = 0;
float AccelMinZ = 0;
float AccelMaxZ = 0;
void setup(void)
{
Serial.begin(9600);
Serial.println(“ADXL345 Accelerometer Calibration”);
Serial.println(“”);
/* Initialise the sensor */
if(!accel.begin())
{
/* There was a problem detecting the ADXL345 。。. check your connections */
Serial.println(“Ooops, no ADXL345 detected 。。. Check your wiring!”);
while(1);
}
}
void loop(void)
{
Serial.println(“Type key when ready.。。”);
while (!Serial.available()){} // wait for a character
/* Get a new sensor event */
sensors_event_t accelEvent;
accel.getEvent(&accelEvent);
if (accelEvent.acceleration.x 《 AccelMinX) AccelMinX = accelEvent.acceleration.x;
if (accelEvent.acceleration.x 》 AccelMaxX) AccelMaxX = accelEvent.acceleration.x;
if (accelEvent.acceleration.y 《 AccelMinY) AccelMinY = accelEvent.acceleration.y;
if (accelEvent.acceleration.y 》 AccelMaxY) AccelMaxY = accelEvent.acceleration.y;
if (accelEvent.acceleration.z 《 AccelMinZ) AccelMinZ = accelEvent.acceleration.z;
if (accelEvent.acceleration.z 》 AccelMaxZ) AccelMaxZ = accelEvent.acceleration.z;
Serial.print(“Accel Minimums: ”); Serial.print(AccelMinX); Serial.print(“ ”);Serial.print(AccelMinY); Serial.print(“ ”); Serial.print(AccelMinZ); Serial.println();
Serial.print(“Accel Maximums: ”); Serial.print(AccelMaxX); Serial.print(“ ”);Serial.print(AccelMaxY); Serial.print(“ ”); Serial.print(AccelMaxZ); Serial.println();
while (Serial.available())
{
Serial.read(); // clear the input buffer
}
}
典型校准输出:
下载:文件
复制代码
ADXL345 Accelerometer Calibration
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: -1.18 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
ADXL345 Accelerometer Calibration
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 0.00
Accel Maximums: 0.12 0.20 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 0.00 -0.24
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: 0.00 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
Accel Minimums: -1.18 -1.22 -0.27
Accel Maximums: 0.12 1.37 1.14
Type key when ready.。。
校准草图的结果可用于进行两点校准,如下所述:两点校准
库参考
构造函数: Adafruit_ADXL345(int32_t sensorID = -1)
构造ADXL345设备驱动程序对象的实例。 “ sensorID”是设备标识符。每次调用getEvent()时,它将在sensor_event中返回它。 sensorID对驱动程序或设备的操作没有影响,但是在管理具有多个传感器的系统中的传感器事件时很有用。
Initialization() bool begin(void )
begin()函数初始化与设备的通信。如果成功连接到ADXL345,则返回值为‘true’。
传感器详细信息: void getSensor(sensor_t *);
getSensor()函数返回有关传感器的基本信息。有关sensor_t结构的详细信息,请参阅Adafruit Sensor Library的自述文件。
获取并设置操作范围: void setRange(range_t range)
setRange()函数设置传感器的工作范围。较高的值将具有较宽的测量范围。较低的值将具有更高的灵敏度。
有效范围常数为:
ADXL345_RANGE_16_G
ADXL345_RANGE_8_G
ADXL345_RANGE_4_G
ADXL345_RANGE_2_G (默认值)
range_t getRange(void);
getRange()函数返回由setRange()设置的当前工作范围
获取和设置数据速率: void setDataRate(dataRate_t dataRate);
setDataRate()函数设置传感器输出更新的速率。高于100 Hz的速率将显示增加的噪声。低于6.25 Hz的速率将对温度变化更加敏感。有关详细信息,请参见数据表。
有效数据速率常数为:
ADXL345_DATARATE_3200_HZ
ADXL345_DATARATE_1600_HZ
ADXL345_DATARATE_800_HZ
ADXL345_DATARATE_400_HZ
ADXL345_DATARATE_200_HZ
ADXL345_DATARATE_100_HZ
ADXL345_DATARATE_50_HZ
ADXL345_DATARATE_25_HZ
ADXL345_DATARATE_12_5_HZ
ADXL345_DATARATE_6_25HZ
ADXL345_DATARATE_3_13_HZ
ADXL345_DATARATE_1_56_HZ
ADXL345_DATARATE_0_78_HZ
ADXL345_DATARATE_0_39_HZ
ADXL345_DATARATE_0_20_HZ
ADXL345_DATARATE_0_10_HZ (默认值)
dataRate_t getDataRate(void);
getDataRate ()函数返回由setDataRate()设置的当前数据速率。
读取传感器事件: void getEvent(sensors_event_t *);
getEvent()函数以sensor_event的形式返回下一个可用的读数。 sensor_event包含传递给构造函数的sensor_id以及来自加速度计的X,Y和Z轴读数。有关sensor_events的更多信息,请参见Adafruit Sensor Library的自述文件。
Python和CircuitPython
很容易将ADXL343或ADXL345与Python和CircuitPython以及Adafruit CircuitPython ADXL34x模块结合使用。此模块使您可以轻松编写Python代码,以读取中断中的加速度,敲击,运动等信息。
您可以将此传感器与任何CircuitPython微控制器板或具有GPIO和Python的计算机配合使用,谢谢。到我们的CircuitPython-for-Python兼容性库Adafruit_Blinka。
ADXL343和ADXL345略有不同,但是芯片基本相同。此页面包括每个接线图的不同接线图。除了初始化适当的芯片外,两者的代码都相同!
CircuitPython微控制器接线
首先,完全按照上一页中的说明接线。以下是将ADXL343连接到Feather M0的示例:
将羽毛上的 SCL 连接到ADXL343
上的 SCL
将羽毛上的 SDA 连接到ADXL343上的 SDA
将羽毛上的 GND 连接到 ADXL343上的GND
将羽毛上的 3.3V 连接到ADXL343
上的 VIN div》
下面是将ADXL345连接到羽毛M0的示例:
上的 VIN
将羽毛上的 SCL 连接到 ADXL345上的SCL
Connect SDA 羽毛上的ong》到ADXL345中的 SDA
将羽毛上的 GND 连接到ADXL345上的 GND
将羽毛上的 3.3V 连接到ADXL345
Python计算机接线
您可以使用的数十款Linux计算机/主板,我们将显示Raspberry Pi的接线。对于其他平台,请访问Linux上的CircuitPython指南,以了解您的平台是否受支持。
下图显示了连接到ADXL343的Raspberry Pi:
Connect SCL 在ADXL343上将RPi链接到 SCL
在RXL上将RPi链接到 SDA
将Rpi上的 GND 连接到ADXL343上的 GND
将Rpi上的 3.3V 连接到 ADXL343上的VIN
下图显示了连接到ADXL345的Raspberry Pi:
连接 SCL 到ADXL345上的 SCL
将RPi上的 SDA 连接到 SDA 将RPi上的ADXL345
连接 GND 中的音频连接到ADXL345
Connect 3.3V 中的 GND 》在RPi上为 VIN 在ADXL345上
库安装
您需要在CircuitPython板上安装Adafruit CircuitPython ADXL34x库。
首先请确保您的电路板正在运行最新版本的Adafruit CircuitPython。
接下来,您需要安装必要的库以使用硬件-仔细按照以下步骤查找并安装这些库来自Adafruit的CircuitPython库捆绑包。我们的CircuitPython入门指南上有一个很棒的页面,说明如何安装库捆绑包。
对于诸如Trinket M0或Gemma M0的非表达板,您需要从捆绑包中手动安装必要的库:
adafruit_adxl34x.mpy
adafruit_bus_device
在继续之前,请确保您的板的lib文件夹或根文件系统已复制 adafruit_adxl34x.mpy 和 adafruit_bus_device 文件和文件夹。 p》
下一步连接到开发板的串行REPL,因此您在CircuitPython 》》》 提示符下。
ADXL34x库的Python安装
您需要安装 Adafruit_Blinka 库在Python中提供CircuitPython支持。这可能还需要在您的平台上启用I2C并验证您正在运行Python3。由于每个平台都有所不同,并且Linux经常更改,请访问Linux上的CircuitPython指南以准备好您的计算机!
完成后,从命令行运行以下命令:
sudo pip3 install adafruit-circuitpython-adxl34x
如果您的默认Python是版本3,则可能需要改为运行“ pip”。只要确保您不尝试在Python 2.x上使用CircuitPython,就不支持它!
CircuitPython和Python的用法
为演示突破的用法,我们将对其进行初始化,并从开发板的Python REPL中读取加速度以及更多信息。
运行以下代码以导入必要的模块并创建I2C对象:
下载:文件
复制代码
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA) import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
如果您使用的是 ADXL343 ,运行以下命令以使用中断初始化I2C连接:
下载:文件
复制代码
accelerometer = adafruit_adxl34x.ADXL343(i2c) accelerometer = adafruit_adxl34x.ADXL343(i2c)
如果您使用的是 ADXL345 ,请运行以下使用中断初始化I2C连接:
下载:文件
复制代码
accelerometer = adafruit_adxl34x.ADXL345(i2c) accelerometer = adafruit_adxl34x.ADXL345(i2c)
现在,您可以使用以下任意一种方法从突破中读取值并启用突破功能:
加速-x,y和z轴上的加速度值
enable_motion_detection -启用运动检测。允许设置阈值。阈值默认为18。
enable_tap_detection -启用点击检测。允许单次或两次点击检测。
enable_freefall_detection -启用自由落体检测。允许设置阈值和时间。阈值默认为10,时间默认为25。
事件-用于在启用运动检测,敲击检测和自由落体检测时读取事件。需要指定要尝试读取的事件。
要打印加速度值:
下载:文件
复制代码
while True:
print(accelerometer.acceleration)
time.sleep(0.2) while True:
print(accelerometer.acceleration)
time.sleep(0.2)
这就是使用CircuitPython从ADXL343和ADXL345读取加速度值的全部内容!
完整示例代码
下载:Project Zip 或 adxl34x_simpletest.py | 在Github上查看
复制代码
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
# For ADXL343
accelerometer = adafruit_adxl34x.ADXL343(i2c)
# For ADXL345
# accelerometer = adafruit_adxl34x.ADXL345(i2c)
while True:
print(“%f %f %f” % accelerometer.acceleration)
time.sleep(0.2)
import time
import board
import busio
import adafruit_adxl34x
i2c = busio.I2C(board.SCL, board.SDA)
# For ADXL343
accelerometer = adafruit_adxl34x.ADXL343(i2c)
# For ADXL345
# accelerometer = adafruit_adxl34x.ADXL345(i2c)
while True:
print(“%f %f %f” % accelerometer.acceleration)
time.sleep(0.2)
运动,轻击和自由落落
有一些启用和使用运动,轻击和自由落落的示例在GitHub上:
在ADXL343和ADXL345上进行运动检测
在ADXL343和ADXL345上进行抽头检测
在ADXL343和ADXL345上进行自由落体检测
将任何文件另存为CircuitPython板上的 code.py ,或从Python运行在您的Linux计算机上进行REPL,以进行尝试。
下载
文件
ADXL345数据表
Adafruit Fritzing库中的Fritzing对象
GitHub上的EagleCAD PCB文件
示意图和构造打印
责任编辑:wv
-
加速度计
+关注
关注
6文章
696浏览量
45846 -
ADXL345
+关注
关注
13文章
69浏览量
33812
发布评论请先 登录
相关推荐
评论