在这个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);
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;
//准备按钮: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显示屏,可读取准确的钻削深度。
使用Google Cloud集成API实现视频智能检测识别
沃尔沃于2022年应用激光雷达,XC90率先搭载
亚信电子推出新一代 I/O 连接芯片
跨过汽车IC可靠性的方法
几个能延长笔记本电脑使用寿命的习惯
基于钻井深度显示器和带有Arduino支持的7段显示器设计
STEM教育模式的运用促进了科学教学的有效开展
电池修复原理_电池修复液有用吗
毫无疑问,未来人工智能将逐步取代基金经理、交易员
iOS13到底好不好用
基于Xilinx Spartan系列FPGA和VHDL语言设计卫星数据存储纠错系统
LATTICE ispLEVER CLASSIC 1.2版设
自动化教育会成为未来的教育趋势吗
机动车驾驶人考试视频监控系统的特点及方案实现
EDA是芯片设计的关键工具,地位堪比光刻机
如何在电源上选择MOS管
机器学习回归模型相关重要知识点总结
海信王宏伟:空调要从关注冷暖到关注用户的每一分体验
安森美半导体推出RF系统级封装的SiP收发器,助力低功耗物联网互联应用
对刀仪气密性防水检测的案例