0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于钻井深度显示器和带有Arduino支持的7段显示器设计

电子设计 来源:电路城 作者:电路城 2021-05-20 17:14 次阅读

在这个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将浮点数转换为字符数组。然后输入一个字符串,以在显示屏上按字符显示它。

基于钻井深度显示器和带有Arduino支持的7段显示器设计

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

8、通过线库的功能读取陀螺传感器的功能。使用加速度计来确定角度位置。

9、当USB连接到Arduino IDE时,一切运行正常。拔下插头并连接到外部电源后,传感器未提供任何数据。它仅在Arduino复位后才能再次工作。经过长时间的搜索,解决方案是在唤醒传感器后安装等待时间。这使延迟(1000)在整个源代码中成为最重要的命令。

基于钻井深度显示器和带有Arduino支持的7段显示器设计

必须在开始时为传感器确定偏移值,否则值会波动。在设置部分中,测量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是正还是负就足够了。并相应地转换角度。

基于钻井深度显示器和带有Arduino支持的7段显示器设计

通过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
收藏 人收藏

    评论

    相关推荐

    用ARM7-LPC2148连接7显示器的教程

    今天在本教程中,我们将用ARM7-LPC2148连接7显示器。在详细介绍之前,我们将了解如何控制7
    的头像 发表于 10-28 15:34 2899次阅读
    用ARM<b class='flag-5'>7</b>-LPC2148连接<b class='flag-5'>7</b><b class='flag-5'>段</b><b class='flag-5'>显示器</b>的教程

    如何使用CD4511驱动7显示器

    在本教程中,我们将使用 IC 4511 驱动 7 显示器。该CD4511 IC基本上是一个BCD转7解码
    的头像 发表于 01-02 10:15 9586次阅读
    如何使用CD4511驱动<b class='flag-5'>7</b><b class='flag-5'>段</b><b class='flag-5'>显示器</b>

    如何使用8051单片机在7显示器显示数字?

    在使用单片机开发项目的时候,经常会使用到7显示器7显示器可以
    的头像 发表于 07-07 11:34 2917次阅读
    如何使用8051单片机在<b class='flag-5'>7</b><b class='flag-5'>段</b><b class='flag-5'>显示器</b>上<b class='flag-5'>显示</b>数字?

    使用MAX6954驱动7LED显示器

    使用MAX6954驱动7LED显示器:本文旨在帮助工程师快速掌握 MAX6954 驱动7 单色LED 驱动
    发表于 10-02 13:46 46次下载

    使用MAX6954驱动7LED显示器

    摘要:本文旨在帮助工程师快速掌握MAX6954驱动7单色LED驱动的使用方法。 MAX6954是一个通用显示驱动,能够通过一个串口控制
    发表于 05-03 14:32 1131次阅读
    使用MAX6954驱动<b class='flag-5'>7</b><b class='flag-5'>段</b>LED<b class='flag-5'>显示器</b>

    7LED显示器的驱动电路图

    7LED显示器的驱动电路图
    发表于 07-18 11:33 1393次阅读
    <b class='flag-5'>7</b><b class='flag-5'>段</b>LED<b class='flag-5'>显示器</b>的驱动电路图

    如何结合4英寸7显示器和ESP8266 Wifi模块来创建8位显示器

    您做到了。您刚刚构建了自己的7互联网显示器
    的头像 发表于 11-01 15:31 3763次阅读

    带有Arduino Pro Mini的LED矩阵显示器

    电子发烧友网站提供《带有Arduino Pro Mini的LED矩阵显示器.zip》资料免费下载
    发表于 07-12 09:53 5次下载
    <b class='flag-5'>带有</b><b class='flag-5'>Arduino</b> Pro Mini的LED矩阵<b class='flag-5'>显示器</b>

    基于Arduino的机械彩色Nipkow显示器

    电子发烧友网站提供《基于Arduino的机械彩色Nipkow显示器.zip》资料免费下载
    发表于 10-18 09:39 0次下载
    基于<b class='flag-5'>Arduino</b>的机械彩色Nipkow<b class='flag-5'>显示器</b>

    Arduino电脑显示器开源分享

    电子发烧友网站提供《Arduino电脑显示器开源分享.zip》资料免费下载
    发表于 10-26 15:42 0次下载
    <b class='flag-5'>Arduino</b>电脑<b class='flag-5'>显示器</b>开源分享

    创建一个7显示器

    电子发烧友网站提供《创建一个7显示器.zip》资料免费下载
    发表于 10-26 10:51 0次下载
    创建一个<b class='flag-5'>7</b><b class='flag-5'>段</b><b class='flag-5'>显示器</b>

    使用Arduino测试7显示器

    电子发烧友网站提供《使用Arduino测试7显示器.zip》资料免费下载
    发表于 11-15 10:56 0次下载
    使用<b class='flag-5'>Arduino</b>测试<b class='flag-5'>7</b><b class='flag-5'>段</b><b class='flag-5'>显示器</b>

    基于Arduino UNO的4位7显示器的温度监控

    本方案是一个基于 Arduino UNO 的4 位 7 显示器的温度监控。该项目旨在显示用于
    发表于 12-22 14:30 0次下载

    使用3x7LED显示器的反应计时

    方案介绍统计您需要花费多长时间来响应执行信号。使用由3个4026B十进制计数驱动的3x7LED显示器。硬件部件Arduino UNO  
    发表于 12-30 14:46 0次下载

    使用7显示器的交通灯

    电子发烧友网站提供《使用7显示器的交通灯.zip》资料免费下载
    发表于 06-25 14:40 0次下载
    使用<b class='flag-5'>7</b><b class='flag-5'>段</b><b class='flag-5'>显示器</b>的交通灯