Czujnik inercyjny LSM9DS0 oraz jego zastosowanie praktyczne

Czujnik inercyjny LSM9DS0 oraz jego zastosowanie praktyczne
Pobierz PDF Download icon
W artykule opisano projekt modułu płytki PCB z układem czujnika inercyjnego LSM9DS0. Dzięki zastosowaniu złącza goldpin jest możliwe wielokrotne zastosowanie jednego układu IMU w wielu urządzeniach. W dalszej kolejności omówiono przykłady praktycznej komunikacji z czujnikiem inercyjnym LSM9DS0 za pomocą interfejsu I²C. Oprogramowanie wykonano w języku C dla mikrokontrolera ATmega8. Rekomendacje: tekst jest przeznaczony dla osób, które chcą w krótkim czasie rozpocząć pracę z układem IMU i zastosować go we własnych projektach.

Zaprezentowane w dalszej części artykułu kody źródłowe napisano w języku C dla mikrokontrolera ATmega8. Należy mieć na uwadze, iż pominięto niektóre funkcjonalności, dlatego zawarte tu informacje należy traktować jako wstęp i ułatwienie do dalszej analizy dokumentacji producenta. Opis jest jednak wystarczający, aby uruchomić LSM9DS0 na 8-bitowej platformie wyposażonej w interfejs I²C.

Możliwości LSM9DS0

IMU (Inertial Measurement Unit) LSM9DS0 jest inercyjnym urządzeniem pomiarowym firmy STMicroelectronics wykonanym w technologii MEMS. W jednym układzie scalonym znajdują się sensory: 3-osiowy żyroskop, 3-osiowy akcelerometr, 3-osiowy magnetometr. Taki zestaw czujników jest nazywany 9DOF (9 stopni swobody). Dodatkowo, w strukturę układu wbudowano również termometr.

Rysunek 1. Schemat ideowy płytki z sensorem LSM9DS0

Rysunek 2. Schemat montażowy płytki z sensorem LSM9DS0

Układ umożliwia pomiar sił przyspieszenia, prędkości kątowych oraz wartości pól magnetycznych w przestrzeni 3D. Wysoka, 16-bitowa rozdzielczość odczytów odzwierciedla:

  • Przyśpieszenia liniowe w zakresach ±2g, ±4g, ±6g, ±8g, ±16g.
  • Wartości indukcji pola magnetycznego w zakresach: ±2, ±4, ±8, ±12 Gs.
  • Prędkości kątowe w zakresach ±245/±500/±2000 stopni na sekundę.

Każdy z 3 czujników może zostać wprowadzony w tryb uśpienia, dzięki czemu możliwe jest wykorzystywanie tylko wybranych sensorów oraz oszczędność w poborze prądu. Duże możliwości i niewielkie wymiary umożliwiają zastosowanie w wielu projektach opartych na procesorach 8 lub 32-bitowych. Komunikacja z układem możliwa jest poprzez magistralę SPI lub I²C.

Układ jest kompatybilny z I²C o standardowej szybkości linii danych 100 kHz, jak również 400 kHz w trybie szybkim. Wyposażony jest w konfigurowalne generatory przerwań na określonych pinach, które umożliwiają programowe wykrywanie ruchu lub reakcje na zmianę położenia w przestrzeni 3D. Układ zasilany jest napięciem od 2,4 V do 3,6 V.

Konfiguracja sprzętowa modułu LSM9DS0

Na rysunku 1 zamieszczono schemat płytki drukowanej z układem LSM9DS0. Projekt uwzględnia zalecenia producenta dotyczące filtrowania zasilania, a także przewiduje łatwą zmianę parametrów użytkowych. Płytkę wyposażono w dwie zworki lutownicze (J1, J2) sterujące doprowadzeniami CS_G i CS_XM oraz SDO_G i SDO_XM.

Pierwsza para umożliwia wybór interfejsu komunikacyjnego dla G oraz XM zgodnie z tabelą 1. Druga para spełnia dwa zadania - umożliwia ustawienie adresu lub wyprowadzenie danych za pomocą odpowiedniego interfejsu komunikacyjnego (tabela 2).

Zmiana poziomów na wyprowadzeniach jest wykonywana poprzez rozwarcie lub zwarcie za pomocą zworek ścieżek łączących rezystory R3...R6 z linią Vcc. Domyślnie układ został przygotowany do pracy poprzez magistralę I²C z adresami 0x6B (G) i 0x1D (XM).

Na schemacie ideowym można zauważyć rozmieszczenie wyprowadzeń płytki drukowanej. Ich funkcje opisano w tabeli 3.

Schemat montażowy pokazano na rysunku 2. Sensor zamontowano na płytce dwustronnej, a wszystkie komponenty umieszczono na warstwie górnej. W pierwszej kolejności należy zamontować układ IMU (LSM9DS0), którego polaryzacja musi być zgodna z nadrukowanym schematem wektorów pomiarowych.

W następnej kolejności należy zamontować elementy pasywne: kondensatory i rezystory. Przed montażem listwy goldpin należy zwrócić uwagę na umiejscowienie układu w docelowym projekcie, gdyż zmiana orientacji IMU, pomimo iż ta jest dowolna, niesie za sobą określone konsekwencje, jeśli chodzi o interpretację wyników pomiarów.

Niestety, montaż układu LSM9DS0 na PCB metodą "domową" jest bardzo trudny ze względu na małe i trudno dostępne pady. Z tego powodu może sprawić znaczne trudności osobom niemającym wprawy w montażu układów elektronicznych.

Komunikacja I²C

Komunikacja za pomocą I²C jest dwukierunkowa i przebiega w konfiguracji master - slave. Możliwe są 4 tryby komunikacji: wysłanie bajtu do układu slave, wysłanie wielu bajtów do układów slave, odczyt bajtu z układu slave, odczyt wielu bajtów z układów slave. Inicjalizacja połączenia jest wykonywana po stronie układu master, którym z reguły jest mikrokontroler. Dla uproszczenia kodu przyjęto definicje pokazane na listingu 1.

Zmienną I2C_ILOOP utworzono w celu zabezpieczenia przez zawieszaniem się programu w wypadku wystąpienia problemu w trakcie komunikacji.

Inicjalizacja interfejsu TWI (I²C) mikrokontrolera ATmega8 sprowadza się do określenia częstotliwości pracy zgodnie ze wzorem znajdującym się w dokumentacji. Zależnie od trybów pracy interfejsów układów dołączonych do I²C, maksymalna częstotliwość przebiegu zegarowego może wynosić 100 kHz lub 400 kHz, co odpowiada prędkości transmisji 100 kb/s lub 400 kb/s.

Oczywiście, trzeba przy tym uwzględnić częstotliwość taktowania mikrokontrolera. W wypadku taktowania za pomocą przebiegu o częstotliwości 8 MHz do rejestru TWBR należy zapisać liczbę dziesiętną 8 (listing 2). Odpowiednie dobranie częstotliwości zmniejsza prawdopodobieństwo wystąpienia błędów w transmisji danych.

Na listingu 3 pokazano funkcję służącą do inicjalizacji interfejsu TWI. Status TWI zwracany jest w rejestrze TWSR w bitach o numerach 7...3, dlatego pozostałe 3 bity (2...0) zostały zamaskowane liczbą 0xF8 (0b11111000). Kody statusów TWI są szczegółowo opisane w dokumentacji CPU. Działanie funkcji przesyłającej 1 bajt danych (listing 4) polega na zapisaniu bajtu w rejestrze TWDR, a następnie włączeniu interfejsu sprzętowego.

Przy odczycie danych wyróżnia się 2 tryby: z potwierdzeniem (ACK) lub bez potwierdzenia (NACK). Sterowanie opcją ACK w interfejsie sprzętowym TWI zaimplementowanym przez Atmel odbywa się za pomocą bit TWEA. Jeśli bit jest ustawiony 1, wówczas zostanie wygenerowany sygnał ACK. Odczyt danych z opcjami ACK oraz NACK pokazano na listingu 5.

Transmisję danych kończy wysłanie sygnału Stop, który zwalnia linie transmisyjne i umożliwia przesyłanie danych przez inne urządzenia dołączone do I²C lub nawiązanie nowego połączenia. Funkcję wysyłającą sekwencję Stop pokazano na listingu 6.

Kolejne funkcje służące do transmisji danych wykonano na podstawie dokumentacji układu LSM9DS0 oraz ATmega8. Pokazano jest na listingu 7. Odczyt rozpoczyna się od wysłania na poprzez interfejs TWI (I²C) adresu urządzenia slave (sla) wraz z ustawioną flagą Write. Po tej operacji układ slave oczekuje na otrzymanie od master kolejnego bajtu, tym razem z adresem komórki pamięci do odczytu (adr).

Następnie, jest wykonywane odwrócenie kierunku komunikacji poprzez wykonanie rozkazu Repeated Start oraz ponownie przesłanie poprzez TWI adresu układu slave, lecz tym razem z ustawioną flagą Read. Należy zwrócić uwagę na to, że na każdym etapie komunikacji następuje weryfikacja kodów kontrolnych opisanych w dokumentacji mikrokontrolera.

W przypadku wystąpienia błędu na dowolnym etapie wymiany danych odczyt jest dyskwalifikowany, a funkcja zwraca wartość 0. Operacja zapisu bajtu do urządzenia slave jest analogiczna do powyższej, lecz tym razem nie ma konieczności zmiany kierunku komunikacji.

Dzięki ustawieniu siódmego bitu w chwili przekazywania adresu (adr) zostaje uruchomiona automatyczna inkrementacja adresów do odczytu. Za pomocą tego mechanizmu jest możliwe odczytywanie wielu następujących po sobie rejestrów, dopóki potwierdzenie ACK jest włączone. Nie ma wówczas konieczności przesyłania adresów w kolejnych odczytach (listing 8).

Dla ułatwienia analizy, na listingu 9 umieszczono deklaracje nagłówków opisywanych funkcji.

Adresowanie LSM9DS0

Każde urządzenie typu slave dołączone do I²C musi mieć unikalny adres. Układ LSM9DS0 funkcjonalnie podzielono na dwa urządzenia. Pierwsze z nich udostępnia dane z żyroskopu i oznaczono G. Drugie - oznaczone XM - dostarcza dane z akcelerometru oraz magnetometru. Producent przewidział możliwość zmiany domyślnych adresów. Można to zrobić za pomocą odpowiednich poziomów na wejściach SDO_G i SDO_XM. W tabeli 4 podano adresy interfejsów sensorów wbudowanych w strukturę LSM9DS0.

Konfigurowanie LSM9DS0

Rysunek 3. Rejestr kontrolny akcelerometru CTRL_REG1_G

Konfigurowanie układu sensora jest wykonywane poprzez zapisanie rejestrów konfiguracyjnych. Zostały one podzielone na część odpowiedzialną za funkcjonowanie żyroskopu (G) oraz część zawierającą nastawy akcelerometru i magnetometru (XM). Sposób konfigurowania układu żyroskopu zademonstrowano na przykładzie rejestru żyroskopu CTRL_REG1_G.

Zawartość rejestru CTRL_REG1_G pokazano na rysunku 3.

Możliwe kombinacje bitów DR1..BW0 wymienione zostały w kolejnej tabeli w dokumentacji. Zgodnie z tymi informacjami, aby włączyć żyroskop i ustawić jego częstotliwość pracy należy zapisać do rejestru CTRL_REG1_G przykładową wartość: 0b10111111 (0xBF), co oznacza:

Wykorzystując wcześniej opisane funkcje, konfigurowanie sensora G sprowadza się do zapisania liczby 0xBF do rejestru CTRL_REG1_G w urządzeniu G:

i2c_write_byte(0x6B, 0x20, 0xBF);

Liczba 0x6B jest adresem slave sensora G (pin SDO_G jest ustawiony), natomiast 0x20 to adres rejestru CTRL_REG1_G.

Wykaz elementów

Rezystory:
R1...R6: 10 kΩ (SMD 0805)

Kondensatory:
C1: 4,7 µF (SMD 0805)
C2: 220 nF (SMD 0805)
C3: 10 µF/16 V (SMD "B")
C4: 100 nF (SMD 0805)

Półprzewodniki:
IMU: LSM9DS0

Inne:
JP1...JP3: listwa goldpin (11 wypr.)

Odczytywanie danych z LSM9DS0

Dane z sensorów udostępniane są do odczytu z pamięci wewnętrznej IMU w 3 grupach. Każda grupa składa się z sześciu 8-bitowych rejestrów, które zawierają dane dla osi X, Y i Z w parach komplementarnych. Przykładowo, mierzone prędkości kątowe z żyroskopu udostępniane są w 6 następujących po sobie komórkach pamięci o adresach:

Dla osi X: 28h, 29h.
Dla osi Y: 2Ah, 2Bh.
Dla osi Z: 2Ch, 2Dh.

Do odczytania wskazań danej osi konieczne jest pobranie obu komplementarnych komórek. Przykładowy odczyt pomiarów prędkości kątowych z żyroskopu polega na odczycie sześciu następujących po sobie rejestrów poprzez wywołanie funkcji odczytu sekwencyjnego:

uint8_t dane[6];
i2c_read_sequence(0x6B, 0x28, dane, 6);

Liczba 0x28 jest adresem rejestru OUT_X_L_G - pierwszego z serii rejestrów zawierających dane X, Y oraz Z. Dane zostają zwrócone w formie 8-bitowych liczb w tabeli dane[]. Finalne 16-bitowe odczyty otrzymywane są po przekształceniu komplementarnych par za pomocą operacji bitowych:

int16_t GX = (dane[1]<<8) | dane[0];
int16_t GY = (dane[3]<<8) | dane[2];
int16_t GZ = (dane[5]<<8) | dane[4];

Należy pamiętać, iż zwracane wartości są typu całkowitego ze znakiem. Dla uzupełnienia przykładu w tabeli 5 zamieszczono opis rejestrów konfiguracyjnych G, natomiast w tabeli 6 rejestrów konfiguracyjnych rejestru XM.

Kolejkowanie FIFO

Układ LSM9DS0 umożliwia odczytywanie danych z buforów kolejkowych FIFO o pojemności 32 wyników pomiarów (slotów) z żyroskopu i akcelerometru dla osi X, Y i Z. Bufory mogą działać w 5 różnych trybach.

FIFO Bypass. W tym trybie bufor przechowuje tylko dane tylko z ostatniego odczytu z sensorów, które są bezpowrotnie tracone w chwili nadpisania przez kolejne odczyty.

FIFO. Dane sensorów X, Y i Z zapisywane są w kolejnych komórkach kolejki do chwili, gdy wszystkie 32 sloty zostaną wykorzystane. Wówczas następuje zatrzymanie odczytów do czasu przywrócenia trybu Bypass.

Stream. W tym trybie dane zapisywane są w kolejce, dopóki wszystkie 32 sloty zostaną zapełnione. Gdy to się stanie następuje nadpisywanie najstarszych danych przez nowe odczyty.

Stream-to-FIFO. Dane kolekcjonowane są w trybie Stream do czasu wystąpienia zdarzenia zdefiniowanego w rejestrze INT1_CFG_G.

Bypass-to-Stream. Ten tryb zakłada przejście ze stanu Bypass do Stream po zajściu zdarzenia kontrolowanego poprzez rejestr INT1_CFG_G.

Podsumowanie

Mam nadzieję, że podane informacje oraz projekt modułu ułatwią jego samodzielne wykorzystanie. Wkrótce w miesięczniku EP opublikuję praktyczny przykład zastosowania układu LSM9DS0 do zdalnego sterowania kamerą.

Arkadiusz Witczak

Artykuł ukazał się w
Luty 2015
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
Zobacz też