×

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

消耗积分:0 | 格式:zip | 大小:0.06 MB | 2022-11-17

王兰

分享资料个

描述

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

我在车间最常使用的机器不是锯或磨床。到目前为止,这是台钻。无论项目如何,它实际上总是被使用。如果我需要一定的钻孔深度,我可以使用机器上的内置尺子。记住我必须钻到的深度。它实际上运作良好。

但是随着年龄的增长——是的,是的,是的——对我来说,以毫米精度读取深度变得越来越困难。而如果光线不够亮,则几乎无法阅读。但是只是为此戴上眼镜?钻孔后,眼镜存放在哪里?我还没有那么远。

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

修复你的问题!

必须有一个更好的解决方案,你只需思考并做到。

测量可能性

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

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

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

好吧,那就多想想吧。

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

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

概念

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

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

 
 
 
poYBAGN1H8mAMu3RAAA6Szgj8tw135.jpg
 
1 / 2
 

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

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

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

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

pYYBAGN1H8uARwZYAABkF7-lRik837.jpg
 

所需组件

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

陀螺仪传感器的连接

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

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

7段模块

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

  • VCC -> 3.3V
  • 接地 -> 接地
  • DIN -> D12
  • CS -> D10
  • 时钟-> D11

按钮

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

电源

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

套管

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

用于连接机器的钕磁铁被粘在里面。如果整个钻孔深度显示受到阻碍,所有东西都会很快被移除。

阿杜诺素描

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

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

在文章的末尾,您会找到一些帮助我理解的链接。

7 段显示器的控制与LedControl配合得非常好

用引脚初始化后,设置过程只需要一些准备工作即可唤醒显示器并调整亮度。

在循环部分,显示屏仅以数字显示当前钻孔深度和停止位置(如果已设置)。

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

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

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

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

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

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

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

//prepare GY-521 sensor
//we use only accelerator data
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0x00); // wake up MPU
Wire.endTransmission(true);

//this delay was very necessary in my case!
delay(1000);

Wire.beginTransmission(MPU);
Wire.write(0x1C); //register ACCEL_CONFIG
Wire.write(0x10); //Set as 00010000 for +/- 8g full scale range
Wire.endTransmission(true);

偏移值必须在一开始就为传感器确定好,否则数值会出现波动。在设置部分,测量了 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;

//if near 360°, display better 0°
if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}

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

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

currentPos=50.0/316.0*DrillingMachineAngle;

如果按下按钮,Arduino 会保存当前钻孔位置。显示屏上显示 8888,等待 1 秒。

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

组装和测试

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

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

 
 
 
poYBAGN1H82AOlf0AABbNrtdafw624.jpg
 
1 / 6
 

然后可以开始第一个测试。总的来说,我对解决方案非常满意。传感器反应非常迅速,计算值与钻孔深度完全匹配。

得益于大型 LED 显示屏,我不必担心 85 岁以下的眼镜可以读取准确的钻孔深度。

所以永远记住保罗的话:修复你的问题!

玩得开心!

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'带陀螺仪传感器的钻孔深度显示',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);