基于陀螺仪传感器与 Arduino Nano 的精准钻床钻深显示器
核心硬件
| 组件 | 数量/规格 |
|---|---|
| Arduino Nano R3 | 1 |
| GY-521 (MPU-6050) 六轴模块 | 1 |
| 8 位 7 段数码管模块(MAX7219 SPI) | 1 |
| 轻触按键 | 1 |
| 拨码开关(电源) | 1 |
| 6×AA 电池盒(或 5V 移动电源) | 1 |
| 3D 打印外壳(含钻床手轮适配座) | 1 套 |
| 钕铁硼强磁(φ10×3 mm) | 1 |
设计缘起
台钻手轮旋转约 270° 对应 0~50 mm 钻深,原厂刻度尺读数费眼且需记忆目标深度。利用 MPU-6050 加速度计测量手轮转角,经 Arduino 换算实时显示当前钻深与目标深度,到达目标自动提示“StOP”,免去老花眼困扰,且断电数据不丢失(下次开机需重新归零)。
安装结构设计
- 传感器座:Fusion 360 设计,内孔套钻床手轮轴端 SW17 六角螺母,外壳卡扣固定 GY-521,确保 Z 轴垂直于手轮平面。STL 文件见 CAD 栏。
- 主机盒:磁吸固定于钻床铸铁机身侧面,随时拆卸不妨碍操作。
- 接线:
| 模块 | Nano 引脚 |
|---|---|
| MPU-6050 (I2C) | SDA→A4, SCL→A5, VCC→5V, GND→GND |
| MAX7219 (SPI) | DIN→D12, CLK→D11, CS→D10, VCC→3.3V, GND→GND |
| 按键 | D9 (内部上拉) |
核心算法
- 唤醒 MPU-6050:写寄存器 0x6B=0,必须 delay(1000) 等待稳定,否则外部供电时传感器无数据(作者踩坑最久处)。
- 零偏校准:开机采样 100 次 X/Y/Z 加速度,计算静态角度误差均值
AccAngleErrorX。 - 实时角度融合:
AccAngleX = atan2(Ay, sqrt(Ax²+Az²)) * RAD2DEG - AccAngleErrorX
TotalAngleX = 0.5 * TotalAngleX + 0.5 * AccAngleX(一阶互补滤波) - 映射至 0~360°:利用 Ax/Ay/Az 符号判断象限,修正
TotalAngleX到DrillingMachineAngle(0~360°),近 360° 时归零显示。 - 角度→钻深换算:实测手轮最大转角 316° 对应 50 mm,
currentPos = 50.0/316.0 * DrillingMachineAngle。 - 目标设定:按键按下瞬间锁存
stopPos = currentPos,右侧 4 位显示“8888”确认 1 秒。 - 到达判定:
currentPos >= stopPos时右侧显示 “5t0P”(小写 t 用setRow(0,2,B00001111)拼凑),否则显示剩余深度stopPos - currentPos(1 位小数)。
完整 Arduino 代码
/* drilling-depth.ino 关键片段 */
#include <Wire.h> #include <math.h> #include <LedControl.h>
#define MPU 0x68
LedControl lc(12,11,10,1); // DIN,CLK,CS,devices
float AccAngleErrorX, TotalAngleX, currentPos, stopPos;
const float RAD2DEG = 180/PI;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true);
delay(1000); // 关键!
Wire.beginTransmission(MPU); Wire.write(0x1C); Wire.write(0x10); Wire.endTransmission(true); // ±8g
// 校准零偏
for(int i=0;i<100;i++){ readAccel(); AccAngleErrorX += atan2(Ay,sqrt(Ax*Ax+Az*Az))*RAD2DEG; }
AccAngleErrorX /= 100;
pinMode(9,INPUT_PULLUP);
lc.shutdown(0,false); lc.setIntensity(0,8); lc.clearDisplay(0);
}
void loop() {
readAccel();
float AccAngleX = atan2(Ay,sqrt(Ax*Ax+Az*Az))*RAD2DEG - AccAngleErrorX;
TotalAngleX = 0.5*TotalAngleX + 0.5*AccAngleX;
// 象限修正
float delta = 0;
if (Az < 0) delta = 180 - TotalAngleX*2;
else if (Ay < 0) delta = 360;
float angle = TotalAngleX + delta;
if (angle > 350) angle = 0;
currentPos = 50.0/316.0 * angle;
if (digitalRead(9)==LOW) { stopPos=currentPos; show8888(); delay(1000); }
if (stopPos>0) {
if (currentPos >= stopPos) showSTOP();
else showRemain(stopPos - currentPos);
} else showBlankRight();
showCurrent(currentPos);
delay(200);
}
完整代码含 readAccel()、showCurrent()、showRemain()、showSTOP() 等函数,见 Code 栏下载。
实测效果
视频演示:钻深显示器实测。传感器响应极快,显示值与机械刻度尺误差 < 0.2 mm,亮度在车间强光下清晰可读。
经验总结
- delay(1000) 是外部供电下 MPU-6050 正常工作的关键,切勿省略。
- 加速度计单轴测角仅适用于缓慢旋转、无剧烈振动场景;高速/冲击环境需融合陀螺仪或改用磁编码器。
- MAX7219 驱动 8 位共阴数码管,电流约 120 mA(亮度 8/15),6 节 AA 电池可续航 20+ 小时。
- 3D 打印件建议 PETG 耐热,PLA 夏季车间可能软化变形。
原理图与 3D 模型
CAD 文件:drilling-depth-3d-model_Yn2q0MSNa4.zip(含传感器座、主机盒、电池盖 STL)。
制造工艺
- 树莓派传感器数据融合实战:GPS 与 MPU‑9150 IMU 的 I²C 与 UART 接入
- 树莓派接 KY‑033 循迹/门状态传感器:简易 Python 实现
- 树莓派构建稳健传感器 API:基于 GY‑91 多功能模块的 Flask 实现
- 树莓派自动化气雾栽培系统:湿度传感器智能控制
- 掌握树莓派 GPIO:在 B+/Model 2 上接入 PIR 运动传感器
- 将 Acconeer A111 脉冲雷达与树莓派集成:实用指南
- HC‑SR501 PIR 运动传感器与树莓派接线、校准与 Python 编程全指南
- Python/MicroPython 传感器记录仪:无缝写入 Google Sheets
- Portenta H7 对接 MAX6675 热电偶温度传感器教程
- 基于模拟传感器的高精度压力与气流测量装置
- K30 CO₂ 传感器:室内空气质量实时监测
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino