在這個(gè)Arduino項(xiàng)目中,通過陀螺傳感器的鉆井深度顯示器和帶有Arduino支持的7段顯示器,來讀取所需位置的深度。
概念:
指定鉆孔深度時(shí),用鉆頭刮擦表面,記下坐標(biāo),然后添加所需的鉆孔深度,最后進(jìn)行鉆孔,直到達(dá)到該深度為止。為了防止鉆孔過深,當(dāng)?shù)竭_(dá)孔深度時(shí),會(huì)收到消息。
按鈕功能:當(dāng)按下它時(shí),Arduino會(huì)將當(dāng)前鉆孔位置保存為停止值,并在以后到達(dá)時(shí)隨時(shí)提醒。
鉆頭的軸具有SW17六角螺母。因此,只需一個(gè)3D打印的組件即可安轉(zhuǎn)傳感器,并可以將其插入六角螺母上。
所需組件:
Arduino Nano
陀螺傳感器GY-521
7位模塊,帶8位數(shù)字(SPI版本,帶有MAX7219 IC)
按鍵
開/關(guān)
電源:AA或AAA電池的電池夾或移動(dòng)電源
3D打印外殼
釹磁鐵
原理圖:
連接:
1、陀螺儀傳感器通過I2C連接。因此,對于Nano,必須使用A5和A4。
VCC-》 5V
地線-》地線
SCL-》 A5
SDA-》 A4
XDA-》未連接
XCL-》未連接
ADO-》未連接
INT-》未連接
2、7段模塊:
連接7段模塊時(shí),可以使用任何數(shù)字引腳。使用Arduino草圖設(shè)置引腳。
VCC-》 3.3V
地線-》地線
DIN-》 D12
CS-》 D10
時(shí)鐘-》 D11
3、按鈕:
可以自由選擇按鈕的輸入引腳。該項(xiàng)目使用D9針。
4、電源供應(yīng):
對于電源,使用6節(jié)AA電池。在打開/關(guān)閉開關(guān)后,它們?yōu)檎麄€(gè)系統(tǒng)供電。
5、套管:
使用Autodesk Fusion 360設(shè)計(jì)了機(jī)殼、使用Anycubic i3 Mega創(chuàng)建了3D打印。
代碼:
/ *程序:rilling-depth.ino
*作者:托馬斯·安吉爾斯基
*版本:2021 -03-20
*
* https://techpluscode.de/
* https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/
*
*此草圖測量臺式鉆孔的鉆孔深度
*使用GY-521陀螺儀傳感器數(shù)據(jù)
*通過7段顯示
查看深度
*
*來自electronicoobs.com的calc誤差補(bǔ)償?shù)南敕?謝謝!
*
* /
#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個(gè)模塊
LedControl lc=LedControl(12,11,10,1);
void setup() {
//準(zhǔn)備串行連接
//Serial.begin(9600);
//開始值
stopPos=0.0;
currentPos=0.0;
rad_to_deg = 180/PI;
//準(zhǔn)備GY-521傳感器
//我們僅使用加速器數(shù)據(jù)
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); //設(shè)置00010000 來實(shí)習(xí) +/- 8g 滿量程范圍
Wire.endTransmission(true);
//計(jì)算加速器數(shù)據(jù)錯(cuò)誤
//進(jìn)行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;
//準(zhǔn)備按鈕:D9針
pinMode(9,INPUT_PULLUP);
//準(zhǔn)備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角度計(jì)算為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;}
//計(jì)算鉆孔深度
//最大鉆孔深度:50 mm(在機(jī)器上測量)
//手輪最大角度:316(使用Serial.print數(shù)據(jù)測量)
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) {
//到達(dá)停止位置?
if (currentPos》=stopPos) {
//是:在右側(cè)顯示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 {
//不顯示任何內(nèi)容
lc.setChar(0,3,‘ ’,false);
lc.setChar(0,2,‘ ’,false);
lc.setChar(0,1,‘ ’,false);
lc.setChar(0,0,‘ ’,false);
}
//在左側(cè)顯示當(dāng)前鉆孔深度
//格式化為字符串
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段顯示。如未安裝,則必須使用庫管理器進(jìn)行安裝。
2、陀螺傳感器通過I2C總線連接。通過Wire.h進(jìn)行通信。
3、使用Led Control控制7段顯示。
4、引腳進(jìn)行初始化后,設(shè)置過程僅需要進(jìn)行一些準(zhǔn)備工作即可喚醒顯示并調(diào)整強(qiáng)度。
5、在循環(huán)部分中,顯示屏僅顯示當(dāng)前鉆孔深度,如果已設(shè)置,則顯示停止位置,顯示為數(shù)字。
6、函數(shù)dtostrf將浮點(diǎn)數(shù)轉(zhuǎn)換為字符數(shù)組。然后輸入一個(gè)字符串,以在顯示屏上按字符顯示它。
當(dāng)?shù)竭_(dá)停止位置時(shí),“ StOP”出現(xiàn)在顯示屏上??梢允褂胹etRow過程和適當(dāng)?shù)奈荒J紹00001111生成小的“ t” 。
8、通過線庫的功能讀取陀螺傳感器的功能。使用加速度計(jì)來確定角度位置。
9、當(dāng)USB連接到Arduino IDE時(shí),一切運(yùn)行正常。拔下插頭并連接到外部電源后,傳感器未提供任何數(shù)據(jù)。它僅在Arduino復(fù)位后才能再次工作。經(jīng)過長時(shí)間的搜索,解決方案是在喚醒傳感器后安裝等待時(shí)間。這使延遲(1000)在整個(gè)源代碼中成為最重要的命令。
必須在開始時(shí)為傳感器確定偏移值,否則值會(huì)波動(dòng)。在設(shè)置部分中,測量100個(gè)值并將偏差平均。
X角度(度)使用以下公式計(jì)算:
AccAngleX = (atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * rad_to_deg);
加速度傳感器的值波動(dòng)很大。因此,將當(dāng)前計(jì)算的值與先前的值分別取50%的平均值。
TotalAngleX = 0.5 * TotalAngleX + 0.5 * AccAngleX;
傳感器從-90°到+ 90°輸出角度值。但是需要從0°到360°的角度才能轉(zhuǎn)換成鉆孔深度。
但是,對于該程序,查看傳感器數(shù)據(jù)Z和Y是正還是負(fù)就足夠了。并相應(yīng)地轉(zhuǎn)換角度。
通過Serial.print輸出確定角度,并記下旋轉(zhuǎn)角度的最大值。
當(dāng)旋轉(zhuǎn)角度為316°, 最大鉆孔深度為50mm時(shí),當(dāng)前位置的計(jì)算方式:
currentPos=50.0/316.0*DrillingMachineAngle;
如果按下該按鈕,則Arduino將保存當(dāng)前的鉆孔位置。顯示屏上顯示8888,短等待1秒。
如果設(shè)置了停止位置,則在右側(cè)顯示屏上會(huì)顯示直到停止為止的剩余鉆削深度。
組裝:
陀螺儀傳感器最好用熱膠點(diǎn)固定。將連接電纜穿過蓋子。這部分就是這樣。
在第一個(gè)測試中,陀螺儀傳感器必須首先對準(zhǔn)。我是水平安裝的。由于支架設(shè)計(jì)為可旋轉(zhuǎn)的,因此可以輕松進(jìn)行調(diào)整,直到顯示屏上顯示0.0。
測試:
傳感器反應(yīng)非常迅速,計(jì)算出的值與鉆孔深度完全匹配。而且由于采用了大型LED顯示屏,可讀取準(zhǔn)確的鉆削深度。
責(zé)任編輯:pj
-
傳感器
+關(guān)注
關(guān)注
2550文章
51035瀏覽量
753063 -
顯示器
+關(guān)注
關(guān)注
21文章
4970瀏覽量
139925 -
Arduino
+關(guān)注
關(guān)注
188文章
6468瀏覽量
186951
發(fā)布評論請先 登錄
相關(guān)推薦
評論