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.
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ę.
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
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).
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
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.
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.
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).
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
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ówRezystory: Kondensatory: Półprzewodniki: Inne: |
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.
![]() |
![]() |
uint8_t dane[6];
i2c_read_sequence(0x6B, 0x28, dane, 6);
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
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