回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(239)---GY-61 ADXL335使用按键的自动校准功能 简单

头像 驴友花雕 2025.05.10 14 0

0-.jpg
02.jpg
04.jpg
05--.jpg

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器

  项目之四:使用按键的自动校准功能

 

静态校准:

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

 

重力作为校准参考

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

 

校准方法:

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


08-8.jpg

08-9.jpg
08-10.jpg

运行校准程序
将代码加载到 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 轴数据,并提供 自动校准功能,核心逻辑如下:

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 毫秒更新一次数据,适合实时监测
这段代码让 加速度传感器能够动态校准并稳定采集数据


实验串口返回情况

 

08-11.jpg

实验串口绘图器返回情况

 

07-1.jpg
08-12.jpg
08-13.jpg

评论

user-avatar
icon 他的勋章
    展开更多