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

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

实验串口返回情况


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

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

实验串口绘图器返回情况






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

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






驴友花雕 发表于 2025-5-10 15:54:26

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

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
项目之四:使用按键的自动校准功能

静态校准:
与所有传感器一样,这些加速度计的样本之间的输出存在一些差异。对于非关键应用,例如游戏控制器或简单的运动或倾斜传感器,这些变化并不重要。但对于需要精确测量的应用,最好根据可靠的参考进行校准。

重力作为校准参考
加速度以重力或“G”为单位测量,其中 1G 代表地球表面的引力。尽管您可能听说过,但重力是一种非常稳定的力,如果您碰巧是居住在地表的地球人,它可以成为方便可靠的校准参考。

校准方法:
要将传感器校准到重力参考,您需要确定每个轴与引力轴精确对齐时的传感器输出。实验室质量校准使用精密定位夹具。这里描述的方法很简单,并且给出了非常好的结果。



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

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





运行校准程序
将代码加载到 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



驴友花雕 发表于 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-10 16:10:26

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

代码解读

这段代码使用 加速度传感器 采集 X、Y、Z 轴数据,并提供 自动校准功能,核心逻辑如下:

1. 初始化传感器
✅ const int xInput = A0; → X 轴连接 A0
✅ const int yInput = A1; → Y 轴连接 A1
✅ const int zInput = A2; → Z 轴连接 A2
✅ const int buttonPin = 2; → 按钮用于触发自动校准
✅ analogReference(EXTERNAL); → 使用外部参考电压,提高精度

2. 读取加速度数据
✅ ReadAxis(xInput); → 采集 X 轴的电压数据
✅ ReadAxis(yInput); → 采集 Y 轴的电压数据
✅ ReadAxis(zInput); → 采集 Z 轴的电压数据
✅ 多次采样(10 次)求平均值,减少噪声

3. 自动校准
✅ 按下按钮时调用 AutoCalibrate(),动态调整 最小/最大值
✅ 不断更新 xRawMin、xRawMax 等范围,提高测量精度

4. 数据转换
✅ map(xRaw, xRawMin, xRawMax, -1000, 1000); → 将 ADC 值转换为 milli-G(±1G)
✅ / 1000.0 → 转换为 G(加速度单位)

5. 串口输出
✅ Serial.print("Raw Ranges: X: "); Serial.print(xRawMin); → 打印 X 轴的最小/最大值
✅ 以 G 为单位显示加速度数据,格式化输出

6. 采集间隔
✅ delay(500); → 每 500 毫秒更新一次数据,适合实时监测
这段代码让 加速度传感器能够动态校准并稳定采集数据





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

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

实验串口返回情况


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

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

实验串口绘图器返回情况




驴友花雕 发表于 2025-5-12 08:51:44

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

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

安装ADXL335.h库(https://github.com/infomaniac50/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-12 09:04:53

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

代码简单解读

这段代码使用 ADXL335 加速度传感器 读取 X、Y、Z 轴加速度,并计算 球坐标参数(ρ、φ、θ),核心逻辑如下:

1. 初始化加速度传感器
✅ ADXL335 accel(pin_x, pin_y, pin_z, aref); → 定义 ADXL335 传感器,并设定引脚和参考电压

2. 采集加速度数据
✅ accel.update(); → 更新传感器数据
✅ accel.getX(); → 获取 X 轴加速度
✅ accel.getY(); → 获取 Y 轴加速度
✅ accel.getZ(); → 获取 Z 轴加速度

3. 计算球坐标
✅ accel.getRho(); → 计算径向距离(ρ)
✅ accel.getPhi(); → 计算方位角(φ)
✅ accel.getTheta(); → 计算极角(θ)

4. 格式化数据并输出
✅ formatFloat(x, 2, &string_width); → 格式化浮点数
✅ Serial.print(); → 将数据打印到串口监视器

5. 采集间隔
✅ delay(1000); → 每秒更新一次数据

这段代码让 ADXL335 传感器不断采集加速度数据,并格式化输出到串口。



驴友花雕 发表于 2025-5-12 09:06:54

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

实验串口返回情况


驴友花雕 发表于 2025-5-12 09:08:41

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

实验串口绘图器返回情况


驴友花雕 发表于 2025-5-12 11:02:24

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

实验模块接线示意图


驴友花雕 发表于 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-12 11:06:35

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

代码简单解读

这段代码使用 ADXL335 加速度传感器 通过 Arduino 采集 X、Y、Z 轴加速度数据,并使用 OLED 显示屏 显示实时运动状态,核心逻辑如下:

1. 传感器数据采集
✅ analogRead(X_PIN); → 读取 X 轴模拟输入
✅ analogRead(Y_PIN); → 读取 Y 轴模拟输入
✅ analogRead(Z_PIN); → 读取 Z 轴模拟输入
✅ 将原始 ADC 值转换为加速度(单位:m/s²)

2. 串口输出
✅ Serial.print(); → 格式化并输出 X、Y、Z 轴加速度
✅ 确保单位为 m/s²,提高数据可读性

3. OLED 显示
✅ 使用 oledDisplayAcceleration(xAcc, yAcc, zAcc); 显示数据
✅ 优化文字排版,确保信息清晰可见

4. 采集间隔
✅ delay(200); → 适当延迟,防止 OLED 频繁刷新

这段代码让 Arduino 读取加速度数据,并实时显示在 OLED 屏幕上。




驴友花雕 发表于 2025-5-12 11:09:02

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

实验串口返回情况


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

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

实验串口绘图器返回情况


驴友花雕 发表于 2025-5-12 11:17:05

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

实验场景图动态图




驴友花雕 发表于 2025-5-12 11:18:31

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


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