驴友花雕 发表于 2022-5-12 16:19:58

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块

ADXL345三轴加速度传感器模块的实物照片

驴友花雕 发表于 2022-5-14 09:00:07

本帖最后由 驴友花雕 于 2022-5-14 09:02 编辑

程序七:使用ADXL345_WE 库的活动/非活动中断功能(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序七:使用ADXL345_WE 库的活动/非活动中断功能
Arduino------ADXL345
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/

#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D
const int int2Pin = 2;
volatile bool in_activity = false; // 活动或不活动中断发生

/* 有几种方法可以创建您的 ADXL345 对象:
   ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
   ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
   ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
   ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
*/

ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);

void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(int2Pin, INPUT);
Serial.println("ADXL345 - 活动和不活动中断");
Serial.println();
if (!myAcc.init()) {
    Serial.println("ADXL345 未连接!");
}

/* 插入来自 ADXL345_calibration.ino 的数据并取消注释以获得更精确的结果*/
// myAcc.setCorrFactors(-266.0, 285.0, -268.0, 278.0, -291.0, 214.0);

/* Choose the data rate         Hz
      ADXL345_DATA_RATE_3200    3200
      ADXL345_DATA_RATE_1600    1600
      ADXL345_DATA_RATE_800      800
      ADXL345_DATA_RATE_400      400
      ADXL345_DATA_RATE_200      200
      ADXL345_DATA_RATE_100      100
      ADXL345_DATA_RATE_50      50
      ADXL345_DATA_RATE_25      25
      ADXL345_DATA_RATE_12_5      12.5
      ADXL345_DATA_RATE_6_25       6.25
      ADXL345_DATA_RATE_3_13       3.13
      ADXL345_DATA_RATE_1_56       1.56
      ADXL345_DATA_RATE_0_78       0.78
      ADXL345_DATA_RATE_0_39       0.39
      ADXL345_DATA_RATE_0_20       0.20
      ADXL345_DATA_RATE_0_10       0.10
*/
myAcc.setDataRate(ADXL345_DATA_RATE_25);
Serial.print("数据速率:");
Serial.print(myAcc.getDataRateAsString());

/* 选择测量范围
      ADXL345_RANGE_16G    16g
      ADXL345_RANGE_8G      8g
      ADXL345_RANGE_4G      4g
      ADXL345_RANGE_2G      2g
*/
myAcc.setRange(ADXL345_RANGE_4G);
Serial.print(" /g 范围: ");
Serial.println(myAcc.getRangeAsString());
Serial.println();

attachInterrupt(digitalPinToInterrupt(int2Pin), in_activityISR, RISING);

/* 必须为活动设置三个参数:
      1.直流/交流模式:
          ADXL345_DC_MODE - 阈值是定义的(参数 3)
          ADXL345_AC_MODE - 阈值 = 启动加速度 + 定义的阈值
   2. 轴,考虑:
          ADXL345_000-没有轴(没有意义)
          ADXL345_00Z-z
          ADXL345_0Y0-y
          ADXL345_0YZ-y,z
          ADXL345_X00-x
          ADXL345_X0Z-x,z
          ADXL345_XY0-x,y
          ADXL345_XYZ-所有轴
   3. 以 g 为单位的阈值
*/

myAcc.setActivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 0.5);

/* 在活动中必须设置四个参数:
    1.直流/交流模式:
      见活动参数
    2. 轴,考虑:
      见活动参数
    3. 以 g 为单位的阈值
    4. 以秒为单位的不活动时间阈值(最大 255)
*/

myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 0.5, 10.0);

/* 仅当同时使用活动和不活动时,设置链接位才有意义
    如果未设置链接位:
    - 活动中断可以随时多次触发
    - 如果不活动参数可以触发不活动。满足,独立于活动参数。 (如果使用)
    如果设置了链接位:
    - 活动中断只能在非活动中断后触发
    - 在下一个非活动中断发生之前,只能触发一个活动中断
*/
// myAcc.setLinkBit(true);

/* 你可以选择以下中断:
   变量名:触发,如果:
    ADXL345_OVERRUN - 新数据替换未读数据
    ADXL345_WATERMARK - FIFO 中的样本数量等于 FIFO_CTL 中定义的数量
    ADXL345_FREEFALL - 所有轴的加速度值都低于 THRESH_FF 中定义的阈值
    ADXL345_INACTIVITY - 符合。所有包含轴的值是 < THRESH_INACT for period > TIME_INACT
    ADXL345_ACTIVITY - 符合。包含轴的值 > THRESH_ACT
    ADXL345_DOUBLE_TAP - 在一个(包括)上检测到双击。轴和各种定义的条件得到满足
    ADXL345_SINGLE_TAP - 在一个上检测到单击,包括。轴和各种定义的条件得到满足
    ADXL345_DATA_READY - 新数据可用

    将中断分配给 INT1 (INT_PIN_1) 或 INT2 (INT_PIN_2)。数据就绪,溢出
    始终启用。您只能更改这些默认情况下为 INT1 的分配。

    您可以使用 deleteInterrupt(type) 删除中断;
*/

myAcc.setInterrupt(ADXL345_ACTIVITY, INT_PIN_2);
myAcc.setInterrupt(ADXL345_INACTIVITY, INT_PIN_2);

}

/*在主循环中进行了一些检查:
    getActTapStatus() 以字节形式返回负责活动中断的轴(库中的代码)
    getActTapStatusAsString() 以字符串形式返回导致中断的轴
    readAndClearInterrupts(); 将中断类型返回为字节(库中的代码)
    checkInterrupt(intSource, type) 如果 intSource 的类型为 bool,则返回
*/

void loop() {
if ((millis() % 1000) == 1) {
    xyzFloat g = myAcc.getGValues();
    Serial.print("g-x   = ");
    Serial.print(g.x);
    Serial.print("|g-y   = ");
    Serial.print(g.y);
    Serial.print("|g-z   = ");
    Serial.println(g.z);
}

if (in_activity == true) {
    //byte actTapSource = myAcc.getActTapStatus();
    //Serial.println(actTapSource, BIN);
    String axes = myAcc.getActTapStatusAsString();
    byte intSource = myAcc.readAndClearInterrupts();
    if (myAcc.checkInterrupt(intSource, ADXL345_ACTIVITY)) {
      Serial.print("活动在: ");
      Serial.println(axes);
    }

    if (myAcc.checkInterrupt(intSource, ADXL345_INACTIVITY)) {
      Serial.println("不活动!");
    }

    delay(500);
    myAcc.readAndClearInterrupts();
    in_activity = false;
}
}

void in_activityISR() {
in_activity = true;
}

驴友花雕 发表于 2022-5-14 08:54:44

程序六:使用Adafruit_ADXL345_U库读取三轴X\Y\Z (1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序六:使用Adafruit_ADXL345_U库读取三轴X\Y\Z
Arduino------ADXL345
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

//同时给这个传感器分配一个唯一的ID
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

void displaySensorDetails(void){
sensor_t sensor;

accel.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print("传感器:       "); Serial.println(sensor.name);
Serial.print("驱动版本:   "); Serial.println(sensor.version);
Serial.print("唯一标识:    "); Serial.println(sensor.sensor_id);
Serial.print("最大值:    "); Serial.print(sensor.max_value); Serial.println(" m/s^2");
Serial.print("最小值:    "); Serial.print(sensor.min_value); Serial.println(" m/s^2");
Serial.print("分辨率:   "); Serial.print(sensor.resolution); Serial.println(" m/s^2");
Serial.println("------------------------------------");
Serial.println("");
delay(500);
}

void displayDataRate(void){
Serial.print("数据速率:");

switch(accel.getDataRate())
{
    case ADXL345_DATARATE_3200_HZ:
      Serial.print("3200 ");
      break;
    case ADXL345_DATARATE_1600_HZ:
      Serial.print("1600 ");
      break;
    case ADXL345_DATARATE_800_HZ:
      Serial.print("800 ");
      break;
    case ADXL345_DATARATE_400_HZ:
      Serial.print("400 ");
      break;
    case ADXL345_DATARATE_200_HZ:
      Serial.print("200 ");
      break;
    case ADXL345_DATARATE_100_HZ:
      Serial.print("100 ");
      break;
    case ADXL345_DATARATE_50_HZ:
      Serial.print("50 ");
      break;
    case ADXL345_DATARATE_25_HZ:
      Serial.print("25 ");
      break;
    case ADXL345_DATARATE_12_5_HZ:
      Serial.print("12.5 ");
      break;
    case ADXL345_DATARATE_6_25HZ:
      Serial.print("6.25 ");
      break;
    case ADXL345_DATARATE_3_13_HZ:
      Serial.print("3.13 ");
      break;
    case ADXL345_DATARATE_1_56_HZ:
      Serial.print("1.56 ");
      break;
    case ADXL345_DATARATE_0_78_HZ:
      Serial.print("0.78 ");
      break;
    case ADXL345_DATARATE_0_39_HZ:
      Serial.print("0.39 ");
      break;
    case ADXL345_DATARATE_0_20_HZ:
      Serial.print("0.20 ");
      break;

    case ADXL345_DATARATE_0_10_HZ:
      Serial.print("0.10 ");
      break;

    default:
      Serial.print("???? ");
      break;
}
Serial.println(" Hz");
}

void displayRange(void){
Serial.print("范围:+/- ");

switch(accel.getRange())
{
    case ADXL345_RANGE_16_G:
      Serial.print("16 ");
      break;
    case ADXL345_RANGE_8_G:
      Serial.print("8 ");
      break;
    case ADXL345_RANGE_4_G:
      Serial.print("4 ");
      break;
    case ADXL345_RANGE_2_G:
      Serial.print("2 ");
      break;
    default:
      Serial.print("?? ");
      break;
}
Serial.println(" g");
}

void setup(void){
#ifndef ESP8266
while (!Serial);
#endif

Serial.begin(9600);
Serial.println("加速度计测试"); Serial.println("");

//初始化传感器
if(!accel.begin())
{
    //检测 ADXL345 时出现问题...检查您的连接
    Serial.println("糟糕,没有检测到 ADXL345……检查你的接线!");
    while(1);
}

//将范围设置为适合您项目的范围
accel.setRange(ADXL345_RANGE_16_G);

// accel.setRange(ADXL345_RANGE_8_G);
// accel.setRange(ADXL345_RANGE_4_G);
// accel.setRange(ADXL345_RANGE_2_G);

//显示这个传感器的一些基本信息
displaySensorDetails();

// 显示附加设置(sensor_t 范围之外)
displayDataRate();
displayRange();
Serial.println("");
}

void loop(void){
//获取新的传感器事件
sensors_event_t event;

accel.getEvent(&event);

//显示结果(加速度以 m/s^2 为单位)
Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("");
Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("");
Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("");Serial.println("m/s^2 ");

delay(500);
}

驴友花雕 发表于 2022-5-14 09:06:35

程序八:使用ADXL345_WE 库测量角度、校正角度和方向(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序八:使用ADXL345_WE 库测量角度、校正角度和方向
Arduino------ADXL345
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/

#include<Wire.h>
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D

/* 有几种方法可以创建您的 ADXL345 对象:
   ADXL345_WE myAcc = ADXL345_WE()                -> uses Wire / I2C Address = 0x53
   ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR
   ADXL345_WE myAcc = ADXL345_WE(&wire2)          -> uses the TwoWire object wire2 / ADXL345_I2CADDR
   ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together
*/
ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);

void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("ADXL345_测试");
Serial.println();
if (!myAcc.init()) {
    Serial.println("ADXL345 未连接!");
}
/* 添加您使用 ADXL345_calibration.ino 找到的最小和最大原始值。
      顺序为: setCorrFactors(min x, max x, min y, max y, min z, max z).
      setCorrFactors 校准斜率并假设零点
      is (min+max)/2. 必须将 setCorrFactors 函数添加到全局
*/
myAcc.setCorrFactors(-266.0, 285.0, -268.0, 278.0, -291.0, 214.0);

/* 在下一步中,角度的偏移被校正以获得相当精确的校正
   x 和 y 的角度高达 ~60°。附加的 offsetCorrection 仅用于
   校正角度测量。该过程只是确保从 0° 开始。
*/
Serial.println("将您的 ADXL345 平放,不要移动它");
delay(2000);
myAcc.measureAngleOffsets();
Serial.println("....完成");

/* 选择数据速率Hz
      ADXL345_DATA_RATE_3200    3200
      ADXL345_DATA_RATE_1600    1600
      ADXL345_DATA_RATE_800      800
      ADXL345_DATA_RATE_400      400
      ADXL345_DATA_RATE_200      200
      ADXL345_DATA_RATE_100      100
      ADXL345_DATA_RATE_50      50
      ADXL345_DATA_RATE_25      25
      ADXL345_DATA_RATE_12_5      12.5
      ADXL345_DATA_RATE_6_25       6.25
      ADXL345_DATA_RATE_3_13       3.13
      ADXL345_DATA_RATE_1_56       1.56
      ADXL345_DATA_RATE_0_78       0.78
      ADXL345_DATA_RATE_0_39       0.39
      ADXL345_DATA_RATE_0_20       0.20
      ADXL345_DATA_RATE_0_10       0.10
*/
myAcc.setDataRate(ADXL345_DATA_RATE_50);
Serial.print("数据速率:");
Serial.print(myAcc.getDataRateAsString());

/* 选择测量范围
      ADXL345_RANGE_16G    16g
      ADXL345_RANGE_8G      8g
      ADXL345_RANGE_4G      4g
      ADXL345_RANGE_2G      2g
*/
myAcc.setRange(ADXL345_RANGE_2G);
Serial.print("/g-范围: ");
Serial.println(myAcc.getRangeAsString());
Serial.println();
}

void loop() {
xyzFloat raw = myAcc.getRawValues();
xyzFloat g = myAcc.getGValues();
xyzFloat angle = myAcc.getAngles();
xyzFloat corrAngles = myAcc.getCorrAngles();

/* 仍然是未校正的原始值!! */
Serial.print("Raw-x    = ");
Serial.print(raw.x);
Serial.print("|Raw-y    = ");
Serial.print(raw.y);
Serial.print("|Raw-z    = ");
Serial.println(raw.z);

/* g 值使用校正后的原始值 */
Serial.print("g-x   = ");
Serial.print(g.x);
Serial.print("|g-y   = ");
Serial.print(g.y);
Serial.print("|g-z   = ");
Serial.println(g.z);

/* 角度使用校正后的原始数据。角度简单地计算为
   角度 = arcsin(g 值) */
Serial.print("角度 x= ");
Serial.print(angle.x);
Serial.print("|角度 y= ");
Serial.print(angle.y);
Serial.print("|角度 z= ");
Serial.println(angle.z);
/* 修正后的角度使用修正后的原始数据和额外的角度
   偏移以确保它们从 0° 开始
*/
Serial.print("修正角度 x = ");
Serial.print(corrAngles.x);
Serial.print("|修正角度 y   = ");
Serial.print(corrAngles.y);
Serial.print("|修正角度 z   = ");
Serial.println(corrAngles.z);
Serial.print("模块方向:");
Serial.println(myAcc.getOrientationAsString());
Serial.println();
delay(500);
}

驴友花雕 发表于 2022-5-12 16:21:33

科普知识点:加速度与三轴加速度传感器一、加速度(acceleration)1、加速度是物理学中的一个物理量,是一个向量,主要应用于经典物理当中,一般用字母a 表示,在国际单位制中的单位为米每二次方秒(m/s^{2})。加速度是速度向量对于时间的变化率,描述速度的方向和大小变化的快慢。加速度的图标见下图。

驴友花雕 发表于 2022-5-12 16:23:37

在经典力学中,牛顿第二定律说明了力和加速度成正比,这定律又称为「加速度定律」。假设施加于物体的净外力为零,则加速度为零,速度为常数,由于动量是质量与速度的乘积,所以动量守恒。在电动力学里,呈加速度运动的带电粒子会发射电磁辐射。

2、简单地说,速度描述了位置是如何变化的,而加速度描述了速度是如何变化的。这是两个层面的变化!比如,水平地向前扔出一个物体,起初它的速度朝向正前,然而由于重力它开始在向前的同时向下坠落,即其速度改变了。这里改变物体速度的主要是地球的重力引起的重力加速度。加速度是我们对任何速度变化的称呼。因为速度包含大小和方向,所以产生加速度只有两种方式:改变速度或者改变方向——或者两个都改变。

驴友花雕 发表于 2022-5-12 16:26:36

加速度具有向量性质,即需要用大小和方向同时描述一个加速度。在光滑水平面上向前运动的物体,如果向左或向右施以力,即给予了不同的加速度,则其速度会发生变化(包含了速率及方向),然而向左的加速度和向右的加速度显然引起了不同的效果。同样,施力的大小不同,引起的加速度不同,最终的结果也不一样,亦可以从向量的加成性来看。作为一个向量,加速度的叠加和分解分别遵循平行四边形法则和三角形法则。

具体而言,加速度描述的是速度随时间的变化率。需要注意的是,由于速度也是向量,因此加速度不为零的物体速度的大小(称之为速率)也不一定会发生变化,实际上,如果加速度保持与速度垂直,速度大小就一直不会改变,同时方向一直改变。这种情况在生活中最常见的是圆周运动,比如在被拴在一端固定的线的另一端的一个小物体在线保持绷直时做的运动,又比如带电粒子在仅受静磁场的劳仑兹力 F=qv x B时做的运动。

3、加速度是物体速度随时间的变化率,是矢量,具有大小量值和方向性(方向由+、-号代表)。加速度的大小等于单位时间内速度的改变量;加速度的方向与速度变化量ΔV方向始终相同。特别,在直线运动中,如果加速度的方向与速度相同,速度增加;加速度的方向与速度相反,速度减小。加速度等于速度对时间的一阶导数,等于位置坐标对时间的二阶导数。

驴友花雕 发表于 2022-5-12 16:28:46

3、如果你没有改变你的速度和方向,那么你就不可能产生加速度。因此,因为速度没有变化,一架以每小时800英里的速度沿直线匀速飞行的飞机的加速度为0,尽管这架飞机的速度非常快。当这架飞机降落并且迅速停下的时候它将会有加速度,因为它正在减速。或者你也可以这样想。在车里,你可以通过踩油门或者刹车来产生加速度,因为这会导致速度大小的变化。你也可以使用方向盘转弯来产生加速度,因为这会导致你的速度方向变化。这两者中的任何一个都会被认为是产生了加速度,因为他们都会导致速度的变化。
4、人们会想,“如果加速度是负值,那么物体就在减速,如果加速度是正值,那么物体就在加速,对吧?”错了。加速度为负值的物体可能在加速,加速度为正值的物体也可能在减速。为什么会这样呢?考虑到加速度是一个矢量,它指向与 速度变化 相同的方向。这意味着加速度的方向决定了速度应该加还是减去加速度。从数学上讲,负加速度意味着你应该从当前速度减去加速度,正加速度则表示你应该从当前速度加上加速度。如果速度一开始就是负值,那么从速度值中减去加速度可能会使物体的速度大小增加。

驴友花雕 发表于 2022-5-12 16:32:08

如果加速度与速度指向同一方向,则物体将加速。如果加速度与速度指向不同方向,物体将会减速。以下图为例,一辆车不小心开入了泥潭中—这会让车减速—或者追逐一个甜甜圈—会让车加速。假设右为正方向,车向右移动时速度为正值,车向左移动时速度为负值。如果车在加速,加速度指向速度相同方向;如果汽车减速加速度指向速度相反方向。另一种说法是,如果加速度与速度同号,物体将会加速。如果加速度与速度异号,物体将会减速。
二、三轴加速度传感器(Three-axis accelerometer) 1、加速度传感器有多种实现方式,主要可分为压电式、电容式及热感应式三种,按输入轴数目分类,有单轴、双轴和三轴加速度计。三轴加速度传感器是基于加速度的基本原理去实现工作,具有体积小和重量轻特点,可以测量空间加速度,能够全面准确反映物体的运动性质,在航空航天、机器人、汽车和医学等领域得到广泛的应用。下图为无人机中使用的三轴加速度传感器。

驴友花雕 发表于 2022-5-12 16:34:30

2、三轴加速度传感器的物理原理加速度的感测基本原理相当简单,这类加速度计是利用特殊硅材料特质而设计出的可移动式结构,它的机械结构包括可移动的质量块与弹簧连接感测器的相对固定端,分别作为电容的两极。当外界因加速度而使得质量块与弹簧固定端发生相对位移时,两极间的电容量即会产生变化,透过特殊电路可将此变化量转换成相对应的输出讯号,进而得到相对加速度值。但是如果只有一个方向的加速度感测器,在应用方面来说相对较少,因此,为了适用于真实的 3D 世界,我们再进一步将其扩增立体三个方向,也就是三轴加速度感测器,因此其能检测 X、Y、Z 的加速度资料,并根据三轴资讯来判断当前的运动状态,进而推广出大量的应用端。

驴友花雕 发表于 2022-5-12 16:36:34

3、在空间飞行器的惯性测量系统、车辆船舶的倾斜测量、机器人的平衡姿态检测、肢体姿态检测等许多方面都需要测量物体的倾斜角。采用MEMS加速度传感器来测量倾斜角角度,具有体积小、质量轻、成本低、不影响被测物体的机械机构的特点。以电容式三轴加速度计的技术原理为例。电容式加速度计能够感测不同方向的加速度或振动等运动状况。其主要为利用硅的机械性质设计出的可移动机构,机构中主要包括两组硅梳齿,一组固定,另一组随即运动物体移动;前者相当于固定的电极,后者的功能则是可移动电极。当可移动的梳齿产生了位移,就会随之产生与位移成比例电容值的改变。三轴加速度传感器的好处就是在预先不知道物体运动方向的场合下,只有应用三维加速度传感器来检测加速度信号。三维加速度传感器具有体积小和重量轻特点,可以测量空间加速度,能够全面准确反映物体的运动性质。
4、三轴加速度传感器的几个应用(1)车身安全、控制及导航系统中的应用加速度传感器在进入消费电子市场之前,实际上已被广泛应用于汽车电子领域,主要集中在车身操控、安全系统和导航,典型的应用如汽车安全气囊、ABS防抱死刹车系统、电子稳定程序、电控悬挂系统等。车身安全越来越得到人们的重视,汽车中安全气囊的数量越来越多,相应对传感器的要求也越来越严格。整个气囊控制系统包括车身外的冲击传感器、安置于车门、车顶,和前后座等位置的加速度传感器、电子控制器,以及安全气囊等。电子控制器通常为16位或32位MCU,当车身受到撞击时,冲击传感器会在几微秒内将信号发送至该电子控制器。随后电子控制器会立即根据碰撞的强度、乘客数量及座椅/安全带的位置等参数,配合分布在整个车厢的传感器传回的数据进行计算和做出相应评估,并在最短的时间内通过电爆驱动器启动安全气囊保证乘客的生命安全。除了车身安全系统这类重要应用以外,加速度传感器在导航系统中的也在扮演重要角色。专家预测便携式导航设备(PND)将成为中国市场的热点,其主要利于GPS卫星信号实现定位。而当PND进入卫星信号接收不良的区域或环境中就会因失去信号而丧失导航功能。基于MEMS技术的三轴加速度传感器配合陀螺仪或电子罗盘等元件一起可创建方位推算系统,对GPS系统实现互补性应用。

驴友花雕 发表于 2022-5-12 16:38:35

(2)硬盘抗冲击防护由于海量数据对存储方面的需求,硬盘和光驱等元器件被广泛应用到笔记本电脑、手机、数码相机/摄相机、便携式DVD机、PMP等设备中。便携式设备由于其应用场合的原因,经常会意外跌落或受到碰撞,而造成对内部元器件的巨大冲击。为了使设备以及其中数据免受损伤,越来越多的用户对便携式设备的抗冲击能力提出要求。一般便携式产品的跌落高度为1.2~1.3米,其在撞击大理石质地面时会受到约50KG的冲击力。虽然良好的缓冲设计可由设备外壳或PCB板来分解大部分冲击力,但硬盘等高速旋转的器件却在此类冲击下显得十分脆弱。如果在硬盘中内置3轴加速度传感器,当跌落发生时,系统会检测到加速的突然变化,并执行相应的自我保护操作,如关闭抗震性能差的电子或机械器件,从而避免其受损,或发生硬盘磁头损坏或刮伤盘片等可能造成数据永久丢失的情况。

(3)消费产品中的创新应用三轴加速度传感器为传统消费及手持电子设备实现了革命性的创新空间。其可被安装在游戏机手柄上,作为用户动作采集器来感知其手臂前后、左右,和上下等的移动动作,并在游戏中转化为虚拟的场景动作如挥拳、挥球拍、跳跃、甩鱼竿等,把过去单纯的手指运动变成真正的肢体和身体的运动,实现比以往按键操作所不能实现的临场游戏感和参与感。

(4)姿态与动作识别
三轴加速度传感器的应用范围很广,除了文中提到的游戏动作操控外,还能用于手持设备的姿态识别和UI操作。例如借助3轴加速度传感器,手持设备可实现画面自动转向。iPod Touch就内建了此功能,设备显示的画面和信息会根据用户的动作而自动旋转。其通过内部传感器对重力向量的方向检测来确定设备处于水平或垂直状态,并自动调整显示状态,给用户带来方便。传感器对震动的感知性能也可将以前传统的按键动作变化为震动,用户可通过单次或多次震动来进行功能的选择,如曲目的选择、音量控制等。此外,该功能还可扩展至对用户界面元素的操控。如屏幕显示内容的上下左右等方向的浏览可通过倾斜手持设备来完成。
(5)趣味性扩展功能
三轴加速度传感器对用户操控动作的转变还可转化为许多趣味性的扩展功能上,如虚拟乐器、虚拟骰子游戏,以及“闪讯”(Wave Message)等。虚拟乐器内置的加速度传感器可检测用户对手持设备的挥动来控制乐器的节奏和音量等;骰子游戏也采用类似的原理,通过对挥动等动作的感知来控制虚拟骰子的旋转速度,并借助内部数学模型抽象的物理定律决定其停止的时间。
“闪讯”是一个更富有想象力的应用,用户可利用此功能在空中进行文字编辑。“闪讯”即让手持设备通过加速度传感器捕捉用户在空中模拟写字的快速动作,主要适合较暗的环境下使用。手持设备上会安装发光的LED,由于人眼视网膜的视觉暂留现象,其在空中挥动的动作会在其眼中留下短暂的连续画面,完成写字的所有动作笔顺。

驴友花雕 发表于 2022-5-12 16:40:37

科普知识点:ADXL345芯片和GY-291三轴加速度传感器模块一、ADXL3451、ADXL345是一款小而薄的低功耗3轴加速度计,分辨率高(13位),测量范围达±16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(4 mg/LSB),能够测量不到1.0°的倾斜角度变化。该器件提供多种特殊检测功能。活动和非活动检测功能检测有无运动发生,以及任意轴上的加速度是否超过用户设置的限值。敲击检测功能可以检测单击和双击动作。自由落体检测功能可以检测器件是否正在掉落。这些功能可以映射到两个中断输出引脚中的一个。正在申请专利的32级先进先出(FIFO)缓冲器可用于存储数据,最大程度地减少主机处理器的干预。低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。ADXL345采用3 mm × 5 mm × 1 mm、14引脚小型超薄塑料封装。


驴友花雕 发表于 2022-5-12 16:42:15

2、ADXL345主要特征超低功耗:V S = 2.5 V 时(典型值),测量模式下低至23ì A ,
待机模式下为0.1μA
功耗随带宽自动按比例变化
用户可选的分辨率
10 位固定分辨率
全分辨率,分辨率随g范围提高而提高,± 16g 时高达13 位
(在所有g范围内保持4 mg/L S B 的比例系数)
正在申请专利的嵌入式存储器管理系统采用FI FO 技术,可将
主机处理器负荷降至最低
单振/双振检测
活动/非活动监控
自由落体检测
电源电压范围:2.0 V 至3.6 V
I / O电压范围:1.7 V 至V S
S PI (3线和4线)和I 2 C数字接口
灵活的中断模式,可映射到任一中断引脚
通过串行命令可选测量范围
通过串行命令可选带宽
宽温度范围(- 40° C 至+ 85 ℃)
抗冲击能力:10, 000 g
无铅/符合Ro HS标准
3、ADXL345内部框图

驴友花雕 发表于 2022-5-12 16:43:38

4、ADXL345工作原理
ADXL345是一款完整的3轴加速度测量系统,可选择的测量范围有±2 g,±4 g,±8 g或±16 g。既能测量运动或冲击导致的动态加速度,也能测量静止加速度,例如重力加速度,使得器件可作为倾斜传感器使用。该传感器为多晶硅表面微加工结构,置于晶圆顶部。由于应用加速度,多晶硅弹簧悬挂于晶圆表面的结构之上,提供力量阻力。差分电容由独立固定板和活动质量连接板组成,能对结构偏转进行测量。加速度使惯性质量偏转、差分电容失衡,从而传感器输出的幅度与加速度成正比。相敏解调用于确定加速度的幅度和极性。
5、ADXL345引脚图

驴友花雕 发表于 2022-5-12 16:45:13

6、ADXL345应用

7、ADXL345技术资料下载https://www.analog.com/media/cn/technical-documentation/data-sheets/ADXL345_cn.pdf https://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345-EP.pdf

驴友花雕 发表于 2022-5-12 16:47:35

二、GY-291(ADXL345)三轴加速度传感器模块1、ADXL345三轴加速度模块
采用ADXL345芯片,具有体积小,功耗低的特点,13位数字精度分辨能够测量超过±16g的加速度变换。信号输出为16位数字输出,可以通过SPI与I2C接口实现信号采集。ADXL345适用于倾斜角度测量,能够进行静态重力加速度检测。同时也适用于运动状态的追踪,测量运动或冲击过程造成的瞬时加速度。其高分辨率(4mg/LSB)使之能够感应变化小于1°的倾斜角度。ADXL345三轴加速度计还内置一款LDO模块让你的加速度计能够工作于3.3~6v的工作电压之下。同时传感器提供了几个特殊的功能。能够在静态或动态情况下检测是否有运动或停止出现,另外能够感知单轴的加速度值是否超出用户的设定值。检测单击/双击。如果该设备正在下降,能进行自由落体感应检测。这些功能能够被映射到两个中断输出引脚上。在低功耗模式是用户能够基于ADXL345动作感应,进行电源管理,同时只损耗极低的功耗。

驴友花雕 发表于 2022-5-12 16:49:16

2、模块电原理图

驴友花雕 发表于 2022-5-12 16:51:20

3、模块技术规格(1)工作电压:3.3~6v(2)超低功耗:测量模式下40uA电流损耗,待机模式下0.1uA@2.5v(3)通讯接口:I2C、SPI(3线or4线)(4)接口类型:0.1"插针孔(5)尺寸:20x15mm
模块主要应用(1)单击/双击检测(2)自由落体检测(3)倾角测量(4)切换横屏/竖屏模式等


4、ADXL345 加速度计模块引脚分配(有 8 个引脚)
VCC : 模块电源 – 3 至 6 VGND :接地Cs : 芯片选择INT1 :中断 1 输出INT2 :中断 2 输出SDO :串行数据输出SDA : 串行数据SCL : 串行时钟


驴友花雕 发表于 2022-5-12 16:54:01

ADXL345三轴加速度传感器模块的实验环境一、ADXL345三轴加速度传感器模块实验所需硬件清单 8x8LED点阵屏模块X1Arduino Uno开发板 X1杜邦线 若干(备了9条)LED发光二极管(蓝色)X1IIC/I2C 1602 LCD液晶屏模块X1ADXL345三轴加速度传感器模块X2Proto Shield原型扩展板(带mini面包板)X1

驴友花雕 发表于 2022-5-12 16:56:25

二、传感器模块实验所需软件平台代码编程 Arduino IDE (版本1.8.19)仿真编程 Linkboy   (版本V4.6.3)图形编程 Mind+(版本 V1.7.0 RC2.0)以及编玩边学(线上平台https://ide.codepku.com/?type=Arduino)
三、搜索和安装“ADXL345”相关库1、打开Arduino IDE——工具——管理库,搜索ADXL345

驴友花雕 发表于 2022-5-12 16:58:06

2、打开网页https://github.com/,搜索ADXL345

驴友花雕 发表于 2022-5-12 17:00:01

四、实验接线示意图


驴友花雕 发表于 2022-5-14 06:38:15

ADXL345三轴加速度传感器模块的几个实验1、程序一:在串口显示ADXL345的动态波形(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序一:在串口显示ADXL345的动态波形
*/

#include <Wire.h>// 线库 - 用于 I2C 通信
int ADXL345 = 0x53; // ADXL345传感器I2C地址
float X_out, Y_out, Z_out;// 输出

void setup() {
Serial.begin(9600);
Wire.begin(); // 启动 Wire 库
Wire.beginTransmission(ADXL345); // 开始与设备通信
Wire.write(0x2D); /// 访问/与 POWER_CTL 寄存器对话 - 0x2D
// (8dec -> 0000 1000 binary) Bit D3 High 用于测量启用
Wire.write(8);
Wire.endTransmission();
delay(10);
}

void loop() {
// === 读取加速度计数据 === //
Wire.beginTransmission(ADXL345);
Wire.write(0x32); // 从寄存器 0x​​32 (ACCEL_XOUT_H) 开始
Wire.endTransmission(false);
// 共读取 6 个寄存器,每个轴的值存储在 2 个寄存器中
Wire.requestFrom(ADXL345, 6, true);
X_out = ( Wire.read()| Wire.read() << 8); // X轴值
X_out = X_out/2; //将原始值除以2
Y_out = ( Wire.read()| Wire.read() << 8); // Y轴值
Y_out = Y_out/2;
Z_out = ( Wire.read()| Wire.read() << 8); // Y轴值
Z_out = Z_out/2;
Serial.print("Xa= ");
Serial.print(X_out);
delay(500);
Serial.print("   Ya= ");
Serial.print(Y_out);
delay(500);
Serial.print("   Za= ");
Serial.println(Z_out);
delay(500);
}

页: [1] 2 3 4 5
查看完整版本: 【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块