347浏览
楼主: 驴友花雕

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

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验串口返回情况

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验串口绘图器返回情况

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

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


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 天前

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

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

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

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 天前

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

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

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

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



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
  4.   项目之四:使用按键的自动校准功能
  5. */
  6. const int xInput = A0;
  7. const int yInput = A1;
  8. const int zInput = A2;
  9. const int buttonPin = 2;
  10. // Raw Ranges:
  11. // initialize to mid-range and allow calibration to
  12. // find the minimum and maximum for each axis
  13. int xRawMin = 512;
  14. int xRawMax = 512;
  15. int yRawMin = 512;
  16. int yRawMax = 512;
  17. int zRawMin = 512;
  18. int zRawMax = 512;
  19. // Take multiple samples to reduce noise
  20. const int sampleSize = 10;
  21. void setup()
  22. {
  23.   analogReference(EXTERNAL);
  24.   Serial.begin(9600);
  25. }
  26. void loop()
  27. {
  28.   int xRaw = ReadAxis(xInput);
  29.   int yRaw = ReadAxis(yInput);
  30.   int zRaw = ReadAxis(zInput);
  31.   if (digitalRead(buttonPin) == LOW)
  32.   {
  33.     AutoCalibrate(xRaw, yRaw, zRaw);
  34.   }
  35.   else
  36.   {
  37.     Serial.print("Raw Ranges: X: ");
  38.     Serial.print(xRawMin);
  39.     Serial.print("-");
  40.     Serial.print(xRawMax);
  41.     Serial.print(", Y: ");
  42.     Serial.print(yRawMin);
  43.     Serial.print("-");
  44.     Serial.print(yRawMax);
  45.     Serial.print(", Z: ");
  46.     Serial.print(zRawMin);
  47.     Serial.print("-");
  48.     Serial.print(zRawMax);
  49.     Serial.println();
  50.     Serial.print(xRaw);
  51.     Serial.print(", ");
  52.     Serial.print(yRaw);
  53.     Serial.print(", ");
  54.     Serial.print(zRaw);
  55.     // Convert raw values to 'milli-Gs"
  56.     long xScaled = map(xRaw, xRawMin, xRawMax, -1000, 1000);
  57.     long yScaled = map(yRaw, yRawMin, yRawMax, -1000, 1000);
  58.     long zScaled = map(zRaw, zRawMin, zRawMax, -1000, 1000);
  59.     // re-scale to fractional Gs
  60.     float xAccel = xScaled / 1000.0;
  61.     float yAccel = yScaled / 1000.0;
  62.     float zAccel = zScaled / 1000.0;
  63.     Serial.print(" :: ");
  64.     Serial.print(xAccel);
  65.     Serial.print("G, ");
  66.     Serial.print(yAccel);
  67.     Serial.print("G, ");
  68.     Serial.print(zAccel);
  69.     Serial.println("G");
  70.     delay(500);
  71.   }
  72. }
  73. //
  74. // Read "sampleSize" samples and report the average
  75. //
  76. int ReadAxis(int axisPin)
  77. {
  78.   long reading = 0;
  79.   analogRead(axisPin);
  80.   delay(1);
  81.   for (int i = 0; i < sampleSize; i++)
  82.   {
  83.     reading += analogRead(axisPin);
  84.   }
  85.   return reading / sampleSize;
  86. }
  87. //
  88. // Find the extreme raw readings from each axis
  89. //
  90. void AutoCalibrate(int xRaw, int yRaw, int zRaw)
  91. {
  92.   Serial.println("Calibrate");
  93.   if (xRaw < xRawMin)
  94.   {
  95.     xRawMin = xRaw;
  96.   }
  97.   if (xRaw > xRawMax)
  98.   {
  99.     xRawMax = xRaw;
  100.   }
  101.   if (yRaw < yRawMin)
  102.   {
  103.     yRawMin = yRaw;
  104.   }
  105.   if (yRaw > yRawMax)
  106.   {
  107.     yRawMax = yRaw;
  108.   }
  109.   if (zRaw < zRawMin)
  110.   {
  111.     zRawMin = zRaw;
  112.   }
  113.   if (zRaw > zRawMax)
  114.   {
  115.     zRawMax = zRaw;
  116.   }
  117. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 天前

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





回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 天前

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

实验串口返回情况

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 天前

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

实验串口绘图器返回情况

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 08:51

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

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

安装ADXL335.h库(https://github.com/infomaniac50/ADXL335

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 08:58

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
  4.   项目之五:使用ADXL335.h库的加速度计演示
  5. */
  6. #include <ADXL335.h>  // **引入 ADXL335 传感器库**
  7. const int pin_x = A0;  // **X 轴模拟输入**
  8. const int pin_y = A1;  // **Y 轴模拟输入**
  9. const int pin_z = A2;  // **Z 轴模拟输入**
  10. const float aref = 3.3;  // **参考电压 3.3V**
  11. ADXL335 accel(pin_x, pin_y, pin_z, aref);  // **创建 ADXL335 传感器对象**
  12. void setup() {
  13.     Serial.begin(9600);  // **初始化串口通信**
  14.    
  15.     // **串口监视器输出数据标题**
  16.     Serial.println("X,\tY,\tZ,\tRho,\tPhi,\tTheta");
  17. }
  18. void loop() {
  19.     accel.update();  // **更新传感器数据**
  20.     int string_width;  // **变量用于存储格式化字符串宽度**
  21.    
  22.     float x = accel.getX();  // **获取 X 轴加速度**
  23.     float y = accel.getY();  // **获取 Y 轴加速度**
  24.     float z = accel.getZ();  // **获取 Z 轴加速度**
  25.    
  26.     // **球坐标变量**
  27.     float rho = accel.getRho();  // **ρ:径向距离**
  28.     float phi = accel.getPhi();  // **φ:方位角**
  29.     float theta = accel.getTheta();  // **θ:极角**
  30.     // **输出数据到串口**
  31.     Serial.print(formatFloat(x, 2, &string_width));
  32.     Serial.print(",\t");
  33.     Serial.print(formatFloat(y, 2, &string_width));
  34.     Serial.print(",\t");
  35.     Serial.print(formatFloat(z, 2, &string_width));
  36.     Serial.print(",\t");
  37.     Serial.print(formatFloat(rho, 2, &string_width));
  38.     Serial.print(",\t");
  39.     Serial.print(formatFloat(phi, 2, &string_width));
  40.     Serial.print(",\t");
  41.     Serial.print(formatFloat(theta, 2, &string_width));
  42.     Serial.println("");
  43.     delay(1000);  // **每秒刷新一次数据**
  44. }
  45. /*****************************************************************************************************
  46. * **formatFloat**
  47. *  - 格式化浮点数,使其转换为固定小数位数的字符串
  48. *  - 处理特殊情况,例如 **无穷大(Inf)、无效数值(NaN)**
  49. *****************************************************************************************************/
  50. String formatFloat(double value, int places, int* string_width) {
  51.     // **检查是否为正无穷**
  52.     if (isinf(value) > 0) {
  53.         return "+Inf";
  54.     }
  55.     // **Arduino 没有负无穷,但保留这部分代码**
  56.     if (isinf(value) < 0) {
  57.         return "-Inf";
  58.     }
  59.     // **检查是否为 NaN(非法数值)**
  60.     if (isnan(value) > 0) {
  61.         return "NaN";
  62.     }
  63.     // **字符串宽度计算**
  64.     int num_width = 1;  // **初始宽度(包括小数点)**
  65.     // **确保小数位数至少为 1**
  66.     if (places < 1) {
  67.         places = 1;
  68.         value = (float)((int)value);  // **舍去小数部分**
  69.     }
  70.     num_width += places;  // **添加小数位数宽度**
  71.     // **处理小于 1 的情况**
  72.     if (value < 1.0 && value > -1.0) {
  73.         num_width++;  // **额外空间存储 "0."**
  74.     } else {
  75.         num_width += ((int)log10(abs(value))) + 1;  // **计算整数部分宽度**
  76.     }
  77.     // **处理负数**
  78.     if (value < 0.0) {
  79.         num_width++;  // **预留负号**
  80.     }
  81.     // **创建字符数组用于存储字符串**
  82.     char s[num_width + 1];  
  83.     s[num_width] = '\0';  // **字符串结束符**
  84.     // **初始化数组**
  85.     for (int i = 0; i < num_width; i++) {
  86.         s[i] = '0';
  87.     }
  88.     // **设置输出字符串宽度**
  89.     *string_width = num_width;
  90.     // **使用 AVR `dtostrf` 函数格式化浮点数**
  91.     return String(dtostrf(value, num_width, places, s));  
  92. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 09:04

【花雕学编程】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 传感器不断采集加速度数据,并格式化输出到串口。



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 09:06

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

实验串口返回情况

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 09:08

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

实验串口绘图器返回情况

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:02

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

实验模块接线示意图

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:04

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百三十九:GY-61 ADXL335模拟量加速度模块 倾斜角度三轴加速度传感器
  4.   项目之六:使用 OLED 显示屏显示实时运动状态
  5. */
  6. #include "Arduino.h"
  7. #include "U8g2lib.h"
  8. #include "Wire.h"
  9. #define X_PIN A0  // 加速度计 X 轴输入
  10. #define Y_PIN A1  // 加速度计 Y 轴输入
  11. #define Z_PIN A2  // 加速度计 Z 轴输入
  12. U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);  // OLED 显示对象
  13. void setup() {
  14.     Wire.begin();           // 启动 I2C
  15.     Serial.begin(115200);   // 初始化串口
  16.     oled.begin();           // 初始化 OLED
  17.     oled.setFont(u8g2_font_ncenB18_tr);  // 设置字体
  18. }
  19. void loop() {  
  20.     int xRaw = analogRead(X_PIN);
  21.     int yRaw = analogRead(Y_PIN);
  22.     int zRaw = analogRead(Z_PIN);
  23.     const float SCALE = 102.3;  // 灵敏度 330mV/g 转换因子
  24.     float xAcc = ((float)xRaw - 331.5) / 65 * 9.8;
  25.     float yAcc = ((float)yRaw - 329.5) / 68.5 * 9.8;
  26.     float zAcc = ((float)zRaw - 340) / 68 * 9.8;
  27.     // 串口输出格式化加速度数据
  28.     Serial.print("X: ");
  29.     Serial.print(xAcc, 2);
  30.     Serial.print(" m/s² | Y: ");
  31.     Serial.print(yAcc, 2);
  32.     Serial.print(" m/s² | Z: ");
  33.     Serial.println(zAcc, 2);
  34.     // 在 OLED 显示加速度数据
  35.     oledDisplayAcceleration(xAcc, yAcc, zAcc);
  36.     delay(200);  // 适当延迟防止频繁刷新
  37. }
  38. /*****************************************************************************************************
  39. * 在 OLED 显示加速度数据
  40. *****************************************************************************************************/
  41. void oledDisplayAcceleration(float x, float y, float z) {
  42.     oled.firstPage();
  43.     do {
  44.         oled.setCursor(2, 20);
  45.         oled.print("X: ");
  46.         oled.print(x, 2);
  47.         oled.setCursor(2, 40);
  48.         oled.print("Y: ");
  49.         oled.print(y, 2);
  50.         oled.setCursor(2, 60);
  51.         oled.print("Z: ");
  52.         oled.print(z, 2);
  53.     } while (oled.nextPage());
  54. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:06

【花雕学编程】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 屏幕上。




回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:09

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

实验串口返回情况

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:11

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

实验串口绘图器返回情况

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:17

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

实验场景图  动态图

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:18

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail