人類的大腦是由復(fù)雜的結(jié)構(gòu)層構(gòu)建的,這有助于我們成為地球上的主導(dǎo)物種。例如,大腦中的內(nèi)嗅皮層可以給你方向感,幫助你輕松地在你不熟悉的地方導(dǎo)航。但與我們不同的是,機(jī)器人和無人駕駛的Ariel車輛需要一些東西來獲得這種方向感,這樣它們就可以在新的地形和景觀中自主操縱。不同的機(jī)器人使用不同類型的傳感器來實(shí)現(xiàn)這一點(diǎn),但常用的傳感器是磁力計(jì),它可以通知機(jī)器人當(dāng)前面向的地理圖形方向。這不僅可以幫助機(jī)器人感知方向,還可以在預(yù)定義的方向和天使中輪流。
由于傳感器可以指示北,南,東和西的地理圖形,我們?nèi)祟愐部梢栽谛枰獣r使用它。因此,在本文中,讓我們嘗試了解磁力計(jì)傳感器的工作原理以及如何將其與Arduino等微控制器接口。在這里,我們將構(gòu)建一個很酷的數(shù)字羅盤,它將通過發(fā)光指向北方向的LED來幫助我們找到方向。這個數(shù)字羅盤是整齊地在PCBGO上制造的,這樣我下次去野外時就可以攜帶它,并希望我能迷路,只是為了用這個東西找到回家的路。讓我們開始吧。
阿爾杜伊諾指南針項(xiàng)目所需材料
阿爾杜伊諾專業(yè)迷你版
HMC5883L磁力計(jì)傳感器
LED 燈 - 8 否
470歐姆電阻器 – 8Nos
桶杰克
像PCB戈這樣的可靠印刷電路板制造商
小型 FTDI 編程器
個人電腦/筆記本電腦
什么是磁力計(jì),它是如何工作的?
在我們深入研究電路之前,讓我們先了解一下磁力計(jì)及其工作原理。顧名思義,萬磁王這個詞并不是指那個瘋狂的變種人,他可以通過在空中彈鋼琴來控制金屬。哦!但我喜歡那個很酷的家伙。
磁力計(jì)實(shí)際上是一種設(shè)備,可以感應(yīng)地球的磁極,并據(jù)此指向方向。我們都知道,地球是巨大的球形磁鐵,有北極和南極。因此存在磁場。磁力計(jì)感測這個磁場,并根據(jù)磁場的方向,它可以檢測我們面臨的方向。
HMC5883L傳感器模塊的工作原理
HMC5883L作為磁力計(jì)傳感器也做同樣的事情。它上面有霍尼韋爾的HMC5883L IC。該 IC 具有 3 種磁阻材料,其內(nèi)部排列在 x、y 和 z 軸上。流經(jīng)這些材料的電流量對地球磁場很敏感。因此,通過測量流經(jīng)這些材料的電流的變化,我們可以檢測到地球磁場的變化。一旦變化被磁場吸收,這些值就可以通過I2C協(xié)議發(fā)送到任何嵌入式控制器,如微控制器或處理器。
由于傳感器通過感應(yīng)磁場來工作,因此如果將金屬放置在附近,則輸出值將受到很大影響。也可以利用這種行為將這些傳感器用作金屬檢測機(jī)。應(yīng)注意不要將磁鐵靠近此傳感器,因?yàn)閬碜源盆F的強(qiáng)磁場可能會觸發(fā)傳感器上的錯誤值。
HMC5883L 與 QMC5883L 之間的區(qū)別
對于許多初學(xué)者來說,圍繞這些傳感器存在一種常見的困惑。這是因?yàn)橐恍┕?yīng)商(實(shí)際上是大多數(shù)供應(yīng)商)銷售QMC5883L傳感器,而不是霍尼韋爾的原始HMC5883L。這主要是因?yàn)镼MC5883L比HMC5883L模塊便宜得多??杀氖?,這兩個傳感器的工作原理略有不同,并且不能將相同的代碼用于兩者。這是因?yàn)閮蓚€傳感器的 I2C 地址不相同。本教程中給出的代碼僅適用于常用傳感器模塊 QMC5883L。
要知道您擁有的是哪種型號的傳感器,您只需仔細(xì)觀察IC本身即可閱讀其上寫的內(nèi)容。如果它寫成類似L883的東西,那么它就是HMC58836L,如果它寫成DA5883之類的東西,那么它就是QMC5883L IC。這兩個模塊都如下圖所示,以便于輕描淡寫。
阿爾杜伊諾數(shù)字羅盤電路圖
這款基于Arduino的數(shù)字羅盤的電路非常簡單,我們只需將HMC5883L傳感器與Arduino接口,并將8個LED連接到Arduino Pro mini的GPIO引腳。完整的電路圖如下所示
傳感器模塊有5個引腳,其中DRDY(數(shù)據(jù)就緒)在我們的項(xiàng)目中未使用,因?yàn)槲覀冊谶B續(xù)模式下操作傳感器。Vcc 和接地引腳用于從 Arduino 板以 5V 電壓為模塊供電。SCL 和 SDA 是 I2C 通信總線,分別連接到 Arduino Pro 迷你版的 A4 和 A5 I2C 引腳。由于模塊本身在線路上有一個拉高電阻,因此無需在外部添加它們。
為了指示方向,我們使用了8個LED,所有這些LED都通過470歐姆的限流電阻連接到Arduino的GPIO引腳。完整電路由一個 9V 電池通過桶形插孔供電。該 9V 直接提供給 Arduino 的 Vin 引腳,在那里使用 Arduino 上的板載穩(wěn)壓器將其調(diào)節(jié)至 5V。然后,該5V用于為傳感器和Arduino供電。
為數(shù)字羅盤制造 PCB
電路的想法是將8個LED以圓形方式放置,以便每個LED分別指向所有8個方向,即北,東北,東,東南,南,西南,西和西北。因此,將它們整齊地排列在面包板上甚至性能板上并不容易。為該電路開發(fā)PCB將使其看起來更整潔,更易于使用。因此,我打開PCB設(shè)計(jì)軟件,將LED和電阻器以整齊的圓形模式放置,并連接軌道以形成連接。完成后,我的設(shè)計(jì)如下所示。
我將其設(shè)計(jì)為雙面板,因?yàn)槲蚁M鸄rduino位于PCB的底部,這樣它就不會破壞PCB頂部的外觀。如果你擔(dān)心你必須為雙面PCB支付高價,那么請堅(jiān)持住我得到了很好的新來。
現(xiàn)在,我們的設(shè)計(jì)已經(jīng)準(zhǔn)備就緒,是時候?qū)⑺鼈冎圃斐鰜砹?。要完成PCB非常容易,只需按照以下步驟操作即可
第 1 步: 進(jìn)入 www.pcbgogo.com,如果這是您的第一次注冊。然后,在“PCB 原型”選項(xiàng)卡中,輸入 PCB 的尺寸、層數(shù)和所需的 PCB 數(shù)量。我的PCB是80厘米×80厘米,所以標(biāo)簽看起來像下面這樣
第 2 步: 單擊“立即報(bào)價”按鈕繼續(xù)。您將被帶到一個頁面,如果需要,可以設(shè)置一些其他參數(shù),例如使用的材料軌道間距等。但大多數(shù)情況下,默認(rèn)值可以正常工作。我們在這里唯一需要考慮的是價格和時間。如您所見,構(gòu)建時間僅為2-3天,我們的PSB只需花費(fèi)5美元。然后,您可以根據(jù)需要選擇首選的運(yùn)輸方式。
第 3 步:最后一步是上傳Gerber文件并繼續(xù)付款。為了確保過程順利進(jìn)行,PCBGOGO在繼續(xù)付款之前驗(yàn)證您的Gerber文件是否有效。通過這種方式,您可以確保您的PCB是制造友好的,并將按照承諾到達(dá)您手中。
組裝印刷電路板
訂購電路板后,幾天后,它到達(dá)了我,盡管快遞在一個整齊的標(biāo)簽包裝良好的盒子里,并且一如既往地,PCB的質(zhì)量很棒。我在下面分享了幾張板的圖片供您判斷。
我打開焊條,開始組裝電路板。由于腳印、焊盤、過孔和絲網(wǎng)印刷的形狀和尺寸都非常合適,因此我在組裝電路板時沒有問題。從拆開包裝盒開始,電路板在短短10分鐘內(nèi)就準(zhǔn)備好了。
焊接后的電路板的幾張圖片如下所示。
對阿爾杜伊諾進(jìn)行編程
現(xiàn)在我們的硬件已經(jīng)準(zhǔn)備就緒,讓我們看看必須上傳到Arduino板中的程序。該代碼的目的是從QMC5883L磁力計(jì)傳感器讀取數(shù)據(jù)并將其轉(zhuǎn)換為度數(shù)(0到360)。一旦我們知道了程度,我們就必須打開指向特定方向的LED。我在這個程序中使用的方向是北方。因此,無論您身在何處,您的電路板上都只有一個LED發(fā)光,并且LED的方向?qū)⒅甘颈毕?/strong>。一次以后可以計(jì)算出另一個方向是已知的一個方向。
此數(shù)字羅盤項(xiàng)目的完整代碼可在本頁末尾找到。您可以在包含庫后直接將其上傳到您的板上,然后就可以開始了。但是,如果您想進(jìn)一步了解代碼中實(shí)際發(fā)生的情況。
如前所述,我們使用的是QMC5883L IC,為了與IC通信,我們需要知道其寄存器的I2C地址,該地址可以在其數(shù)據(jù)表中找到。但幸運(yùn)的是,所有這些都已經(jīng)完成,并被一個叫做Keeping的人打包成一個圖書館。因此,您所要做的就是通過單擊鏈接下載QMC5883L的庫以獲取ZIP文件。然后,可以通過按照草圖 ->包含庫 -> 添加.ZIP庫,將此 ZIP 文件添加到 Arduino IDE 中。
添加庫后,我們可以繼續(xù)我們的程序。我們通過包含所需的庫文件來開始程序,如下所示。線庫用于啟用 I2C 通信,而 MechaQMC5883 是我們剛剛添加到 Arduino 中的一個。此庫包含有關(guān)如何與 EMC5883L 傳感器通信的所有信息。
#include //Wire Librarey for I2C communication
#include //QMC5883 Librarey is added since mine is QMC583 and not HMC5883
在下一行中,我們?yōu)?strong>正在使用的傳感器創(chuàng)建一個對象名稱。我用過qmc這個名字,但它可以是你喜歡的任何東西。
MechaQMC5883 qmc; //Create an object name for the snsor, I have named it as qmc
接下來,我們進(jìn)入全局變量聲明。在這里,由于我們有8個LED作為輸出,因此很難通過引腳名稱來引用每個LED,因此我們使用陣列選項(xiàng)來引用所有LED。數(shù)組的名稱是 ledPins,變量led_count是我們所擁有的 led 的數(shù)量。它以 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
在空隙設(shè)置功能中,我們初始化 I2C 通信、串行通信和傳感器。然后,我們將所有LED引腳聲明為輸出引腳。由于我們已經(jīng)使用了數(shù)組,因此通過使用 for 循環(huán)并在 for 循環(huán)中導(dǎo)航來引用所有引腳,如下所示。
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
}
}
在無限主循環(huán)中,我們必須從傳感器獲取 x,y 和 z 的值,并計(jì)算傳感器當(dāng)前面臨的程度。要讀取 x,y 和 z 的值,請使用以下行
int x,y,z;
qmc.read(&x,&y,&z); //Get the values of X,Y and Z from sensor
用于計(jì)算以度為單位的標(biāo)題的公式如下所示。由于我們不會沿 z 軸旋轉(zhuǎn)指南針,因此我們不會考慮該值。僅當(dāng) IC 平坦表面朝上時,才能使用此公式,就像在我們的設(shè)置中一樣。計(jì)算出航向后,該值將在-180到180的范圍內(nèi),我們必須將其轉(zhuǎn)換為0到360,就像我們在所有數(shù)字羅盤中找到的那樣。
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;
最后一步是向北方向發(fā)光。為此,我們有一系列if條件語句,我們檢查當(dāng)前度數(shù)的范圍,并據(jù)此打開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);
}
通過查看下表可以理解代碼值背后的邏輯?;旧?,我們計(jì)算我們面向哪個方向,并預(yù)測北向并發(fā)光相應(yīng)的LED。
程序的最后一部分是設(shè)置結(jié)果的更新速度。我已經(jīng)創(chuàng)建了一個500毫微秒的延遲,然后使所有LED關(guān)閉以再次啟動,形成第一個內(nèi)部的空隙路。但是,如果您需要更快的更新,則可以進(jìn)一步減少延遲。
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);
}
測試數(shù)字羅盤
由于我們已經(jīng)使用了Arduino pro mini,我們需要一個像FTDI板這樣的外部程序員來上傳程序。上傳程序后,您應(yīng)該注意到板上有一個LED發(fā)光,LED發(fā)光的方向?qū)⑹荖ORTH方向。
然后,您可以通過旋轉(zhuǎn)電路板來玩它,并檢查LED是否仍然指向北方向。之后,您可以隨時使用9V電池為設(shè)置供電并檢查您面臨的方向。數(shù)字羅盤的完整工作原理可以在下面的視頻中找到。您可能會注意到,當(dāng)電路板附近有重金屬片時,或者即使您沿著Z軸旋轉(zhuǎn)電路板,這些值也會出錯。
-
傳感器
+關(guān)注
關(guān)注
2545文章
50459瀏覽量
751104 -
數(shù)字羅盤
+關(guān)注
關(guān)注
1文章
12瀏覽量
14954 -
磁力計(jì)
+關(guān)注
關(guān)注
1文章
71瀏覽量
20824
發(fā)布評論請先 登錄
相關(guān)推薦
評論