亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带陀螺仪传感器的钻孔深度显示

组件和用品

Arduino Nano R3
× 1

必要的工具和机器

3D 打印机(通用)

应用和在线服务

Arduino IDE

关于这个项目

如果您必须为某个项目钻孔一定深度,则需要一个带深度显示的台钻。大多数台钻都有一个带箭头的尺子,用于阅读。钻孔的成功取决于您读取所需位置的准确程度。在这个 Arduino 项目中,我提出了一个替代方案:带有陀螺仪传感器的钻孔深度显示器和带有 Arduino 支持的 7 段显示器。

我在车间最常使用的机器不是锯子或磨床。到目前为止,这是台钻。不管是什么项目,其实一直都在用。如果我需要一定的钻孔深度,我可以使用机器上的内置标尺。并记住我必须钻到的深度。它实际上运行良好。

但是随着年龄的增长 - 是的,是的,是的 - 我越来越难以以毫米精度读取深度。而且如果光线不够亮,几乎不可能看清它。但是就为了这个戴眼镜?钻孔后,眼镜存放在哪里?我还没有那么远。

忠于“2 Secon Lean”中 Paul Akers 的座右铭:

必须有更好的解决方案,您只需思考并实现即可。

衡量可能性

我当然可以在秤前放一个放大镜,使标尺更容易阅读。这会改善读数,但我必须记住每种情况下的测量结果无济于事。如果你是做手工艺品,那也应该很有趣。

这就是为什么电子解决方案要好得多的原因。最好在一个小空间里,这样所有东西都可以放在钻头的开/关开关旁边。对于这种情况,我喜欢使用 Arduino Nano。它有足够的引脚来控制几乎所有东西,并且相应地很小。

但是如何测量钻孔深度呢?长度测量有多种可能性。安装超声波测量?可以工作,但只需要一点机械装置,它作为反射面与钻头一起移动。还是使用线控编码器?有可能,但非常复杂,如果您自己构建:使用转盘、前叉挡光板和弹簧复位。最好马上拿一个旋转编码器?这将意味着更少的组件 - 是的,但它太粗糙了,您必须安装齿轮才能进行平移。

好吧,再考虑考虑。

我的钻头和大多数人一样,侧面有一个手轮,可以调节深度。它可以旋转约。 270°。所以连一个完整的回合都没有。

这非常适合使用陀螺仪传感器进行角度测量。电缆连接不能扭曲,只需要一个便宜的组件。陀螺仪传感器也可以很容易地直接安装在手轮的旋转轴上。

概念

在指定钻孔深度时,我总是以相同的方式进行:用钻头划伤表面,记下坐标,然后添加所需的钻孔深度,最后钻孔直到达到深度。

我想保留基本过程。为了不要钻得太深,我想收到有关何时达到钻孔深度的信息。

一个按钮接管了这个功能。当您按下时,Arduino 会将当前钻孔位置保存为停止值,并且可以在以后到达时随时提醒我。

其余组件占用更多空间,重量也明显增加。幸运的是,我的机器外壳是金属制成的。这就是为什么我使用钕磁铁来固定它。

问题仍然存在,传感器应该如何连接到机器上?

钻头的轴有一个 SW17 六角螺母。所以我只需要一个 3D 打印的组件,它可以接受传感器并且可以塞到六角螺母上。

必需组件

  • Arduino Nano
  • 陀螺仪传感器 GY-521
  • 8 位 7 段模块(带有 MAX7219 IC 的 SPI 版本)
  • 按钮
  • 开/关开关
  • 电源:用于 AA 或 AAA 电池或移动电源的电池夹
  • 3D 打印外壳
  • 钕磁铁

陀螺仪传感器的连接

陀螺仪传感器通过 I2C 连接。所以Nano必须用A5和A4。

  • VCC -> 5V
  • GND -> GND
  • SCL -> A5
  • SDA -> A4
  • XDA -> 未连接
  • XCL -> 未连接
  • ADO -> 未连接
  • INT -> 未连接

7段模块

连接 7 段模块时可以使用任何数字引脚。使用 Arduino 草图设置引脚。

  • VCC -> 3.3V
  • GND -> GND
  • DIN -> D12
  • CS -> D10
  • CLK -> D11

按钮

按钮的输入引脚也可以自由选择。我正在使用引脚 D9。

电源

对于电源,我使用 6 节 AA 电池。打开/关闭开关后,它们为整个系统供电。

套管

我使用 Autodesk Fusion 360 设计了外壳。我使用 Anycubic i3 Mega 创建了 3D 打印件。

粘在机器上的钕磁铁。如果整个钻孔深度显示受到阻碍,所有东西都会被迅速移除。

Arduino 草图

我使用了 LedControl.h 库控制7段显示。如果您还没有安装这些,您必须首先使用库管理器安装它们。

陀螺仪传感器通过 I2C 总线连接。在为传感器寻找可能的库时,我决定不使用任何库。通信通过 Wire.h .

在文章的最后你会找到一些帮助我理解的链接。

7段显示器的控制配合LedControl效果很好 .

引脚初始化完成后,设置程序只需要做一些准备工作即可唤醒显示和调整亮度。

在循环部分,显示器只显示当前钻孔深度,如果设置,还会显示停止位置,也显示为数字。

显示器将每个数字作为字符类型。我想使用小数位作为准确性。函数 dtostrf 将浮点数转换为字符数组。然后变成一个字符串,在显示器上按字符显示。

dtostrf ( currentPos, 4,1, txt );
s ='' + String ( txt );
lc. setChar ( 0,4, 参见 charAt ( 参见 length () -1 ) , false );
lc. setChar ( 0.5, 见 charAt ( 见 length () -3 ) , true );
lc. setChar ( 0.6, 见 charAt ( 见 length () -4 ) , false );
lc. setChar ( 0.7, 查看 charAt ( 查看 length () -5 ) , false );

到达停止位置时,显示屏上会出现“StOP”。可以使用 setRow 生成小“t” 程序和适当的位模式 B00001111。

读取陀螺仪传感器通过线库的功能工作。我只使用加速度计 确定角位置。

使用 USB 连接到 Arduino IDE 时,一切正常。拔下并连接到外部电源后,传感器没有提供任何数据。它仅在 Arduino 重置后再次工作。

这让我在整个项目中最头疼。你可以说钻孔深度指示器可能救了我的眼睛,但这就是我拔掉几乎所有头发的原因!

经过长时间的搜索,在唤醒传感器后安装等待时间是解决方案。这使得 延迟 (1000) 整个源代码中最重要的命令。

//准备GY-521传感器
//我们只使用加速器数据
Wire.begin();
Wire.beginTransmission(MPU);
Wire .write(0x6B);
Wire.write(0x00); // 唤醒 MPU
Wire.endTransmission(true);

//这个延迟对我来说是非常必要的!
delay(1000);

Wire.beginTransmission(MPU);
Wire.write(0x1C); //注册ACCEL_CONFIG
Wire.write(0x10); //设置为 00010000 +/- 8g 满量程
Wire.endTransmission(true);

必须在开始时为传感器确定偏移值,否则值会波动。在setup部分,测量了100个值,并对偏差进行了平均。

从传感器数据计算角度并不容易。但是有很多关于如何进行计算的说明。

使用以下公式计算 X 角(以度为单位):

AccAngleX =(atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * rad_to_deg); 

但是加速度传感器的数值波动很大。因此,当前计算值与前一个值各取50%的平均值。

TotalAngleX =0.5 * TotalAngleX + 0.5 * AccAngleX; 

角度值由传感器输出从 -90° 到 +90°。但是我需要0°到360°的角度来转换成钻孔深度。

我还没有找到一个简单的解决方案。但是,对于我的应用程序,查看传感器数据 Z 和 Y 是正数还是负数就足够了。并相应地转换角度。

delta=0;
if ((AccZ<0)) {
delta=180.0-TotalAngleX*2.0;
}
if ((AccZ>0) )&&(AccY<0)) {
delta=360.0;
}
DrillingMachineAngle=TotalAngleX+delta;

//如果接近360°,显示效果更好 0 °
if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}

仍然缺少的是手轮允许的最大可能旋转角度。最简单的方法是通过 Serial.print 输出确定的角度并记下最大值。

对我来说是 316°。最大钻孔深度为 50 mm,当前位置计算如下:

currentPos=50.0/316.0*DrillingMachineAngle; 

如果按下按钮,Arduino 将保存当前钻孔位置。 8888 显示在显示屏上,并有 1 秒的短暂等待。

如果设置了停止位置,则在右侧显示屏上显示到停止为止的剩余钻孔深度。

组装和测试

陀螺仪传感器最好用一点热胶固定。引导连接电缆穿过盖子。这部分就是这样。

在第一次测试中,必须首先校准陀螺仪传感器。我是水平安装的。由于支架设计为可旋转,因此可以轻松调整,直到显示屏上显示 0.0。

然后就可以开始第一次测试了。

总的来说,我对解决方案感到非常满意。传感器反应非常快,计算值与钻孔深度完全匹配。

多亏了大型 LED 显示屏,我不必担心 85 岁以下的眼镜无法读取准确的钻孔深度。

所以永远记住保罗说的话:修复你的错误!

玩得开心!

___________________________________________________________

一些可能有用的链接:

https://medium.com/@kavindugimhanzoysa/lets-work-with-mpu6050-gy-521-part1-6db0d47a35e6

或 https://playground.arduino.cc/Main/MPU-6050/

或 https://circuitdigest.com/microcontroller-projects/mpu6050-gyro-sensor-interface-with-arduino/

Rob Tilaart 的 GY-521 图书馆:https://github.com/RobTillaart/GY521

并在 https://paulakers.net/books/2-second-lean

上查看 Paul Akers 的书

Das Projekt gibt es auch auf Deutsch unter:https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/

代码

  • drilling-depth.ino
drilling-depth.inoArduino
/* 程序:drill-depth.ino * 作者:Thomas Angielsky * 版本:2021-03-20 * * https://techpluscode.de/ * https://techpluscode.de/bohrtiefenanzeige-mit-gyro-传感器/ * * 此草图通过使用 GY-521 陀螺仪传感器的数据测量台钻 * 机器的钻孔深度 * 深度由 7 段显示器查看 * * 来自电子产品网站的计算误差补偿的想法 - 谢谢! * */#include #include #include "LedControl.h"#define MPU 0x68char txt[8];String s;float currentPos,stopPos;float rad_to_deg;float AccX, AccY, AccZ;浮动 AccAngleX, AccAngleY;浮点 AccAngleErrorX, AccAngleErrorY; float TotalAngleX, TotalAngleY;float DrillingMachineAngle, delta;//init LED's:pin D12, pin D11, pin D10, 1 moduleLedControl lc=LedControl(12,11,10,1);void setup() { //准备串行连接/ /Serial.begin(9600); //起始值 stopPos=0.0; currentPos=0.0; rad_to_deg =180/PI; //准备GY-521传感器 //我们只使用加速器数据 Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); Wire.write(0x00); // 唤醒 MPU Wire.endTransmission(true); //这个延迟对我来说是非常必要的!延迟(1000); Wire.beginTransmission(MPU); Wire.write(0x1C); //注册ACCEL_CONFIG Wire.write(0x10); //设置为 00010000 +/- 8g 满量程范围 Wire.endTransmission(true); //计算加速器数据错误 //做100次测量 for(int a=0; a<100; a++) { Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU,6,true); AccX=(Wire.read()<<8|Wire.read())/4096.0; AccY=(Wire.read()<<8|Wire.read())/4096.0; AccZ=(Wire.read()<<8|Wire.read())/4096.0; AccAngleErrorX=AccAngleErrorX+((atan((AccY)/sqrt(pow((AccX),2)+pow((AccZ),2)))*rad_to_deg)); //AccAngleErrorY=AccAngleErrorY+((atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AccZ),2)))*rad_to_deg)); } AccAngleErrorX=AccAngleErrorX/100; //AccAngleErrorY=AccAngleErrorY/100; //准备按钮:pin D9 pinMode(9,INPUT_PULLUP); //准备7段显示lc.shutdown(0,false); lc.setIntensity(0,8); lc.clearDisplay(0);}void loop() { Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU,6,true); AccX=(Wire.read()<<8|Wire.read())/4096.0; AccY=(Wire.read()<<8|Wire.read())/4096.0; AccZ=(Wire.read()<<8|Wire.read())/4096.0; AccAngleX=(atan((AccY)/sqrt(pow((AccX),2)+pow((AccZ),2)))*rad_to_deg)-AccAngleErrorX; //AccAngleY=(atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AccZ),2)))*rad_to_deg)-AccAngleErrorY; //平滑值 TotalAngleX=0.5*(TotalAngleX)+0.5*AccAngleX; //TotalAngleY=0.5*(TotalAngleY)+0.5*AccAngleY; //通过使用 X,Y,Z delta=0 的 +/- 计算 x 角度到 360; if ((AccZ<0)) { delta=180.0-TotalAngleX*2.0; } if ((AccZ>0)&&(AccY<0)) { delta=360.0; } DrillingMachineAngle=TotalAngleX+delta; //如果接近360,最好显示0 if (DrillingMachineAngle>350) {DrillingMachineAngle=0;} //计算钻孔深度 //最大钻孔深度:50 mm(在机器上测量) //最大手轮角度:316(测量)与 Serial.print 数据)currentPos=50.0/316.0*DrillingMachineAngle; /* Serial.print("X / X / Y / Z / E :BOHRTIEFE"); Serial.print(TotalAngleX); Serial.print(" "); Serial.print(AccX); Serial.print(" "); Serial.print(ACCY); Serial.print(" "); Serial.print(AccZ); Serial.print(">> "); Serial.print(DrillingMachineAngle); Serial.print(">> "); Serial.print(currentPos); Serial.println(" ");*/ //按钮被按下? if (digitalRead(9)==LOW) { //存储停止位置 stopPos=currentPos; lc.setChar(0,3,'8',false); lc.setChar(0,2,'8',false); lc.setChar(0,1,'8',false); lc.setChar(0,0,'8',false); //Serial.println("按钮按下");延迟(1000); } if (stopPos>0) { //到达停止位置? if (currentPos>=stopPos) { //yes:在右侧显示 STOP (5t0P) lc.setChar(0,3,'5',false); lc.setRow(0,2,B00001111); lc.setChar(0,1,'0',false); lc.setChar(0,0,'P',false); } else { //no:显示到停止位置的距离 dtostrf(stopPos-currentPos,4,1,txt); s=''+字符串(txt); lc.setChar(0,0,s.charAt(s.length()-1),false); lc.setChar(0,1,s.charAt(s.length()-3),true); lc.setChar(0,2,s.charAt(s.length()-4),false); lc.setChar(0,3,s.charAt(s.length()-5),false); } } else { //不显示任何内容 lc.setChar(0,3,' ',false); lc.setChar(0,2,' ',false); lc.setChar(0,1,' ',false); lc.setChar(0,0,'',false); } //左侧显示当前钻孔深度 //格式为字符串 dtostrf(currentPos,4,1,txt); s=''+字符串(txt); lc.setChar(0,4,s.charAt(s.length()-1),false); lc.setChar(0,5,s.charAt(s.length()-3),true); lc.setChar(0,6,s.charAt(s.length()-4),false); lc.setChar(0,7,s.charAt(s.length()-5),false);延迟(200);}

定制零件和外壳

钻孔深度3d模型_Yn2q0MSNa4.zip

示意图


制造工艺

  1. 传感器数据与 Raspberry Pi 微处理器的集成
  2. 带 RPi 的线跟踪传感器
  3. 带有 RPi 的环境传感器 API
  4. 带有 Raspberry Pi 和湿度传感器的 Aeroponics
  5. 带有 PIR 运动传感器的 Raspberry Pi GPIO:最佳教程
  6. 将 A111 脉冲雷达传感器与 Raspberry Pi 结合使用
  7. 将 HC-SR501 PIR 运动传感器与 Raspberry Pi 连接
  8. Python/MicroPython Sensor Logger with Google Sheets
  9. Portenta 和热电偶传感器(带 MAX6675)
  10. 带模拟传感器的压力气流测量设备
  11. 使用 K30 传感器监测二氧化碳
  12. 带有 Arduino 的简单障碍物传感器