步驟1:您需要的東西
您可能已有一個使用MPU-9150的Arduino項目,在這種情況下,您可以將我的草圖加載到其中。 Neopixel環僅使用一個Arduino輸出引腳。
或者,您可以使用此處描述的設置。您可以使用其他功能來擴展它,并且可以根據需要為其他基于Neopixel環的項目使用其他硬件。
您將需要:
基于ATMega328的Arduino和電源(盡管您可能會使用其他電源)
MPU-9150加速度計/陀螺儀/磁力計
Adafruit Neopixel環,12像素大小或更大的
無焊面包板,剝離板和跳線。
MPU-9150輸入不容許5V的電壓,因此以5V運行Arduino時,您將需要具有2個或更多電壓的5V/3.3V電平轉換器通道。這些東西從遠東eBay賣家那里非常便宜。由于Neopixels需要5V的全部電壓,因此您不能簡單地以3.3V的電壓運行整個項目。
電平轉換器將Arduino的SDA和SCL引腳以5V的電平供電,并以3.3V的電壓提供給MPU -9150。為此,它一方面需要5V電源,另一方面需要3.3V電源。幸運的是,常見的MPU-9150板包含3.3V穩壓器,但是不幸的是,其輸出未在任何引腳上提供。因此,必須如圖所示將細線焊接到穩壓器的輸出引腳上。
找到穩壓器,該穩壓器應標記為KB33(在第二張圖片的頂部)。您將需要一只穩定的手和一個尖尖的烙鐵。將一根細線焊接到右上角的插針上。建立良好的連接后,請用一滴強力膠將其覆蓋,以防止其輕易脫落。
步驟2:將其連接
接線將取決于您使用的是插線板還是無焊面包板,哪種類型的Arduino,以及是否使用電平轉換器,因此我將為您確定接線或插線板布局。 (如果您覺得做不到,請嘗試一個或兩個簡單的Arduino項目或使用Stripboard的項目,然后在有想法的情況下返回。)
電平轉換器具有除Gnd之外,還有兩個標為HV和LV的電源輸入。使用您焊接到的細線,將HV連接到5V電源,將LV連接到MPU-9150的3.3V輸出。 Arduino的SDA和SCL引腳使用5V邏輯電平,并連接到電平轉換器的HV1和HV2引腳。然后,LV1和LV2引腳以3.3V邏輯電平向MPU-9150提供相同的信號。您的設備可能還具有未使用的HV3,HV4,LV3和LV4連接。
步驟3:對Arduino進行編程
該草圖包括三個文件(附加)。將這三個都復制到Arduino sketch文件夾中的新文件夾“ Compass”中。然后,草圖應出現在Arduino IDE的草圖簿中。
在編譯之前,請檢查“指南針”選項卡下文件頂部的#define配置選項,并根據需要進行修改。
PIN定義用于Neopixel數據輸入的Arduino引腳,默認情況下為引腳8。
BRILL是默認的像素亮度,最大可以為255,但是更高的值會造成盲目和可能消耗的電流超過電源所能提供的電流,尤其是使用較大尺寸的環之一時。我通常不會超過30。
PIXELS是指環中的像素數。 Adafruit當前提供的尺寸為12(非常好用),16、24(非常不錯的尺寸)和60(巨大-如果您有足夠的錢就可以了)。
已反轉:如果您的戒指與MPU-9150在電路板的同一側,請保留此注釋掉。相對于MPU-9150,第一個像素應位于加速度計的正Y方向。取消注釋您的戒指在板子的另一側(已將板子繞Y軸翻轉)。
您將需要下載并安裝MPU6050庫(其中還包含代碼)用于MPU-9150,是MPU6050的超集)和Adafruit Neopixel庫。編譯草圖并將其上傳到Arduino。
步驟4:自動校準過程
首次運行草圖時,它首先輸入校準值程序。將完成的設備放在桌子上方幾英寸的地方,使電路板的一個邊緣與桌子的邊緣對齊,或者與其他固定的直邊對齊。
Neopixel環將顯示一些綠色和一些藍色像素。調平電路板,直到它們全部變為綠色。剩余的藍色像素表示該邊太高(天空為藍色)。當滿足水平要求時,將讀取數個磁力計讀數,然后將所有像素閃爍一次。
現在,它將要求您在4個方向上將其傾斜45度,以綠色提示和藍色像素一樣,在每個位置進行測量,并將所有像素閃爍2、3、4,最后閃爍5次。始終注意使板的邊緣與桌子的邊緣對齊。
整個過程將重復3次,然后將計算并存儲磁力計的偏移量。
一旦校準,草圖將模擬指南針。消除藍色像素以使電路板保持水平,從而獲得可靠的讀數。紅點疊加在一起,表示北。點從一個像素移動到下一個像素時逐漸淡出。
您可以根據需要使它重新進入校準模式,只需將板急劇地向另一方向扭轉幾下即可。
p》
第5步:在自己的項目中使用草圖
您可以將校準功能合并到自己的項目中,方法是將我的代碼合并到自己的代碼中或添加代碼挖掘,取決于您已經走了多遠。 Mine包含鉤子,可用于添加其他功能。
如果將Mine合并到自己的鉤子中,請完成Calibrate和Functions選項卡。在“指南針”選項卡中,您需要將我的Setup()函數與您的函數合并,并將之前的所有內容合并到您的代碼中。您只需要調用Calibrate()函數即可進入校準模式。
“校準”選項卡包含兩個#define語句。 NUMSAMPLES定義每個位置獲取多少個磁力計讀數。可能沒有特別的理由將其從10更改。這樣的數字可以確保始終保持穩定。 NUMTESTS定義要重復執行5個位置的完整過程的次數。一個很好的數字是3,但是對于速度而言,如果您只想進行粗略的校準,則1可能就足夠了。
步驟6:使用其他硬件
相同的技術可以用于其他磁力計,并且不僅限于Arduino,還必須對其進行調整,并可能將其從C語言翻譯為另一種語言。
如果將代碼修改為如果要使用其他磁力計,則MPU-9150會對磁力計和加速度計使用不同的坐標系。從一個交換到另一個需要交換X和Y值并取反Z。這是在readMag()函數中完成的,以便其余代碼可以僅在加速度計的坐標系中工作。一旦計算出偏移量,就將其轉換回磁力計坐標以進行存儲。
使用其他磁力計,原則上您只需要替換readMag()函數即可。
三個數組,mx [],my []和mz [] 5個元素中的每一個,將磁力計讀數保持在5個位置(即水平)上,分別繞X軸旋轉45度,然后繞X軸旋轉,以及類似地繞Y軸旋轉。旋轉加速度計輸出的位置(第一個位置除外),以便displayCal()函數只需要計算變量“ angle”和“ up”,作為與所需方向和方向(作為浮點像素數)的角度最大的坡度。將誤差的大小轉換為對數刻度,以在誤差較小時提供最大的靈敏度。當誤差在限制范圍內時,displayCal()函數將返回布爾值true,一旦這樣做,行中就會以固定次數多次校準Calibrate()存儲磁力計讀數。
實際計算偏移量的計算需要幾頁代數和三角函數,但僅用4行代碼即可實現。您可能會認識到魔術數0.7071是2或cos(45?)的平方根的一半。從1減去這個得到第二個魔術數0.29289并將其加倍得到第三個魔術數0.58579。畢竟不是魔術。
在校準中使用的45度傾斜沒有什么特別之處,但是它確實大大簡化了數學運算。原則上,您可以將設備繞垂直方向滾動,連續獲取來自加速度計和磁力計的讀數,并計算偏移量,直到計算出的平均值穩定在一個可靠的結果附近,但數學會復雜得多。 iOS Compass應用程序執行此操作,這是我自動校準的想法。
-
校準
+關注
關注
1文章
154瀏覽量
21863 -
磁力計
+關注
關注
1文章
71瀏覽量
20851
發布評論請先 登錄
相關推薦
評論