《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID 及 Arduino TFT 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
https://blog.csdn.net/weixin_41659040/category_12422453.html
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
**【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335 模拟量加速度模块 倾斜角度三轴加速度传感器模块 **
ADXL335 概述
ADXL335 是一款由美国模拟器件公司(ADI)推出的低成本、小尺寸、低功耗的三轴加速度传感器。ADXL335 是一款小尺寸、薄型、低功耗、完整的三轴加速度计,提供经过信号调理的电压输出,能以最小±3 g 的满量程范围测量加速度。它可以测量倾斜检测应用中的静态重力加速度,以及运动、冲击或振动导致的动态加速度。用户使用 CX、CY和 CZ引脚上的电容 XOUT、YOUT和 ZOUT选择该加速度计的带宽。可以根据应用选择合适的带宽,X 轴和 Y 轴的带宽范围为 0.5 Hz 至 1600 Hz,Z 轴的带宽范围为0.5 Hz 至 550 Hz。ADXL335 提供小尺寸、薄型、16 引脚、4 mm × 4 mm × 1.45 mm 塑料引脚架构芯片级封装(LFCSP_LQ)。
1、主要特点
测量范围:可测量三个轴向(X、Y、Z)的加速度,每个轴的测量范围为 ±3g。
高灵敏度:具有较高的灵敏度,能精确检测到微小的加速度变化,典型灵敏度为 250mV/g,这使得它可以感知到非常小的运动或振动。
低功耗:工作电流低,通常在 2.3mA 左右,适合电池供电的设备,有助于延长设备的电池续航时间。
小尺寸:采用小型的 LCC 表面贴装封装形式,尺寸仅为 5mm×5mm×2mm,便于集成到各种小型化的产品中。
模拟输出:提供与加速度成正比的模拟电压输出,方便与微控制器、放大器等其他模拟电路接口,易于信号处理和转换。
2、工作原理
基于微机电系统(MEMS)技术,利用内部的可动质量块在加速度作用下产生位移,通过检测电容变化来测量加速度。当有加速度作用于传感器时,质量块会产生相应的位移,导致电容值发生变化,经过内部的信号处理电路将电容变化转换为与加速度成正比的模拟电压输出。
3、应用领域
(1)消费电子:常用于手机、平板电脑、游戏机等设备中,实现屏幕自动旋转、运动游戏控制、跌落检测等功能。例如,在手机中,ADXL335 可以检测手机的方向变化,从而自动切换屏幕显示方向,提供更好的用户体验。
(2)汽车电子:可应用于汽车的安全气囊触发、车辆姿态监测、轮胎压力监测系统等。比如,在安全气囊系统中,ADXL335 能够实时监测车辆的加速度变化,当检测到碰撞等突发情况时,及时触发安全气囊弹出,保护乘客安全。
(3)工业监测:用于工业设备的振动监测、故障诊断以及机器人的运动控制等方面。通过监测设备的振动情况,ADXL335 可以帮助工程师及时发现设备的异常运行状态,提前进行维护和维修,减少设备停机时间和维修成本。
(4)医疗设备:在一些可穿戴式医疗设备和便携式医疗仪器中,用于监测人体的运动状态、姿态变化等,辅助医疗诊断和康复治疗。例如,在康复训练设备中,ADXL335 可以监测患者的肢体运动情况,为医生提供数据支持,评估康复效果。
实验模块接线示意图
静态校准:
与所有传感器一样,这些加速度计的样本之间的输出存在一些差异。对于非关键应用,例如游戏控制器或简单的运动或倾斜传感器,这些变化并不重要。但对于需要精确测量的应用,最好根据可靠的参考进行校准。
重力作为校准参考
加速度以重力或“G”为单位测量,其中 1G 代表地球表面的引力。尽管您可能听说过,但重力是一种非常稳定的力,如果您碰巧是居住在地表的地球人,它可以成为方便可靠的校准参考。
校准方法:
要将传感器校准到重力参考,您需要确定每个轴与引力轴精确对齐时的传感器输出。实验室质量校准使用精密定位夹具。这里描述的方法很简单,并且给出了非常好的结果。
运行校准程序
将代码加载到 Arduino 上并运行它。
打开 串行监视器。
将带有传感器的试验板放在平坦的表面上
按住该按钮,直到您在串行监视器中看到“校准”。
这将校准 z 轴的最小值。
将试验板放在前边缘,然后再次按下按钮。校准 +Y
对其他三个边重复此作,以校准 +x、-y 和 -x。
将试验板倒置并再次按下按钮以校准 +z。(提示,桌子的底部可以很好地稳定它。
校准程序输出:
校准后,输出将显示每个轴的校准原始范围,然后是测得的“G”力。原始范围可用作草图中的常量。
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 : : -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
511, 511, 625 :: -0.01G, 0.07G, 1.00G
原始范围: X: 408-616, Y: 398-610, Z: 422-625
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之四:使用按键的自动校准功能
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之四:使用按键的自动校准功能
*/
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
const int buttonPin = 2;
// Raw Ranges:
// initialize to mid-range and allow calibration to
// find the minimum and maximum for each axis
int xRawMin = 512;
int xRawMax = 512;
int yRawMin = 512;
int yRawMax = 512;
int zRawMin = 512;
int zRawMax = 512;
// Take multiple samples to reduce noise
const int sampleSize = 10;
void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
}
void loop()
{
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);
if (digitalRead(buttonPin) == LOW)
{
AutoCalibrate(xRaw, yRaw, zRaw);
}
else
{
Serial.print("Raw Ranges: X: ");
Serial.print(xRawMin);
Serial.print("-");
Serial.print(xRawMax);
Serial.print(", Y: ");
Serial.print(yRawMin);
Serial.print("-");
Serial.print(yRawMax);
Serial.print(", Z: ");
Serial.print(zRawMin);
Serial.print("-");
Serial.print(zRawMax);
Serial.println();
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, xRawMin, xRawMax, -1000, 1000);
long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);
// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;
Serial.print(" :: ");
Serial.print(xAccel);
Serial.print("G, ");
Serial.print(yAccel);
Serial.print("G, ");
Serial.print(zAccel);
Serial.println("G");
delay(500);
}
}
//
// Read "sampleSize" samples and report 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;
}
//
// Find the extreme raw readings from each axis
//
void AutoCalibrate(int xRaw, int yRaw, int zRaw)
{
Serial.println("Calibrate");
if (xRaw < xRawMin)
{
xRawMin = xRaw;
}
if (xRaw > xRawMax)
{
xRawMax = xRaw;
}
if (yRaw < yRawMin)
{
yRawMin = yRaw;
}
if (yRaw > yRawMax)
{
yRawMax = yRaw;
}
if (zRaw < zRawMin)
{
zRawMin = zRaw;
}
if (zRaw > zRawMax)
{
zRawMax = zRaw;
}
}
代码解读
这段代码使用 加速度传感器 采集 X、Y、Z 轴数据,并提供 自动校准功能,核心逻辑如下:
-
初始化传感器
✅ const int xInput = A0; → X 轴连接 A0
✅ const int yInput = A1; → Y 轴连接 A1
✅ const int zInput = A2; → Z 轴连接 A2
✅ const int buttonPin = 2; → 按钮用于触发自动校准
✅ analogReference(EXTERNAL); → 使用外部参考电压,提高精度 -
读取加速度数据
✅ ReadAxis(xInput); → 采集 X 轴的电压数据
✅ ReadAxis(yInput); → 采集 Y 轴的电压数据
✅ ReadAxis(zInput); → 采集 Z 轴的电压数据
✅ 多次采样(10 次)求平均值,减少噪声 -
自动校准
✅ 按下按钮时调用 AutoCalibrate(),动态调整 最小/最大值
✅ 不断更新 xRawMin、xRawMax 等范围,提高测量精度 -
数据转换
✅ map(xRaw, xRawMin, xRawMax, -1000, 1000); → 将 ADC 值转换为 milli-G(±1G)
✅ / 1000.0 → 转换为 G(加速度单位) -
串口输出
✅ Serial.print("Raw Ranges: X: "); Serial.print(xRawMin); → 打印 X 轴的最小/最大值
✅ 以 G 为单位显示加速度数据,格式化输出 -
采集间隔
✅ delay(500); → 每 500 毫秒更新一次数据,适合实时监测
这段代码让 加速度传感器能够动态校准并稳定采集数据
实验串口返回情况
实验串口绘图器返回情况