LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
IoT

e-kompas: konstrukcja i kalibracja elektronicznego kompasu z kompensacją przechyłu

Nowoczesne smartfony zawierają wbudowany kompas elektroniczny (eCompass). W jaki sposób są kompensowane drgania i jak skalibrować eCompass w obecności interferencji magnetycznych płytki drukowanej? Niniejszy artykuł wyjaśnia, jak za pomocą dobrego akcelerometru i magnetometru zaprojektowanych dla smartfonów dodać eCompass z kompensacją przechyłu do własnego projektu za mniej niż 5 dolarów.

 

>>> Przykładowy projekt e-compasu, opracowany w naszym laboratorium jest dostępny pod adresem.

 

 

 

Gdy tylko na rynku pojawia się zapotrzebowanie na dużą ilość układów elektronicznych, ich producenci szybko dostarczają wysokiej jakości rozwiązań po zaskakująco niskich cenach. Ostatnim przykładem jest rynek czujników do produktów konsumenckich. Na początku pojawiły się akcelerometry służące do wyboru pionowej lub poziomej orientacji obrazu, jednak wraz z dodaniem magnetometru rozwinęły się do postaci kompasu elektronicznego. W tej formie służą do orientacji smartfonu względem mapy i pozwalają realizację rozszerzonej rzeczywistości. Z tego powodu ceny akcelerometrów i magnetometrów w ilościach hurtowych spadły poniżej dolara za sztukę.

Sam magnetometr nie jest w stanie podać dokładnej orientacji kompasu z dwóch powodów.  Po pierwsze, wartość pola magnetycznego zmienia się znacznie w zależności od wychylenia. Po drugie, magnetometr wymaga kalibracji nie tylko swojego własnego wskazania, ale też kompensacji pól magnetycznych generowanych przez elementy ferromagnetyczne znajdujące się na płytce drukowanej. W tym artykule opisano, w jaki sposób akcelerometr może skompensować wpływ wychylenia na wskazania magnetometru, a także prostą metodę kalibracji magnetometru.

 

Wybór czujnika

Akcelerometr powinien być trójosiowy i zdolny do pracy w zakresie przyspieszeń +/– 2g, a także mieć rozdzielczość przynajmniej 10 bitów. Wyjście akcelerometru o takiej rozdzielczości pracującego w zakresie +/– 2g będzie przyjmować 512 dyskretnych wartości podczas obrotu akcelerometru o 180 stopni – od kierunku pionowo w dół aż do pionowo w górę. Oznacza to typową czułość na poziomie 0,35 stopnia. Jest to więcej, niż precyzja wymagana do kompensacji przechyłu.

Warto sprawdzić w danych katalogowych dokładność w stanie spoczynku (0-g offset accuracy), która oznacza wartość na wyjściu w warunkach spadku swobodnego. Wartość ta wnosi stały błąd wskazania dla każdej osi akcelerometru, a tym samym do obliczonych kątów przechyłu. Warto więc wybrać model, dla którego wartość ta jest mniejsza, niż 50 mg.

Typowa wartość natężenia pola ziemskiego jest na poziomie 50 uT wraz ze składową poziomą, która zmienia się wzdłuż powierzchni ziemi, od wartość maksymalnej 40 uT do 0 na biegunach geomagnetycznych. Jeśli zachodzi prawdopodobieństwo użycia kompasu w poziomym polu magnetycznym o wartości 10 uT (na przykład w obszarach podbiegunowych) z dopuszczalnym szumem +- 3 stopnie, z obliczeń wynika, że maksymalny poziom szumu własnego akcelerometru musi wynosić 0,5 uT.

W większości moich projektów korzystałem z trójosiowych akcelerometrów Freescale MMA8451Q  o rozdzielczości 14 bitów i trójosiowego magnetometru MAG3310.  Model MMA8451Q jest umieszczony w obudowie QFN w wymiarach 3 x 3 x 1 mm z 16. wyprowadzeniami i podaje wynik z dokładnością 14 bitów, a jego błąd wskazania 0g wynosi +/– 30 mg. Magnetometr MAG3310 znajduje się w obudowie DFN 2 x 2 x 0,85 mmz 10. wyprowadzeniami z pozwala na pomiary w zakresie +/– 1000 uT z rozdzielczością 0,1 uT oraz poziomem szumów 0,25 uT. Oba układy pracują z napięciami w zakresie od 1,95 do 3,6 V.

Podobne czujniki są produkowane przez firmy Asahi Kasei (AKM), Kionix, STMicroelectronics i inne. Najlepszą strategią jest odwiedzenia stron internetowych producentów i porównanie modeli oferowanych jako pojedyncze próbki lub małych opakowaniach do 5 sztuk. Przy odrobinie szczęścia można w ten sposób zdobyć akcelerometr i magnetometr za darmo. Wraz z kilkoma kondensatorami odsprzęgającymi i rezystorami podciągającymi, całkowity koszt elementów powinien zamknąć się w kwocie 5 dolarów.

Każdy z czytelników ma ulubiony mikrokontroler, którego użyje do odczytania danych z obu czujników i realizacji kompasu. W tym artykule przyjąłem założenie, że mikrokontroler ma interfejs I2C do podłączenia czujników, obsługuje operacje zmiennoprzecinkowe (sprzętowo lub poprzez emulację) i jest w stanie pomieścić 15 linii kodu zamieszczonych w listingu 1.

 

Listing 1.

/* zmienne globalne */

float Psi, The, Phi; /* odchylenie, pochylenie, przechylenie w stopniach */
float Vx, Vy, Vz; /* współczynniki kalibracji */
/* funkcja kopasu z kompensacją wychylenia */
void eCompass (float Bx, float By, float Bz, float Gx, float Gy, float Gz)
{
	float sinAngle, cosAngle; /* sinus, cosinus */
	float fBfx, fBfy, fBfz; /* skalibrowana wartość pola w uT po kompensacji */
	/* odejmij wpływ magnetyków ciężkich (równanie 9) */
	Bx -= Vx;
	By -= Vy;
	Bz -= Vz;
	
	/* oblicz kąt przechylenia Phi (-180, 180) i sin, cos */
	Phi = atan2(Gy, Gz) * RadToDeg; /* Equation 2 */
	sinAngle = sin(Phi * DegToRad); /* sin(Phi) */
	cosAngle = cos(Phi * DegToRad); /* cos(Phi) */
	
	/* obróć wynik o kąt przechylenia Phi */
	Bfy = By * cosAngle - Bz * sinAngle; /* składowa y wzoru 5 */
	Bz = By * sinAngle + Bz * cosAngle; /* Bz=(By-Vy).sin(Phi)+(Bz-Vz).cos(Phi) */
	Gz = Gy * sinAngle + Gz * cosAngle; /* Gz=Gy.sin(Phi)+Gz.cos(Phi) */
	
	/* oblicz kąt pochylenia Theta (-90, 90 i sin, cos*/
	The = atan(-Gx / Gz) * RadToDeg; /* wzór 3 */
	sinAngle = sin(The * DegToRad); /* sin(Theta) */
	cosAngle = cos(The * DegToRad); /* cos(Theta) */
	
	/* obróć wynik o kąt pochylenia Theta */
	Bfx = Bx * cosAngle + Bz * sinAngle; /* składowa x wzoru 5  */
	Bfz = -Bx * sinAngle + Bz * cosAngle; /* składowa z wzoru 5  */
	
	/* oblicz odchylenie - kierunek pokazywany przez kompas psi (-180, 180) */
	Psi = atan2(-Bfy, Bfx) * RadToDeg; /* wzór 7 */
	
	return;
}

Schemat elektryczny

Następnym krokiem po wyborze czujników jest zaprojektowanie płytki zawierającej akcelerometr i magnetometr połączonych magistralą I2C z mikokontrolerem. Na rysunku 1 pokazano referencyjny układ dla sensorów MMA8451Q oraz MAG3110.

 

Rys. 1. Schematy połączeń czujników MMA8451Q (a) oraz MAG3110 (b)

 

Nie ma sensu obracać akcelerometru ani magnetometru tak, aby dopasować ich orientację w osiach x, y i z – to zostanie rozwiązane w programie. Należy się jednak upewnić, że płytka z czujnikami nie zostanie umieszczona w bezpośrednim sąsiedztwie materiałów ferromagnetycznych, ponieważ wytwarzają one stałe pole magnetyczne. Najczęściej spotykane rodzaje materiałów ferromagnetycznych to żelazo, stal, ferryt, nikiel i kobalt. Materiały nieferromagnetyczne są w pełni bezpieczne, a należą do nich: aluminium, miedź, mosiądz, cyna, srebro i złoto.

Proces kalibracji opisany dalej pozwala oszacować wartość pola magnetycznego wprowadzanego przez ferromagnetyki i skompensować je w programie, jednak lepiej jest zmniejszyć wpływ interferencji materiałów na etapie projektowania. Należy też pamiętać, że przewód, przez który płynie prąd, wytwarza cylindryczne pole magnetyczne, które słabnie odwrotnie proporcjonalnie do odległości – zatem magnetometr powinien znaleźć się jak najdalej od ścieżek silnego prądu. Prąd o natężeniu 0,1 A w odległości 10 mm wytwarza pole magnetyczne o sile 2 uT, czyli czterokrotnie więcej, niż dopuszczalny błąd 0,5 uT. Wartość 0,5 uT jest osiągana dopiero w odległości 40 mm. Bardziej szczegółowe wskazówki dotyczące rozmieszczenia elementów znajdują się w nocie Freescale Semiconductor AN4247 „Layout Recommendations for PCB Using a Magnetometer Sensors”.

W nowoczesnych akcelerometrach do produktów użytkowych można znaleźć liczne dodatkowe funkcje, takie jak detekcja spadku swobodnego, filtracja dolno- i górnoprzepustowa czy rozpoznawanie orientacji. Wszystkie je należy wyłączyć, interesują nas wyłącznie surowe dane z akcelerometru i magnetometru. Skonfiguruj zakres akcelerometru na +/– 2g i upewnij się, że można odczytać danej z czujników w postaci binarnej z wewnętrznych rejestrów czujnika z częstotliwością około 10-50 Hz. Wyższa częstotliwość nie jest potrzebna. Sprawdź sposób przeliczania między wartością binarną a wartością przyspieszenia (w MMA8451Q 4096 jednostek odpowiada zakresie +- 2g) i wyskaluj odczyty wyświetlane przez akcelerometr tak, aby podawał wartości w g. W podobny sposób należy wyskalować osie x, y i z magnetometru – w przypadku układu MAG3110 10 jednostek odpowiada 1 uT.

 

Układ współrzędnych

Wzory i program zawarty w listingu 1 używają lotniczego układy współrzędnych, w którym osie są skierowane następująco: x – północ, y – wschód, z – do dołu. Został on przedstawiony na obrazku 1. W ten sposób początkowa pozycja kompasu jest zdefiniowana w ten sposób, że oś x wskazuje północ, oś y – wschód, a oś z jest skierowana pionowo w dół. Przechylenie (roll, ?), pochylenie (pitch, ?) oraz odchylenie (yaw, ?) są zdefiniowane jako obrót zgodnie z ruchem wskazówek zegara odpowiednio wzdłuż osi x, y oraz z. Na fotografii 2 widać również wektor grawitacji ziemskiej o wartości 1 g (lub 9,81 m/s2) oraz wektor ziemskiego pola magnetycznego, który na półkuli północnej jest skierowany w dół i odchylony względem wektora grawitacji o kąt ?. Wektor można przedstawić jako dwie składowe – poziomą B0cos? oraz pionową B0sin?. W zależności od obrotu obudowy kompasu, oś x powinna być skierowana zgodnie ze zwrotem kompasu, oś y – w prawo, a oś z – w dół w prawoskrętnym układzie współrzędnych.

 

Fot. 2. Układ współrzędnych używany w lotnictwie

Fot. 2. Układ współrzędnych używany w lotnictwie

 

Autor: Mark Pedley