在这个Arduino项目中,通过陀螺传感器的钻井深度显示器和带有Arduino支持的7段显示器,来读取所需位置的深度。
概念:
指定钻孔深度时,用钻头刮擦表面,记下坐标,然后添加所需的钻孔深度,最后进行钻孔,直到达到该深度为止。为了防止钻孔过深,当到达孔深度时,会收到消息。
按钮功能:当按下它时,Arduino会将当前钻孔位置保存为停止值,并在以后到达时随时提醒。
钻头的轴具有SW17六角螺母。因此,只需一个3D打印的组件即可安转传感器,并可以将其插入六角螺母上。
所需组件:
Arduino Nano
陀螺传感器GY-521
7位模块,带8位数字(SPI版本,带有MAX7219 IC)
按键
开/关
电源:AA或AAA电池的电池夹或移动电源
3D打印外壳
钕磁铁
原理图:
连接:
1、陀螺仪传感器通过I2C连接。因此,对于Nano,必须使用A5和A4。
VCC-》 5V
地线-》地线
SCL-》 A5
SDA-》 A4
XDA-》未连接
XCL-》未连接
ADO-》未连接
INT-》未连接
2、7段模块:
连接7段模块时,可以使用任何数字引脚。使用Arduino草图设置引脚。
VCC-》 3.3V
地线-》地线
DIN-》 D12
CS-》 D10
时钟-》 D11
3、按钮:
可以自由选择按钮的输入引脚。该项目使用D9针。
4、电源供应:
对于电源,使用6节AA电池。在打开/关闭开关后,它们为整个系统供电。
5、套管:
使用Autodesk Fusion 360设计了机壳、使用Anycubic i3 Mega创建了3D打印。
代码:
/ *程序:rilling-depth.ino
*作者:托马斯·安吉尔斯基
*版本:2021 -03-20
*
* https://techpluscode.de/
* https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/
*
*此草图测量台式钻孔的钻孔深度
*使用GY-521陀螺仪传感器数据
*通过7段显示
查看深度
*
*来自electronicoobs.com的calc误差补偿的想法-谢谢!
*
* /
#include 《Wire.h》
#include 《math.h》
#include “LedControl.h”
#define MPU 0x68
char txt[8];
String s;
float currentPos,stopPos;
float rad_to_deg;
float AccX, AccY, AccZ;
float AccAngleX, AccAngleY;
float AccAngleErrorX, AccAngleErrorY;
float TotalAngleX, TotalAngleY;
float DrillingMachineAngle, delta;
//初始化LED :引脚D12,引脚D11,引脚D10、1个模块
LedControl 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); // wake up MPU
Wire.endTransmission(true);
//delay(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);
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;
//准备按钮: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的+/-将x角度计算为360,增量= 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;}
//计算钻孔深度
//最大钻孔深度: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(“按下按钮”);
delay(1000);
}
if (stopPos》0) {
//到达停止位置?
if (currentPos》=stopPos) {
//是:在右侧显示STOP
lc.setChar(0,3,‘5’,false);
lc.setRow(0,2,B00001111);
lc.setChar(0,1,‘0’,false);
lc.setChar(0,0,‘P’,false);
} else {
//否:显示到停止位置的距离
dtostrf(stopPos-currentPos,4,1,txt);
s=‘ ’+String(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=‘ ’+String(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);
delay(200);
}
代码讲解:
1、使用LedControl.h库来控制7段显示。如未安装,则必须使用库管理器进行安装。
2、陀螺传感器通过I2C总线连接。通过Wire.h进行通信。
3、使用Led Control控制7段显示。
4、引脚进行初始化后,设置过程仅需要进行一些准备工作即可唤醒显示并调整强度。
5、在循环部分中,显示屏仅显示当前钻孔深度,如果已设置,则显示停止位置,显示为数字。
6、函数dtostrf将浮点数转换为字符数组。然后输入一个字符串,以在显示屏上按字符显示它。
当到达停止位置时,“ StOP”出现在显示屏上。可以使用setRow过程和适当的位模式B00001111生成小的“ t” 。
8、通过线库的功能读取陀螺传感器的功能。使用加速度计来确定角度位置。
9、当USB连接到Arduino IDE时,一切运行正常。拔下插头并连接到外部电源后,传感器未提供任何数据。它仅在Arduino复位后才能再次工作。经过长时间的搜索,解决方案是在唤醒传感器后安装等待时间。这使延迟(1000)在整个源代码中成为最重要的命令。
必须在开始时为传感器确定偏移值,否则值会波动。在设置部分中,测量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是正还是负就足够了。并相应地转换角度。
通过Serial.print输出确定角度,并记下旋转角度的最大值。
当旋转角度为316°, 最大钻孔深度为50mm时,当前位置的计算方式:
currentPos=50.0/316.0*DrillingMachineAngle;
如果按下该按钮,则Arduino将保存当前的钻孔位置。显示屏上显示8888,短等待1秒。
如果设置了停止位置,则在右侧显示屏上会显示直到停止为止的剩余钻削深度。
组装:
陀螺仪传感器最好用热胶点固定。将连接电缆穿过盖子。这部分就是这样。
在第一个测试中,陀螺仪传感器必须首先对准。我是水平安装的。由于支架设计为可旋转的,因此可以轻松进行调整,直到显示屏上显示0.0。
测试:
传感器反应非常迅速,计算出的值与钻孔深度完全匹配。而且由于采用了大型LED显示屏,可读取准确的钻削深度。
责任编辑:pj
-
传感器
+关注
关注
2548文章
50641浏览量
751669 -
显示器
+关注
关注
21文章
4940浏览量
139803 -
Arduino
+关注
关注
187文章
6462浏览量
186611
发布评论请先 登录
相关推荐
评论