在中,你可以使用 HMC5883L 三軸力計(jì)測量這個(gè)地球磁場的大小和方向。
介紹
在這個(gè)中,我們的 HMC5883L 3 項(xiàng)目設(shè)備可以測量地球?qū)⒋帕τ?jì)連接到 Arduino 方向。 Uno。它是一種以低軸設(shè)備中的設(shè)備,可以在手機(jī)或?qū)Ш街?,找到提供?zhǔn)確的您航還可以使用它們來檢測含鐵(含鐵)金屬,因?yàn)榻饘僦械蔫F在靠近傳感器的時(shí)候會(huì)改變磁場。
別迷路,讓我們開始吧!
204像素LCD
與16x2 LCD相比,20x4 LCD每行增加了兩行。與我們在之前的項(xiàng)目中使用的16x2類似,204LCD使用日立x,因此命令和接口也是一樣的。具有相同的 16 針接頭,允許您在不更改任何接線的情況下拔下 16x2 LCD 并插入 20x4。我們列唯一需要的是一行代碼 lcd.begin(20, 4),它指定 LCD 的(第一個(gè)個(gè))和行(第二個(gè)參數(shù))。20x4 LCD 的圖像如下所示:
HMC5883L 三軸磁力計(jì)
HMC5883L 3軸磁力計(jì)可以精確測量地球在x、y、z的大小和方向。是一款外形類似的低調(diào)設(shè)備,可以讓您將其插入到幾乎任何需要指南的項(xiàng)目中。下面提供了一些不同的規(guī)格:
設(shè)備 HMC 的 5 分 DR 板和 5 分 DR 的數(shù)據(jù)線組成: VIN、DY、SCL 組成的數(shù)據(jù)線(如圖所示)該模塊在 2.7V 至 6.5V 的電壓工作,但我們無法讓磁力計(jì)在 5V 電壓下工作,因此我們建議使用 3Vdc 范圍內(nèi)的連接模塊。電壓。
為了使用與部署設(shè)備通信的方式,我們使用 CL 和 S 的 I2C 來配置設(shè)備上的交付模式和輸出模式),并獲取 X Y 和 Z 。該0x1 0x1 設(shè)備進(jìn)行7 次編排,因此在IE2C 處設(shè)備上進(jìn)行多個(gè)。
DR(但您的數(shù)據(jù))用于傳輸(Uno X、Y和Z向主設(shè)備的數(shù)據(jù)已發(fā)送)17月7日。DR DY DY,可以通過使用頻率到達(dá)目的地。您可以訪問可以在這個(gè)目的地連接到這個(gè)目的地,但不能在這個(gè)目的地中使用有效的地權(quán)。
該設(shè)備在其這些 3 個(gè)軸的每個(gè)軸上裝有一個(gè)電阻器,用于測量下磁場變化。在磁場存在的情況下,元件的電阻會(huì)發(fā)生變化,從而導(dǎo)致輸出電壓發(fā)生變化。器件的 12 位 ADC 在每個(gè)軸上測量,然后將測量結(jié)果寫入相應(yīng)的 X、Y 和 Z 8 位數(shù)據(jù)。
下面這張表要顯示屏幕顯示我們的屏幕顯示價(jià)值。在屏幕上的屏幕顯示我們的屏幕。 IC的數(shù)據(jù)表:
當(dāng)您必須圍繞 X、Y 和 Z 軸旋轉(zhuǎn)設(shè)備時(shí),各個(gè)軸的結(jié)構(gòu)發(fā)生變化,使之如圖所示。
將磁力計(jì)安裝到您的圖標(biāo)。您將需要一個(gè) M2 角支架、M2 螺栓和 M2 允許以六角支架來安裝它。這個(gè) XY 平面與提供垂直方向,并保持Adapticon您可以使用正確的計(jì)算盤航向您的燃料罐,因此可以向您使用準(zhǔn)確的計(jì)算盤。確保有色金屬磁安裝的硬件圍繞著 Z 軸顯示。
我們將把 12 英寸跨接線連接到上面,我們就可以在左右方向連接設(shè)備這樣自由。
無焊面包板
您如果使用的是無焊面包板,請(qǐng)使用下面的示意圖為 16×2 LCD 進(jìn)行必要的連接。磁力計(jì)通過 12 英寸 F/M 跳線直接連接到 Uno。我們使用 Uno 的3V電源,是Fuel的3V而不是3能夠?qū)崿F(xiàn)。因?yàn)楣^針的0.1英寸間距太近,將測試夾線電纜安裝
注:16×4液晶顯示,但需要2×4液晶顯示與中圖。
如果您連接
到 Fuel Can 的懸空制作,請(qǐng)繼續(xù)操作。您需要的天線和兩個(gè)接地板為您提供測試使用接線夾,+5個(gè)接地線的接地線。用于為 LCD 供電。
計(jì)算機(jī),USB的A端插入U(xiǎn)SB1型,使用,將B端未連接型插入U(xiǎn)SB1型連接的端頭。 6‘A A型連接器 - 外部連接器插入(即主機(jī))。 AC-DC 電源為 FuelCan 供電。
函數(shù)首先必須從setOperatingMode
()和設(shè)備通信中使用setOperatingMode()和設(shè)備通信,因此請(qǐng)?jiān)谖覀兊脑O(shè)備上使用setOperatingMode()進(jìn)行配置,以將數(shù)據(jù)操作模式設(shè)置為連續(xù),將每個(gè)測量輸出的平均樣本數(shù)設(shè)置為 8 個(gè)。其他所有內(nèi)容都將保留默認(rèn)值。
現(xiàn)在已經(jīng)配置好了,我們可以開始使用函數(shù)getXYZ()獲取原始X、Y和Z數(shù)據(jù)。這個(gè)函數(shù)獲取X、Y和Z的每一個(gè)16位數(shù)據(jù)。getXYZ()中的Wire.requestFrom()函數(shù)用于請(qǐng)求 6 個(gè)字節(jié)的數(shù)據(jù)。
X、 和 Z 的值,為了使用 Y 函數(shù)convert(用于測量我們轉(zhuǎn)換為高的單位)。必須進(jìn)行轉(zhuǎn)換,必須使用 IC 數(shù)據(jù)表格的原始值表 9(用于使用 1090 的大小,我們可以用一個(gè)簡單的縮放比例,將我們的每一個(gè)鏡頭都以高標(biāo)準(zhǔn)的比例分配給我們。
在我們將數(shù)據(jù)輸出到設(shè)備之前,可以用它來計(jì)算出設(shè)備的最后一個(gè)方向。 () 完成。了解切是在 (X, Y) 點(diǎn)和 x 軸之間計(jì)算的,如下圖所示。我們的原因是能夠計(jì)算出所有象限的使用情況。
atan2弧度角度,因此我們可以將其轉(zhuǎn)換為度數(shù)。 360我們可以刪除360。并且航向數(shù)據(jù)已經(jīng)歸化,我們可以通過現(xiàn)在已經(jīng)展示給它計(jì)算。
//將 HMC5883L 3 軸數(shù)字羅盤連接到 Arduino Uno
/*Copyright (c) 2019, ProteShea LLC
保留所有權(quán)利。 如果滿足以下條件,則允許
以源代碼和二進(jìn)制形式重新分發(fā)和使用,無論是否修改: 1. 重新分發(fā)源代碼必須保留上述版權(quán) 聲明、此條件列表和以下免責(zé)聲明。 2. 二進(jìn)制形式的再分發(fā)必須在 隨分發(fā)提供的文檔和/或其他材料中復(fù)制上述版權(quán) 聲明、此條件列表和以下免責(zé)聲明。 3. 既不是版權(quán)持有人的姓名,也不是
未經(jīng)事先書面許可,其貢獻(xiàn)者的姓名可用于認(rèn)可或推廣
源自本軟件的產(chǎn)品。
本軟件由版權(quán)持有人“按原樣”提供,
不提供任何明示或默示的保證,包括但不限于對(duì)
適銷性和特定用途適用性的默示保證
。在任何情況下,版權(quán)所有者均不對(duì)任何
直接、間接、偶然、特殊、懲戒性或后果性損害
(包括但不限于采購替代商品或服務(wù);
使用、數(shù)據(jù)或利潤或業(yè)務(wù)損失)負(fù)責(zé)中斷)無論是由何種原因造成的,
以及基于任何責(zé)任理論,無論是合同、嚴(yán)格責(zé)任或侵權(quán)
(包括疏忽或其他原因)以任何方式因使用本
軟件而引起的,即使已被告知存在此類損害的可能性。
*/
#include
//寄存器地址映射
#define configA 0x00
#define configB 0x01
#define mode 0x02
#define dataOutX_U 0x03
#define dataOutX_L 0x04
#define dataOutZ_L 0x05
#define dataOutZ_L 0x06
#define dataOutY_L 0x07
#define dataOutY_L 0x08
#define statusReg 0x09
//工作模式發(fā)送到模式寄存器(0x02)
#define Continuous 0x00
#define single 0x01
#define idle 0x02
#define i2c_addr 0x1E
#define gain 1090
int16_t x = 0;
int16_t y = 0;
int16_t z = 0;
浮動(dòng)航向;
浮動(dòng)高斯X;
浮動(dòng)高斯Y;
浮動(dòng)高斯Z;
void setup() {
Wire.begin();
序列號(hào).開始(9600);
設(shè)置操作模式(連續(xù));
集合樣本();
}
無效循環(huán)() {
getXYZ();
轉(zhuǎn)換(x,y,z);
獲取航向(高斯X,高斯Y,高斯Z);
Serial.print("X:");
Serial.print(gaussX);
Serial.print("Y:");
串行打?。ǜ咚筜);
Serial.print("Z:");
Serial.println(gaussZ);
Serial.print("標(biāo)題:");
Serial.println(標(biāo)題);
延遲(500);
}
//將原始X、Y、Z計(jì)數(shù)轉(zhuǎn)換為高斯
void convert(int16_t rawX, int16_t rawY, int16_t rawZ){
gaussX = (float)rawX/gain;
gaussY = (float)rawY/gain;
gaussZ = (float)rawZ/增益;
}
//考慮磁偏角(取決于位置的磁場誤差)
void getHeading(float X, float Y, float Z){
heading = (atan2(Y,X) - 0.1) * 180 / PI;
如果 (標(biāo)題 < 0) 標(biāo)題 += 360;
如果(標(biāo)題> 360)標(biāo)題-= 360;
}
void setSamples(void){
Wire.beginTransmission(i2c_addr);
Wire.write(configA);//寫入配置A寄存器
Wire.write(0x70);//8個(gè)樣本平均,15Hz輸出速率,正常測量
Wire.endTransmission();
延遲(10);
}
void setOperatingMode(uint8_t addr){
Wire.beginTransmission(i2c_addr);
Wire.write(模式);//寫入模式寄存器
Wire.write(addr);//設(shè)置測量模式
Wire.endTransmission();
延遲(10);
}
//從寄存器 0x??03 到 0x08 獲取 X、Y、Z 的原始計(jì)數(shù)
void getXYZ(void){
Wire.beginTransmission(i2c_addr);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(i2c_addr, 6);
if (Wire.available() >= 6){
int16_t temp = Wire.read();//讀取X的高字節(jié)
x = temp << 8;
temp = Wire.read();//讀取X的低字節(jié)
x = x |溫度;
temp = Wire.read();//讀取 Z 的高字節(jié)
z = temp << 8;
temp = Wire.read();//讀取 Z 的低字節(jié)
z = z |溫度;
temp = Wire.read();//讀取 Y 的高字節(jié)
y = temp << 8;
temp = Wire.read();//讀取 Y 的低字節(jié)
y = y |溫度;
}
}
下一個(gè)示例通過調(diào)用函數(shù)writeLCD()在20×4 LCD上顯示數(shù)據(jù)。
//將 HMC5883L 3 軸數(shù)字羅盤連接到 Arduino Uno 并
在 20x4 LCD 上顯示 //數(shù)據(jù)
/*版權(quán) (c) 2019,ProteShea LLC
保留所有權(quán)利。 如果滿足以下條件,則允許
以源代碼和二進(jìn)制形式重新分發(fā)和使用,無論是否修改: 1. 重新分發(fā)源代碼必須保留上述版權(quán) 聲明、此條件列表和以下免責(zé)聲明。 2. 二進(jìn)制形式的再分發(fā)必須在 隨分發(fā)提供的文檔和/或其他材料中復(fù)制上述版權(quán) 聲明、此條件列表和以下免責(zé)聲明。 3. 既不是版權(quán)持有人的姓名,也不是
未經(jīng)事先書面許可,其貢獻(xiàn)者的姓名可用于認(rèn)可或推廣
源自本軟件的產(chǎn)品。
本軟件由版權(quán)持有人“按原樣”提供,
不提供任何明示或默示的保證,包括但不限于對(duì)
適銷性和特定用途適用性的默示保證
。在任何情況下,版權(quán)所有者均不對(duì)任何
直接、間接、偶然、特殊、懲戒性或后果性損害
(包括但不限于采購替代商品或服務(wù);
使用、數(shù)據(jù)或利潤或業(yè)務(wù)損失)負(fù)責(zé)中斷)無論是由何種原因造成的,
以及基于任何責(zé)任理論,無論是合同、嚴(yán)格責(zé)任或侵權(quán)
(包括疏忽或其他原因)以任何方式因使用本
軟件而引起的,即使已被告知存在此類損害的可能性。
*/
#include
#include
//寄存器地址映射
#define configA 0x00
#define configB 0x01
#define mode 0x02
#define dataOutX_U 0x03
#define dataOutX_L 0x04
#define dataOutZ_L 0x05
#define dataOutZ_L 0x06
#define dataOutY_L 0x07
#define dataOutY_L 0x08
#define statusReg 0x09
//操作模式發(fā)送到模式寄存器(0x02)
#define Continuous 0x00
#define single 0x01
#define idle 0x02
#define i2c_addr 0x1E
#define gain 1090
const int RS = 2, EN = 3, D4 = 4, D5 = 5, D6 = 6, D7 = 7;
LiquidCrystal lcd(RS,EN,D4,D5,D6,D7);//設(shè)置連接到 LCD 的 Uno 引腳,4 位模式
int16_t x = 0;
int16_t y = 0;
int16_t z = 0;
浮動(dòng)航向;
浮動(dòng)高斯X;
浮動(dòng)高斯Y;
浮動(dòng)高斯Z;
void setup() {
Wire.begin();
lcd.開始(20,4);//設(shè)置20列4行20x4 LCD
setOperatingMode(continuous);
集合樣本();
}
無效循環(huán)() {
getXYZ();
轉(zhuǎn)換(x,y,z);
獲取航向(高斯X,高斯Y,高斯Z);
寫液晶顯示器();
延遲(500);
}
無效寫入液晶顯示器(無效){
lcd.clear();
lcd.print("X:");
lcd.print(高斯X);
lcd.setCursor(0,1);
lcd.print("Y:");
lcd.print(高斯);
lcd.setCursor(0,2);
lcd.print("Z:");
lcd.print(高斯Z);
lcd.setCursor(0,3);
lcd.print("標(biāo)題:");
lcd.print(標(biāo)題);
}
//將原始X、Y、Z計(jì)數(shù)轉(zhuǎn)換為高斯
void convert(int16_t rawX, int16_t rawY, int16_t rawZ){
gaussX = (float)rawX/gain;
gaussY = (float)rawY/gain;
gaussZ = (float)rawZ/增益;
}
//考慮磁偏角(取決于位置的磁場誤差)
void getHeading(float X, float Y, float Z){
航向 = (atan2(Y,X) - 0.1) * 180 / PI;
如果 (標(biāo)題 < 0) 標(biāo)題 += 360;
如果(標(biāo)題> 360)標(biāo)題-= 360;
}
void setSamples(void){
Wire.beginTransmission(i2c_addr);
Wire.write(configA);//寫入配置A寄存器
Wire.write(0x70);//8 個(gè)樣本平均,15Hz 輸出速率,正常測量
Wire.endTransmission();
延遲(10);
}
void setOperatingMode(uint8_t addr){
Wire.beginTransmission(i2c_addr);
Wire.write(模式);//寫入模式寄存器
Wire.write(addr);//設(shè)置測量模式
Wire.endTransmission();
延遲(10);
}
//從寄存器 0x??03 到 0x08 獲取 X、Y、Z 的原始計(jì)數(shù)
void getXYZ(void){
Wire.beginTransmission(i2c_addr);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(i2c_addr, 6);
if (Wire.available() >= 6){
int16_t temp = Wire.read();//讀取X的高字節(jié)
x = temp << 8;
temp = Wire.read();//讀取X的低字節(jié)
x = x |溫度;
temp = Wire.read();//讀取 Z 的高字節(jié)
z = temp << 8;
temp = Wire.read();//讀取 Z 的低字節(jié)
z = z |溫度;
temp = Wire.read();//讀取 Y 的高字節(jié)
y = temp << 8;
temp = Wire.read();//讀取 Y 的低字節(jié)
y = y |溫度;
}
}
-
三軸磁力計(jì)
+關(guān)注
關(guān)注
0文章
7瀏覽量
8419 -
HMC5883L
+關(guān)注
關(guān)注
0文章
25瀏覽量
15082
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論