用Arduino测试ADXL335加速度计如何工作?

原文地址

你有没有想过你的智能手机是如何知道哪个方向向上的?这是当今智能手机最具创新性的功能之一。它们都有一个内置在电路中的称为加速度计的微型设备,可以检测何时将设备从一侧倾斜到另一侧。这就是智能手机知道何时从纵向模式切换到横向模式的方式。

让我们看一下它们是什么,它们做什么,以及它们是如何工作的。

加速度计如何工作?

要了解加速度计的工作原理,请想象一个 3D 立方体内的球。

假设立方体在外太空,一切都是失重的,球将简单地漂浮在立方体的中心。

现在假设每面墙代表一个特定的轴。

如果我们突然以加速度 1g 将盒子向左移动( 1g 相当于重力加速度 9.8 m/s2),球无疑会撞到墙 X。如果我们测量球在墙 X 上施加的力,我们可以沿 X 轴获得 1g 的输出值。

让我们看看当我们把这个立方体放在地球上会发生什么。球将简单地落在 Z 墙上,施加 1g 的力,如下图所示:

在这种情况下,盒子没有移动,但我们仍然在 Z 轴上得到 1g 的读数。这是因为重力(实际上是一种加速度形式)以1g的力将球向下拉。

虽然此模型不能完全代表实际加速度计传感器的构建方式,但它通常有助于理解为什么加速度计的输出信号通常以 ±g 为单位,或者为什么加速度计在静止时在 z 轴上读取 1g,或者在不同方向上可以预期的加速度计读数。

在现实世界中,加速度计基于微机电系统(MEMS制造技术)。那么,让我们来了解一下MEMS加速度计的工作原理。

MEMS加速度计如何工作?

MEMS(微机电系统)加速度计是一种建立在硅晶圆之上的微机械结构。

这种结构由多晶硅弹簧悬挂。它允许结构在沿 X、Y 和/或 Z 轴加速时偏转。

由于偏转,固定板和连接到悬挂结构的板之间的电容会发生变化。电容的这种变化与沿该轴的加速度成正比。

传感器处理电容的这种变化,并将其转换为模拟输出电压。

ADXL335模块硬件概述

该模块的核心是ADI公司的小型、低功耗、低噪声三轴MEMS加速度计ADXL335。它不仅可以测量重力引起的静态加速度,还可以测量由运动、冲击或振动引起的动态加速度。

这款试验板模块将ADXL335的每个引脚分成一个6引脚、0.1′间距接头,包括3个用于X、Y和Z轴测量的模拟输出、2个电源引脚和一个自检引脚。

供电

ADXL335采用1.8V至3.6VDC (典型值为3.3V)工作。然而,板载 3.3V 稳压器使其成为与 Arduino 等 5V 微控制器接口的理想选择。

传感器在正常工作期间仅消耗 350μA 电流。

测量范围

ADXL335具有±3g的全检测范围。这意味着ADXL335可以精确测量并表示为输出的最大加速度为±3g。例如,如果以4g加速,加速度计不会损坏,但输出可能不正常。

ADXL335的绝对最大加速度为10,000g。当加速度大于10,000g时,ADXL335可能会失效。

比率输出

ADXL335输出是比率式的,因此输出电压在整个范围内随加速度线性增加。这意味着0g测量输出始终处于3.3V电源电压(1.65V)的一半,-3g为0V,+3g为3.3V,两者之间有完全缩放。

技术规格

以下是规格。

工作电压 1.8V – 3.6V
工作电流 350μA(典型值)
感应距离 ±3g(满量程)
温度范围 −40 至 +85°C
感应轴 3轴
敏感性 270 至 330mV/g(比率式)
抗冲击性 高达 10,000g
尺寸 4 毫米 x 4 毫米 x 1.45 毫米

有关更多信息,请参阅下面的数据表。

ADXL335 数据表

ADXL335 加速度计引脚排列

在我们进入连接和示例代码之前,让我们看一下它的 Pinout。

VCC为模块供电。将其连接到Arduino的5V输出。

X_OUT输出与沿 X 轴加速度成比例的模拟电压。

Y_OUT输出与沿 Y 轴加速度成比例的模拟电压。

Z_OUT输出与沿 Z 轴加速度成比例的模拟电压。

GND是接地引脚。

ST(Self-Test)PIN 控制自检功能,允许您在最终应用中测试传感器的功能。本教程末尾将深入讨论此功能。

将ADXL335加速度计连接到Arduino

现在我们知道了ADXL335加速度计的工作原理,我们可以继续将其连接到Arduino。

连接非常简单。首先将加速度计安装在试验板上。将VCC引脚连接到Arduino的5V引脚,将GND引脚连接到Arduino的接地引脚。将 X、Y 和 Z 输出连接到 Arduino 的模拟引脚 A0、A1 和 A2。

为了获得准确的结果,我们需要更改Arduino上的模拟参考(AREF)电压。这是通过将Arduino的3.3V引脚连接到AREF引脚来实现的。

下图显示了接线。

Arduino示例代码 – 读取ADXL335加速度计

草图很简单。它只是在串行接口的每个轴上显示校准的传感器输出。在我们进入细节之前先尝试草图。

const int xInput = A0;
const int yInput = A1;
const int zInput = A2;// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;// Take multiple samples to reduce noise
const int sampleSize = 10;void setup()
{analogReference(EXTERNAL);Serial.begin(9600);
}void loop()
{//Read raw valuesint xRaw = ReadAxis(xInput);int yRaw = ReadAxis(yInput);int zRaw = ReadAxis(zInput);// Convert raw values to 'milli-Gs"long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);// re-scale to fractional Gsfloat xAccel = xScaled / 1000.0;float yAccel = yScaled / 1000.0;float zAccel = zScaled / 1000.0;Serial.print("X, Y, Z  :: ");Serial.print(xRaw);Serial.print(", ");Serial.print(yRaw);Serial.print(", ");Serial.print(zRaw);Serial.print(" :: ");Serial.print(xAccel,0);Serial.print("G, ");Serial.print(yAccel,0);Serial.print("G, ");Serial.print(zAccel,0);Serial.println("G");delay(200);
}// Take samples and return the average
int ReadAxis(int axisPin)
{long reading = 0;analogRead(axisPin);delay(1);for (int i = 0; i < sampleSize; i++){reading += analogRead(axisPin);}return reading/sampleSize;
}

下图显示了不同方向的加速度计读数。

代码说明:

代码首先声明了 Arduino 的模拟输入引脚,传感器的 X、Y 和 Z 输出引脚连接到这些引脚。

const int xInput = A0;
const int yInput = A1;
const int zInput = A2;

接下来,定义两个变量 RawMinandRawMax。由于Arduino具有10位ADC(210= 1024),因此它将ADXL335的输出电压(范围为0至3.3 V)映射到0至1023之间的整数值。这就是为什么设置RawMin为 0 并且设置RawMax为 1023。

// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;

变量sampleSize指定 Arduino 在每次转换期间应采集的样本数。在我们的例子中,我们设置sampleSize为 10 以获得更准确的结果。

// Take multiple samples to reduce noise
const int sampleSize = 10;

在设置部分,我们首先通过调用将模拟引用设置为 EXTERNAL。然后,我们启动与PC的串行通信。analogReference(EXTERNAL)

警告:

这是必需的,因为我们已经将 3.3V 连接到 Arduino 的 AREF 引脚。如果没有调用analogReference(EXTERNAL),则会将内部生成的有源参考电压和 AREF 引脚短接在一起,从而可能损坏 Arduino。

您可以在Arduino的官方网站上了解有关analogReference()功能的更多信息。

analogReference(EXTERNAL);
Serial.begin(9600);

在循环部分,我们每200ms读取一次传感器的模拟输出。请注意,我们调用自定义函数ReadAxis()而不是analogRead()函数。该函数获取10个ADC转换样本并返回平均值。

//Read raw values
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);

将ADXL335输出转换为加速度(g)

以下代码片段是该程序最重要的部分。它将传感器的模拟输出电压映射并转换为重力加速度(G)。

映射由 IDE 的内置函数map()处理。当我们调用map(xRaw, RawMin, RawMax, -3000, 3000)时,值RawMin 映射到 -3000,值RawMax映射到 3000,介于两者之间的值映射到介于两者之间的值。

数字 -3000 和 3000 不是随机的。它们实际上代表传感器以milli-g为单位测量的重力加速度,即±3g(-3000milli-g至3000milli-g)。

例如

  • 如果传感器在 x 轴上输出 0 伏特,即 xRaw=0,则map()函数将返回 -3000,对应于 -3g。
  • 如果传感器在 x 轴上输出 1.65 伏,即 xRaw=511,则该map()函数将返回 0,对应于 0g。
  • 如果传感器在 x 轴上输出 3.3 伏,即 xRaw=1023,则map()函数将返回 3000,对应于 +3g。

术语比率更有意义,因为输出电压在整个范围内随加速度线性增加。

// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);

最后,传感器的输出通过除以1000将其缩小到小数Gs,并显示在串行监视器上。

// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;Serial.print("X, Y, Z  :: ");
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
Serial.print(" :: ");
Serial.print(xAccel,0);
Serial.print("G, ");
Serial.print(yAccel,0);
Serial.print("G, ");
Serial.print(zAccel,0);
Serial.println("G");

ADXL335 自检特性

ADXL335加速度计具有自检功能,允许您在最终应用中测试传感器的功能。模块上的 ST(自检)引脚控制此功能。

当ST引脚连接到3.3V时,在内部对加速度计光束施加静电力。由此产生的波束运动允许用户确定加速度计是否正常工作。

输出的预期变化为

  • X 轴上的 −1.08 g (−325 mV)
  • Y 轴上 +1.08 g (+325 mV)
  • Z 轴上 +1.83 g (+550 mV)

在正常工作期间,ST 引脚可能保持开路或连接到 GND。

警告:

将ST引脚连接高于3.6V的电压下可能会永久损坏加速度计。

用Arduino测试ADXL335加速度计如何工作?相关推荐

  1. 【Arduino 和 MPU6050 加速度计和陀螺仪教程】

    [Arduino 和 MPU6050 加速度计和陀螺仪教程] 1. 概述 2. 工作原理 3. Arduino 和 MPU6050 4. MPU6050 Arduino 代码 5. MPU6050 方 ...

  2. 基于 ADXL335 加速度计的手势控制机器人

    该无线控制的机器人汽车使用手势:手的倾斜/方向来向前.向后.向左或向右行驶. 说到机器人,手势控制机器人是业余爱好者和学生在物理和实际项目中理解和实施微控制器知识的最常见的项目类型之一.其背后的概念很 ...

  3. 王家林 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程...

    这一讲主要深入使用HDFS命令行工具操作Hadoop分布式集群,主要是通过实验的配置hdfs-site.xml文件的心跳来测试replication具体的工作和流程. 通过HDFS的心跳来测试repl ...

  4. 石英加速度计的工作原理

    石英加速度计的工作原理 加速度是一种用来反映物体在运动过程中的速度变化状态的物理量,其无法直接测量,当前的加速度传感器(加速度计)采用间接测量以及力的平衡等技术来获取物体的加速度.加速度传感器的工作原 ...

  5. Arduino测试PAJ7620U2手势传感器

    目录 1.安装库 2.接线 3.下载代码测试 在淘宝买了一块PAJ7620手势传感器模块,现在就来用arduino测试一下玩玩看. 图片如下: 1.安装库 2.接线 一共四根线 VCC GND SCL ...

  6. Arduino 和 ADXL335 三轴加速计 基本例程

    ADXL335 GY-61 ADXL335三轴加速度计,性价比高,低功耗,提供经过信号调理的电压输出,该产品的满量程加速度测量范围为±3 g(最小值),可以测量倾斜检测应用中的静态重力加速度,以及运动 ...

  7. 测试或运维工作过程中最常用的几个linux命令?

    大家在测试工作过程中,可能会遇到需要你去服务器修改一些配置文件,譬如说某个字段的值是1 则关联老版本,是0则关联新版本,这时候你可能就需要会下vi的命令操作:或者查看session设置的时长,可能需要 ...

  8. 测试负责人和测试工程师在日常工作有什么不同

    作为负责人,要考虑的事情比较多,要从大局观.整体项目周期上看待问题.而测试工程师平时只要做好分配的任务就行,不需要考虑太多事情.以下是从项目各个阶段来描述作为测试负责人应该要做的工作,也算是我对平时管 ...

  9. 测试工程师如何提高工作效率

    1.明确需求范围和重点 在开需求会的时候,明确本次需求作用的是那个模块,可能会影响到哪些模块.之前有没有类似的需求,测试的重点是什么,需求模块之间的优先级是什么.将这些问题提前处理掉 2.设计高效的测 ...

最新文章

  1. java/android 设计模式学习笔记(1)--- 单例模式
  2. 这个机器狗引起网友争议,「持枪机器狗」射程达1200米
  3. CVPR 2021评审出炉,得分惨不忍睹,面对奇葩评审该如何反击?
  4. 约翰诺曼超级计算机研究中心,第433章 拉泽尔松教授的决定
  5. DL之pix2pix(cGAN)之AC:基于pix2pix(cGAN)模型实现对图像实现Auto Color自动上色技术
  6. Linux系统上的库文件的生成与使用
  7. ASP.NET MVC 2.0
  8. 生成树协议实验报告_多生成树协议MSTP
  9. 用Word2007查找和替换功能批量设置图片位置
  10. webpack及node.js基础必会--path模块的常见操作
  11. 浅谈jQuery宽高及其应用
  12. 法兰克机器人外部自动_行业数据 | 服务机器人销售额创新纪录:全球增长32
  13. PowerDesigner 逆向工程 Could not Initialize JavaVM!
  14. PostgreSQL数据库pg_test_timing学习使用
  15. Win10 + Ubuntu 安装教程(痛苦踩坑)
  16. 基于FPGA的超声波测距(verilog)
  17. 启发式算法 Heuristic Algorithm
  18. 互联网经典商战TOP 10
  19. centos7更新nvidia显卡驱动
  20. react+amcharts5柱状图demo

热门文章

  1. adk java,windows ADB配置java adk Android adk
  2. WIN10 开发者资源 ADK SDK
  3. 对流matlab程序,热对流代码MATLAB
  4. 项目管理之年度总结:不会写项目总结的项目管理不是好的管理,附带模板(比较简洁)
  5. DFT频域相乘和时域卷积计算注意点
  6. 亚马逊全球站点之北美站
  7. 人工智能之目标检测系列综述
  8. 嵌入式第0部分:嵌入式工程师完全学习指南
  9. 高项--十大管理、47个过程、五大过程组
  10. pyqt5线程的启动,暂停,恢复与停止