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