驴友花雕 发表于 2025-5-9 09:16:44

【花雕学编程】Arduino动手做(239)---ADXL335三轴6个小实验

本帖最后由 驴友花雕 于 2025-5-12 11:19 编辑

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335 模拟量加速度模块 倾斜角度三轴加速度传感器模块





驴友花雕 发表于 2025-5-12 08:58:49

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335三轴模块

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之五:使用ADXL335.h库的加速度计演示
*/

#include <ADXL335.h>// **引入 ADXL335 传感器库**

const int pin_x = A0;// **X 轴模拟输入**
const int pin_y = A1;// **Y 轴模拟输入**
const int pin_z = A2;// **Z 轴模拟输入**
const float aref = 3.3;// **参考电压 3.3V**
ADXL335 accel(pin_x, pin_y, pin_z, aref);// **创建 ADXL335 传感器对象**

void setup() {
    Serial.begin(9600);// **初始化串口通信**
   
    // **串口监视器输出数据标题**
    Serial.println("X,\tY,\tZ,\tRho,\tPhi,\tTheta");
}

void loop() {
    accel.update();// **更新传感器数据**

    int string_width;// **变量用于存储格式化字符串宽度**
   
    float x = accel.getX();// **获取 X 轴加速度**
    float y = accel.getY();// **获取 Y 轴加速度**
    float z = accel.getZ();// **获取 Z 轴加速度**
   
    // **球坐标变量**
    float rho = accel.getRho();// **ρ:径向距离**
    float phi = accel.getPhi();// **φ:方位角**
    float theta = accel.getTheta();// **θ:极角**

    // **输出数据到串口**
    Serial.print(formatFloat(x, 2, &string_width));
    Serial.print(",\t");
    Serial.print(formatFloat(y, 2, &string_width));
    Serial.print(",\t");
    Serial.print(formatFloat(z, 2, &string_width));
    Serial.print(",\t");
    Serial.print(formatFloat(rho, 2, &string_width));
    Serial.print(",\t");
    Serial.print(formatFloat(phi, 2, &string_width));
    Serial.print(",\t");
    Serial.print(formatFloat(theta, 2, &string_width));
    Serial.println("");

    delay(1000);// **每秒刷新一次数据**
}

/*****************************************************************************************************
* **formatFloat**
*- 格式化浮点数,使其转换为固定小数位数的字符串
*- 处理特殊情况,例如 **无穷大(Inf)、无效数值(NaN)**
*****************************************************************************************************/
String formatFloat(double value, int places, int* string_width) {
    // **检查是否为正无穷**
    if (isinf(value) > 0) {
      return "+Inf";
    }

    // **Arduino 没有负无穷,但保留这部分代码**
    if (isinf(value) < 0) {
      return "-Inf";
    }

    // **检查是否为 NaN(非法数值)**
    if (isnan(value) > 0) {
      return "NaN";
    }

    // **字符串宽度计算**
    int num_width = 1;// **初始宽度(包括小数点)**

    // **确保小数位数至少为 1**
    if (places < 1) {
      places = 1;
      value = (float)((int)value);// **舍去小数部分**
    }

    num_width += places;// **添加小数位数宽度**

    // **处理小于 1 的情况**
    if (value < 1.0 && value > -1.0) {
      num_width++;// **额外空间存储 "0."**
    } else {
      num_width += ((int)log10(abs(value))) + 1;// **计算整数部分宽度**
    }

    // **处理负数**
    if (value < 0.0) {
      num_width++;// **预留负号**
    }

    // **创建字符数组用于存储字符串**
    char s;
    s = '\0';// **字符串结束符**

    // **初始化数组**
    for (int i = 0; i < num_width; i++) {
      s = '0';
    }

    // **设置输出字符串宽度**
    *string_width = num_width;

    // **使用 AVR `dtostrf` 函数格式化浮点数**
    return String(dtostrf(value, num_width, places, s));
}

驴友花雕 发表于 2025-5-10 16:07:07

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335三轴模块

【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;
}
}

驴友花雕 发表于 2025-5-12 11:04:53

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335三轴模块

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之六:使用 OLED 显示屏显示实时运动状态

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之六:使用 OLED 显示屏显示实时运动状态
*/

#include "Arduino.h"
#include "U8g2lib.h"
#include "Wire.h"

#define X_PIN A0// 加速度计 X 轴输入
#define Y_PIN A1// 加速度计 Y 轴输入
#define Z_PIN A2// 加速度计 Z 轴输入

U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);// OLED 显示对象

void setup() {
    Wire.begin();         // 启动 I2C
    Serial.begin(115200);   // 初始化串口
    oled.begin();         // 初始化 OLED
    oled.setFont(u8g2_font_ncenB18_tr);// 设置字体
}

void loop() {
    int xRaw = analogRead(X_PIN);
    int yRaw = analogRead(Y_PIN);
    int zRaw = analogRead(Z_PIN);

    const float SCALE = 102.3;// 灵敏度 330mV/g 转换因子
    float xAcc = ((float)xRaw - 331.5) / 65 * 9.8;
    float yAcc = ((float)yRaw - 329.5) / 68.5 * 9.8;
    float zAcc = ((float)zRaw - 340) / 68 * 9.8;

    // 串口输出格式化加速度数据
    Serial.print("X: ");
    Serial.print(xAcc, 2);
    Serial.print(" m/s² | Y: ");
    Serial.print(yAcc, 2);
    Serial.print(" m/s² | Z: ");
    Serial.println(zAcc, 2);

    // 在 OLED 显示加速度数据
    oledDisplayAcceleration(xAcc, yAcc, zAcc);

    delay(200);// 适当延迟防止频繁刷新
}

/*****************************************************************************************************
* 在 OLED 显示加速度数据
*****************************************************************************************************/
void oledDisplayAcceleration(float x, float y, float z) {
    oled.firstPage();
    do {
      oled.setCursor(2, 20);
      oled.print("X: ");
      oled.print(x, 2);

      oled.setCursor(2, 40);
      oled.print("Y: ");
      oled.print(y, 2);

      oled.setCursor(2, 60);
      oled.print("Z: ");
      oled.print(z, 2);
    } while (oled.nextPage());
}

驴友花雕 发表于 2025-5-9 09:25:26

【花雕学编程】Arduino动手做(239)---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 可以监测患者的肢体运动情况,为医生提供数据支持,评估康复效果。



驴友花雕 发表于 2025-5-9 09:38:03

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335三轴模块




驴友花雕 发表于 2025-5-9 09:39:27

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335三轴模块




驴友花雕 发表于 2025-5-9 09:40:54

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335三轴模块




驴友花雕 发表于 2025-5-9 09:45:17

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335三轴模块

实验模块接线示意图




驴友花雕 发表于 2025-5-9 10:49:31

【花雕学编程】Arduino动手做(239)---GY-61最测试评估方案

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之一:最简单的测试评估方案

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之一:最简单的测试评估方案
*/

void setup() {
Serial.begin(9600);
}

void loop() {
float x = (analogRead(A0) * 3.3 / 1023.0 - 1.65) / 0.05;
float y = (analogRead(A1) * 3.3 / 1023.0 - 1.65) / 0.05;
float z = (analogRead(A2) * 3.3 / 1023.0 - 1.65) / 0.05;

Serial.print(x, 2);
Serial.print("\t");
Serial.print(y, 2);
Serial.print("\t");
Serial.println(z, 2);

delay(100);
}   

驴友花雕 发表于 2025-5-9 10:52:07

【花雕学编程】Arduino动手做(239)---GY-61最测试评估方案

代码解读

这段代码使用 模拟传感器(如加速度计) 读取 X、Y、Z 轴数据 并通过 串口打印输出,核心逻辑如下:

1. 初始化
✅ Serial.begin(9600); → 启动串口通信,波特率 9600

2. 读取模拟数据
✅ analogRead(A0), analogRead(A1), analogRead(A2) → 分别读取 X、Y、Z 轴的模拟数据
✅ * 3.3 / 1023.0 → 将 ADC(01023)转换为电压(03.3V)
✅ - 1.65 → 将电压值归一化,使 1.65V 作为 0 点
✅ / 0.05 → 转换为加速度值(假设灵敏度为 0.05V/g)

3. 串口输出
✅ Serial.print(x, 2); Serial.print("\t"); → 打印 X 轴数据,并使用制表符分隔
✅ Serial.println(z, 2); → 打印 Z 轴数据,并换行

4. 循环采集
✅ delay(100); → 每 100 毫秒更新一次数据,使波形平滑
这段代码让 加速度传感器不断读取 XYZ 数据,并在串口显示





驴友花雕 发表于 2025-5-9 11:02:18

【花雕学编程】Arduino动手做(239)---GY-61最测试评估方案

实验串口绘图器返回情况






驴友花雕 发表于 2025-5-9 11:03:30

【花雕学编程】Arduino动手做(239)---GY-61最测试评估方案

实验场景图动态图


驴友花雕 发表于 2025-5-9 11:04:55

【花雕学编程】Arduino动手做(239)---GY-61最简测试方案


驴友花雕 发表于 2025-5-9 14:35:25

【花雕学编程】Arduino动手做(239)--GY-61 ADXL335三轴传感

ADXL335加速度计连接到 Arduino UNO

首先将加速计放在试验板上。将 VCC 引脚连接到 Arduino 的 5V 引脚,将 GND 引脚连接到 Arduino 的 Ground 引脚。将 X、Y 和 Z 输出连接到 Arduino 的模拟引脚 A0、A1 和 A2。

这里更改 Arduino 的模拟参考 (AREF) 电压才能获得精确的结果。这可以通过将 Arduino 的 3.3V 引脚连接到 AREF 引脚来实现。


【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之二:更改Arduino 的模拟参考 AREF 电压 获得精确结果

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之二:更改Arduino 的模拟参考 AREF 电压 获得精确结果
*/

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 values
int 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 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");

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;
}

驴友花雕 发表于 2025-5-9 14:40:08

【花雕学编程】Arduino动手做(239)--GY-61 ADXL335三轴传感

代码解读

这段代码使用 模拟传感器(如加速度计) 采集 X、Y、Z 轴数据 并转换为 加速度值(单位 G),核心逻辑如下:

1. 传感器连接
✅ const int xInput = A0; → X 轴信号连接到 A0
✅ const int yInput = A1; → Y 轴信号连接到 A1
✅ const int zInput = A2; → Z 轴信号连接到 A2

2. 初始化
✅ analogReference(EXTERNAL); → 使用外部参考电压,提高精度
✅ Serial.begin(9600); → 启动串口通信

3. 读取并处理数据
✅ ReadAxis(xInput); → 采集 X、Y、Z 轴数据
✅ map(xRaw, RawMin, RawMax, -3000, 3000); → 将 ADC 值映射到 milli-G(±3G)
✅ / 1000.0 → 转换为 G(加速度单位)

4. 串口输出
✅ Serial.print(xAccel, 0); → 打印 X 轴加速度(单位 G)
✅ Serial.print(yAccel, 0); Serial.print(zAccel, 0); → 打印 Y、Z 轴加速度
✅ 以格式化方式输出数据,便于查看

5. 采样优化
✅ sampleSize = 10; → 每次采集 10 次求平均值,减少噪声
✅ delay(1); → 防止连续读取过快,提高稳定性

这段代码让 加速度传感器不断采集 XYZ 数据,并在串口显示。

驴友花雕 发表于 2025-5-9 14:41:55

【花雕学编程】Arduino动手做(239)--GY-61 ADXL335三轴传感

实验串口返回情况


驴友花雕 发表于 2025-5-9 15:07:28

【花雕学编程】Arduino动手做(239)--GY-61 ADXL335三轴传感

实验串口绘图器返回情况




驴友花雕 发表于 2025-5-9 15:10:21

【花雕学编程】Arduino动手做(239)---测试GY-61 ADXL335


驴友花雕 发表于 2025-5-9 15:11:37

【花雕学编程】Arduino动手做(239)---测试GY-61 ADXL335

本帖最后由 驴友花雕 于 2025-5-9 15:16 编辑

实验记录视频(36秒)

【【花雕学编程】Arduino动手做(239)---测试GY-61 ADXL335三轴加速度传感器#单片机开发 #电子爱好者 #嵌入式 #科技改变生活 #编程】

https://www.bilibili.com/video/BV12e5VzqEnM/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987

https://www.bilibili.com/video/BV12e5VzqEnM/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987

驴友花雕 发表于 2025-5-9 16:21:18

【花雕学编程】Arduino动手做(239)---测试GY-61 ADXL335

下图显示了串行监视器上不同位置的加速度计输出。




驴友花雕 发表于 2025-5-9 20:37:20

【花雕学编程】Arduino动手做(239)---测试GY-61 ADXL335

关于 ADXL 335 加速度计
什么是加速度和 ADXL 335 加速度计?加速度是速度随时间变化的过程,它是一个矢量。同样,速度是速度和方向。有两种方法可以解释任何事物的加速度:第一种是速度的变化,第二种是方向的变化。有时两者会同时更改。如果我们谈论 ADXL 335 加速度计,那么这个加速度计是一种用于测量任何物体加速度的设备。它以模拟输入的形式测量 X、Y 和 Z 等三维方向的加速度。它是低噪音和低功耗的设备。当它用于加速度测量目的时,它与任何类型的控制器(如微控制器或 Arduino 等)连接。它多用于建筑作业机械,如钻孔、打桩、拆迁等,人类活动机械如跑步、行走、跳舞和跳绳等。它很容易在市场上或网上商店买到。

ADXL 335 加速度计的引脚配置



ADXL 335 加速度计的工作原理
目前市场上有不同类型的加速度计,用于不同的目的。有些工作原理是 MEMS(微机电传感器)的工作原理。它由一个小质量组成,该质量被蚀刻到硅表面,然后集成到一个小电路中。当力施加在这个质量上时,它会覆盖一些位移,因此根据牛顿第二运动定律 F= 马 在这个质量中产生加速度,由其传感器感应。同样,如果我们谈论模拟加速度计,那么它们的工作原理有两个原则,例如电容感应和压电感应。两者都有不同的优点和缺点。同样,ADXL335加速度计是一种模拟加速度计,因此它的工作原理是电容感应。在电容式感应加速度计中,当它向任何方向移动时,其电容都会发生变化。当该电容发生变化时,其模拟电压会发生变化,这由其接口控制器感应。



驴友花雕 发表于 2025-5-9 20:47:41

【花雕学编程】Arduino动手做(239)---测试GY-61 ADXL335

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之三:使用模拟电压计算出设备的滚动和俯仰的数值

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之三:使用模拟电压计算出设备的滚动和俯仰的数值
*/

#include <math.h>
const int x_out = A0; /* connect x_out of module to A0 of UNO board */
const int y_out = A1; /* connect y_out of module to A1 of UNO board */
const int z_out = A2; /* connect z_out of module to A2 of UNO board */

void setup() {
Serial.begin(9600);
}

void loop() {
int x_adc_value, y_adc_value, z_adc_value;
double x_g_value, y_g_value, z_g_value;
double roll, pitch, yaw;
x_adc_value = analogRead(x_out); /* Digital value of voltage on x_out pin */
y_adc_value = analogRead(y_out); /* Digital value of voltage on y_out pin */
z_adc_value = analogRead(z_out); /* Digital value of voltage on z_out pin */
Serial.print("x = ");
Serial.print(x_adc_value);
Serial.print("\t\t");
Serial.print("y = ");
Serial.print(y_adc_value);
Serial.print("\t\t");
Serial.print("z = ");
Serial.print(z_adc_value);
Serial.print("\t\t");
//delay(100);

x_g_value = ( ( ( (double)(x_adc_value * 5)/1024) - 1.65 ) / 0.330 ); /* Acceleration in x-direction in g units */
y_g_value = ( ( ( (double)(y_adc_value * 5)/1024) - 1.65 ) / 0.330 ); /* Acceleration in y-direction in g units */
z_g_value = ( ( ( (double)(z_adc_value * 5)/1024) - 1.80 ) / 0.330 ); /* Acceleration in z-direction in g units */

roll = ( ( (atan2(y_g_value,z_g_value) * 180) / 3.14 ) + 180 ); /* Formula for roll */
pitch = ( ( (atan2(z_g_value,x_g_value) * 180) / 3.14 ) + 180 ); /* Formula for pitch */
//yaw = ( ( (atan2(x_g_value,y_g_value) * 180) / 3.14 ) + 180 ); /* Formula for yaw */
/* Not possible to measure yaw using accelerometer. Gyroscope must be used if yaw is also required */

Serial.print("Roll = ");
Serial.print(roll);
Serial.print("\t");
Serial.print("Pitch = ");
Serial.print(pitch);
Serial.print("\n\n");
delay(1000);
}

驴友花雕 发表于 2025-5-9 20:51:17

【花雕学编程】Arduino动手做(239)---测试GY-61 ADXL335

代码解读

这段代码使用 加速度传感器 采集 X、Y、Z 轴的运动数据,并计算 倾斜角度(Roll 和 Pitch),核心逻辑如下:

1. 传感器连接
✅ const int x_out = A0; → X 轴信号连接到 A0
✅ const int y_out = A1; → Y 轴信号连接到 A1
✅ const int z_out = A2; → Z 轴信号连接到 A2

2. 读取加速度数据
✅ analogRead(x_out); → 读取 X 轴的电压信号
✅ analogRead(y_out); → 读取 Y 轴的电压信号
✅ analogRead(z_out); → 读取 Z 轴的电压信号
✅ 转换为加速度值(单位 G) → 计算公式:

cpp
x_g_value = ((x_adc_value * 5.0 / 1024) - 1.65) / 0.330;
⚠ 注意: 1.65V 是 零重力点,0.330V/G 是 灵敏度(不同传感器可能不同)

3. 计算倾斜角度
✅ atan2(y_g_value, z_g_value) → 计算 Roll(翻滚角度)
✅ atan2(z_g_value, x_g_value) → 计算 Pitch(俯仰角度)
✅ 转化为角度(度数) → * 180 / 3.14

4. 输出数据
✅ Serial.print("Roll = "); Serial.print(roll); → 打印 Roll 角度
✅ Serial.print("Pitch = "); Serial.print(pitch); → 打印 Pitch 角度

5. 采集间隔
✅ delay(1000); → 每秒采集一次数据,适合稳定读取

6. 为什么没有 Yaw?
⚠ Yaw(偏航角)无法直接从加速度计计算出来,因为加速度计只能检测线性加速度,而偏航角需要陀螺仪。

这个代码让加速度传感器不断采集 XYZ 运动数据,并计算设备的倾斜角度。





页: [1] 2 3
查看完整版本: 【花雕学编程】Arduino动手做(239)---ADXL335三轴6个小实验