人類的大腦是由復雜的結構層構建的,這有助于我們成為地球上的主導物種。例如,大腦中的內嗅皮層可以給你方向感,幫助你輕松地在你不熟悉的地方導航。但與我們不同的是,機器人和無人駕駛的Ariel車輛需要一些東西來獲得這種方向感,這樣它們就可以在新的地形和景觀中自主操縱。不同的機器人使用不同類型的傳感器來實現這一點,但常用的傳感器是磁力計,它可以通知機器人當前面向的地理圖形方向。這不僅可以幫助機器人感知方向,還可以在預定義的方向和天使中輪流。
由于傳感器可以指示北,南,東和西的地理圖形,我們人類也可以在需要時使用它。因此,在本文中,讓我們嘗試了解磁力計傳感器的工作原理以及如何將其與Arduino等微控制器接口。在這里,我們將構建一個很酷的數字羅盤,它將通過發光指向北方向的LED來幫助我們找到方向。這個數字羅盤是整齊地在PCBGO上制造的,這樣我下次去野外時就可以攜帶它,并希望我能迷路,只是為了用這個東西找到回家的路。讓我們開始吧。
阿爾杜伊諾指南針項目所需材料
阿爾杜伊諾專業迷你版
HMC5883L磁力計傳感器
LED 燈 - 8 否
470歐姆電阻器 – 8Nos
桶杰克
像PCB戈這樣的可靠印刷電路板制造商
小型 FTDI 編程器
個人電腦/筆記本電腦
什么是磁力計,它是如何工作的?
在我們深入研究電路之前,讓我們先了解一下磁力計及其工作原理。顧名思義,萬磁王這個詞并不是指那個瘋狂的變種人,他可以通過在空中彈鋼琴來控制金屬。哦!但我喜歡那個很酷的家伙。
磁力計實際上是一種設備,可以感應地球的磁極,并據此指向方向。我們都知道,地球是巨大的球形磁鐵,有北極和南極。因此存在磁場。磁力計感測這個磁場,并根據磁場的方向,它可以檢測我們面臨的方向。
HMC5883L傳感器模塊的工作原理
HMC5883L作為磁力計傳感器也做同樣的事情。它上面有霍尼韋爾的HMC5883L IC。該 IC 具有 3 種磁阻材料,其內部排列在 x、y 和 z 軸上。流經這些材料的電流量對地球磁場很敏感。因此,通過測量流經這些材料的電流的變化,我們可以檢測到地球磁場的變化。一旦變化被磁場吸收,這些值就可以通過I2C協議發送到任何嵌入式控制器,如微控制器或處理器。
由于傳感器通過感應磁場來工作,因此如果將金屬放置在附近,則輸出值將受到很大影響。也可以利用這種行為將這些傳感器用作金屬檢測機。應注意不要將磁鐵靠近此傳感器,因為來自磁鐵的強磁場可能會觸發傳感器上的錯誤值。
HMC5883L 與 QMC5883L 之間的區別
對于許多初學者來說,圍繞這些傳感器存在一種常見的困惑。這是因為一些供應商(實際上是大多數供應商)銷售QMC5883L傳感器,而不是霍尼韋爾的原始HMC5883L。這主要是因為QMC5883L比HMC5883L模塊便宜得多。可悲的是,這兩個傳感器的工作原理略有不同,并且不能將相同的代碼用于兩者。這是因為兩個傳感器的 I2C 地址不相同。本教程中給出的代碼僅適用于常用傳感器模塊 QMC5883L。
要知道您擁有的是哪種型號的傳感器,您只需仔細觀察IC本身即可閱讀其上寫的內容。如果它寫成類似L883的東西,那么它就是HMC58836L,如果它寫成DA5883之類的東西,那么它就是QMC5883L IC。這兩個模塊都如下圖所示,以便于輕描淡寫。
阿爾杜伊諾數字羅盤電路圖
這款基于Arduino的數字羅盤的電路非常簡單,我們只需將HMC5883L傳感器與Arduino接口,并將8個LED連接到Arduino Pro mini的GPIO引腳。完整的電路圖如下所示
傳感器模塊有5個引腳,其中DRDY(數據就緒)在我們的項目中未使用,因為我們在連續模式下操作傳感器。Vcc 和接地引腳用于從 Arduino 板以 5V 電壓為模塊供電。SCL 和 SDA 是 I2C 通信總線,分別連接到 Arduino Pro 迷你版的 A4 和 A5 I2C 引腳。由于模塊本身在線路上有一個拉高電阻,因此無需在外部添加它們。
為了指示方向,我們使用了8個LED,所有這些LED都通過470歐姆的限流電阻連接到Arduino的GPIO引腳。完整電路由一個 9V 電池通過桶形插孔供電。該 9V 直接提供給 Arduino 的 Vin 引腳,在那里使用 Arduino 上的板載穩壓器將其調節至 5V。然后,該5V用于為傳感器和Arduino供電。
為數字羅盤制造 PCB
電路的想法是將8個LED以圓形方式放置,以便每個LED分別指向所有8個方向,即北,東北,東,東南,南,西南,西和西北。因此,將它們整齊地排列在面包板上甚至性能板上并不容易。為該電路開發PCB將使其看起來更整潔,更易于使用。因此,我打開PCB設計軟件,將LED和電阻器以整齊的圓形模式放置,并連接軌道以形成連接。完成后,我的設計如下所示。
我將其設計為雙面板,因為我希望Arduino位于PCB的底部,這樣它就不會破壞PCB頂部的外觀。如果你擔心你必須為雙面PCB支付高價,那么請堅持住我得到了很好的新來。
現在,我們的設計已經準備就緒,是時候將它們制造出來了。要完成PCB非常容易,只需按照以下步驟操作即可
第 1 步: 進入 www.pcbgogo.com,如果這是您的第一次注冊。然后,在“PCB 原型”選項卡中,輸入 PCB 的尺寸、層數和所需的 PCB 數量。我的PCB是80厘米×80厘米,所以標簽看起來像下面這樣
第 2 步: 單擊“立即報價”按鈕繼續。您將被帶到一個頁面,如果需要,可以設置一些其他參數,例如使用的材料軌道間距等。但大多數情況下,默認值可以正常工作。我們在這里唯一需要考慮的是價格和時間。如您所見,構建時間僅為2-3天,我們的PSB只需花費5美元。然后,您可以根據需要選擇首選的運輸方式。
第 3 步:最后一步是上傳Gerber文件并繼續付款。為了確保過程順利進行,PCBGOGO在繼續付款之前驗證您的Gerber文件是否有效。通過這種方式,您可以確保您的PCB是制造友好的,并將按照承諾到達您手中。
組裝印刷電路板
訂購電路板后,幾天后,它到達了我,盡管快遞在一個整齊的標簽包裝良好的盒子里,并且一如既往地,PCB的質量很棒。我在下面分享了幾張板的圖片供您判斷。
我打開焊條,開始組裝電路板。由于腳印、焊盤、過孔和絲網印刷的形狀和尺寸都非常合適,因此我在組裝電路板時沒有問題。從拆開包裝盒開始,電路板在短短10分鐘內就準備好了。
焊接后的電路板的幾張圖片如下所示。
對阿爾杜伊諾進行編程
現在我們的硬件已經準備就緒,讓我們看看必須上傳到Arduino板中的程序。該代碼的目的是從QMC5883L磁力計傳感器讀取數據并將其轉換為度數(0到360)。一旦我們知道了程度,我們就必須打開指向特定方向的LED。我在這個程序中使用的方向是北方。因此,無論您身在何處,您的電路板上都只有一個LED發光,并且LED的方向將指示北向。一次以后可以計算出另一個方向是已知的一個方向。
此數字羅盤項目的完整代碼可在本頁末尾找到。您可以在包含庫后直接將其上傳到您的板上,然后就可以開始了。但是,如果您想進一步了解代碼中實際發生的情況。
如前所述,我們使用的是QMC5883L IC,為了與IC通信,我們需要知道其寄存器的I2C地址,該地址可以在其數據表中找到。但幸運的是,所有這些都已經完成,并被一個叫做Keeping的人打包成一個圖書館。因此,您所要做的就是通過單擊鏈接下載QMC5883L的庫以獲取ZIP文件。然后,可以通過按照草圖 ->包含庫 -> 添加.ZIP庫,將此 ZIP 文件添加到 Arduino IDE 中。
添加庫后,我們可以繼續我們的程序。我們通過包含所需的庫文件來開始程序,如下所示。線庫用于啟用 I2C 通信,而 MechaQMC5883 是我們剛剛添加到 Arduino 中的一個。此庫包含有關如何與 EMC5883L 傳感器通信的所有信息。
#include //Wire Librarey for I2C communication
#include //QMC5883 Librarey is added since mine is QMC583 and not HMC5883
在下一行中,我們為正在使用的傳感器創建一個對象名稱。我用過qmc這個名字,但它可以是你喜歡的任何東西。
MechaQMC5883 qmc; //Create an object name for the snsor, I have named it as qmc
接下來,我們進入全局變量聲明。在這里,由于我們有8個LED作為輸出,因此很難通過引腳名稱來引用每個LED,因此我們使用陣列選項來引用所有LED。數組的名稱是 ledPins,變量led_count是我們所擁有的 led 的數量。它以 0 開頭。
int ledPins[] = {2,3,4,5,6,7,8,9}; //Array of output pin to which the LED is connected to
char led_count = 7; //Total number of LED pins
在空隙設置功能中,我們初始化 I2C 通信、串行通信和傳感器。然后,我們將所有LED引腳聲明為輸出引腳。由于我們已經使用了數組,因此通過使用 for 循環并在 for 循環中導航來引用所有引腳,如下所示。
void setup() {
Wire.begin(); //Begin I2C communication
Serial.begin(9600); //Begin Serial Communication
qmc.init(); //Initialise the QMC5883 Sensor
for (int thisPin=0; thisPin <= led_count; thisPin++){ //Navigate through all the pins in array
pinMode(ledPins[thisPin],OUTPUT); //Declare them as output
}
}
在無限主循環中,我們必須從傳感器獲取 x,y 和 z 的值,并計算傳感器當前面臨的程度。要讀取 x,y 和 z 的值,請使用以下行
int x,y,z;
qmc.read(&x,&y,&z); //Get the values of X,Y and Z from sensor
用于計算以度為單位的標題的公式如下所示。由于我們不會沿 z 軸旋轉指南針,因此我們不會考慮該值。僅當 IC 平坦表面朝上時,才能使用此公式,就像在我們的設置中一樣。計算出航向后,該值將在-180到180的范圍內,我們必須將其轉換為0到360,就像我們在所有數字羅盤中找到的那樣。
int heading=atan2(x, y)/0.0174532925; //Calculate the degree using X and Y parameters with this formulae
//Convert result into 0 to 360
if(heading < 0)
heading+=360;
heading = 360-heading;
最后一步是向北方向發光。為此,我們有一系列if條件語句,我們檢查當前度數的范圍,并據此打開LED。代碼如下所示
//Based on the value of heading print the result for debugging and glow the respective LED.
if (heading > 338 || heading < 22)
{
Serial.println("NORTH");
digitalWrite(ledPins[0],HIGH);
}
if (heading > 22 && heading < 68)
{
Serial.println("NORTH-EAST");
digitalWrite(ledPins[7],HIGH);
}
if (heading > 68 && heading < 113)
{
Serial.println("EAST");
digitalWrite(ledPins[6],HIGH);
}
if (heading > 113 && heading < 158)
{
Serial.println("SOUTH-EAST");
digitalWrite(ledPins[5],HIGH);
}
if (heading > 158 && heading < 203)
{
Serial.println("SOUTH");
digitalWrite(ledPins[4],HIGH);
}
if (heading > 203 && heading < 248)
{
Serial.println("SOTUH-WEST");
digitalWrite(ledPins[3],HIGH);
}
if (heading > 248 && heading < 293)
{
Serial.println("WEST");
digitalWrite(ledPins[2],HIGH);
}
if (heading > 293 && heading < 338)
{
Serial.println("NORTH-WEST");
digitalWrite(ledPins[1],HIGH);
}
通過查看下表可以理解代碼值背后的邏輯?;旧希覀冇嬎阄覀兠嫦蚰膫€方向,并預測北向并發光相應的LED。
程序的最后一部分是設置結果的更新速度。我已經創建了一個500毫微秒的延遲,然后使所有LED關閉以再次啟動,形成第一個內部的空隙路。但是,如果您需要更快的更新,則可以進一步減少延遲。
delay(500); // update position of LED for every alf seconds
//Turn off the all the LED
for (int thisPin=0; thisPin <= led_count; thisPin++){
digitalWrite(ledPins[thisPin],LOW);
}
測試數字羅盤
由于我們已經使用了Arduino pro mini,我們需要一個像FTDI板這樣的外部程序員來上傳程序。上傳程序后,您應該注意到板上有一個LED發光,LED發光的方向將是NORTH方向。
然后,您可以通過旋轉電路板來玩它,并檢查LED是否仍然指向北方向。之后,您可以隨時使用9V電池為設置供電并檢查您面臨的方向。數字羅盤的完整工作原理可以在下面的視頻中找到。您可能會注意到,當電路板附近有重金屬片時,或者即使您沿著Z軸旋轉電路板,這些值也會出錯。
-
傳感器
+關注
關注
2548文章
50670瀏覽量
751982 -
數字羅盤
+關注
關注
1文章
12瀏覽量
14958 -
磁力計
+關注
關注
1文章
71瀏覽量
20840
發布評論請先 登錄
相關推薦
評論