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

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

    关注

    2525

    文章

    48069

    浏览量

    739996
  • 显示器
    +关注

    关注

    21

    文章

    4736

    浏览量

    137838
  • Arduino
    +关注

    关注

    184

    文章

    6427

    浏览量

    184826
收藏 人收藏

    评论

    相关推荐

    集特15.6寸 触摸显示器

    显示器
    GITSTAR 集特工控
    发布于 :2023年02月03日 10:00:31

    显示器主板烧坏黑屏维修

    显示器
    YS YYDS
    发布于 :2023年06月27日 18:01:08

    S2D13V42平视显示器显示功能

    显示器
    Piezoman压电侠
    发布于 :2024年01月19日 14:38:00

    LED条图显示器相关应用

    ,其SEGA-G和SEGH为LED七显示器和小数点驱动端,DIG 0-7为8位数字驱动线,输出位选信号,DIN为串行数据输入端,CLK为串行时钟输入端,DOUT为串行数据输出端,在
    发表于 05-30 05:00

    7LED显示器的驱动电路图是怎么样的?

    7LED显示器的驱动电路图
    发表于 03-02 11:05

    求助Multisim大佬 我7显示器显示数字4是为什么啊?

    求助Multisim大佬 我7显示器显示数字4是为什么啊?
    发表于 04-15 00:11

    常用的LED显示器有哪些

    常用的LED显示器有LED状态显示器(俗称发光二极管)、LED七显示器(俗称数码管)和LED十六段显示器。发光二极管可
    发表于 11-02 06:12

    显示器的参数像素

    800x480 表示该显示器的每一行有 800 个像素点,每一列有 480 个像素点,也可理解为有 800 列,480行。色彩深度色彩深度显示器的每个像素点能表示多少种颜色,一般用“
    发表于 08-10 06:00

    什么是显示器

    什么是显示器显示器是计算机的I/O设备,是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。常见显示器及其显示原理CRT
    发表于 12-20 07:59

    单片机系统中常用的显示器有哪些

    有两种显示结构:显示(7、米字型等)和点阵显示(5×8、8×8点阵等)。使用LED
    发表于 01-17 08:57

    基于Arduino Pro Mini实现的LED矩阵显示器设计

    描述带有 Arduino Pro Mini 的 LED 矩阵显示器该项目由一个带有用于四个 LED 矩阵显示器的接头的双面 PCB 和一个
    发表于 07-14 06:19

    带有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测试7段显示器

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