Moduł Pimoroni MSA301 3DoF Motion Sensor z 3-osiowym akcelerometrem
Pimoroni to brytyjska firma elektroniczna zajmująca się sprzedażą komponentów oraz płytek rozwojowych, w tym Raspberry Pi, Arduino, micro:bit oraz wielu innych. Projektuje i produkuje także własne moduły elektroniczne oraz zestawy ewaluacyjne, takie jak najnowsza płytka Pico LiPo z mikrokontrolerem RP2040 oraz możliwością zasilania z akumulatora. Pimoroni wyrobiło sobie znaczną renomę na terenie Wielkiej Brytanii, o czym świadczy fakt, że jest to jeden z oficjalnych dystrybutorów Raspberry Pi w ojczyźnie tego komputera.
Od jakiegoś czasu moduły rozszerzeniowe tej firmy są dostępne również w Polsce. Sklep internetowy Kamami.pl nawiązał współpracę z brytyjską firmą, czego efektem jest wprowadzenie do oferty szerokiego zakresu interesujących płytek rozszerzeniowych. Są wśród nich m.in. matrycowe wyświetlacze LED, kamery termiczne, enkodery, wzmacniacz termopar, a także rozmaite czujniki. Większość tego typu modułów komunikuje się za pomocą standardowych magistral I2C czy SPI. Bez problemu można je więc wykorzystać w projektach opartych o Arduino, Raspberry Pi, STM32 Nucleo czy podobnych platformach.
Moduł Pimoroni z 3-osiowym akcelerometrem MSA301
Jednym z takich modułów jest MSA301 3DoF Motion Sensor Breakout z akcelerometrem MSA301 produkowanym przez Memsensing Microsystems. Sensor oferuje przełączalny zakres pomiarowy ±2g/±4g/±8g/±16g. Oferuje opcję pomiarów ciągłych z częstotliwością od 1 do 500 Hz. Rozdzielczość pomiaru wynosi do 14 bitów. Komunikuje się za pomocą interfejsu I2C, a także oferuje jedno wyjście przerwań.
Rys. 1. Moduł Pimoroni MSA301 3DoF Motion Sensor Breakout
Sam moduł można zasilać napięciem z zakresu od 2 V do 5 V. Zawiera także zabezpieczenie przed odwrotną polaryzacją zasilania. Adres urządzenia na magistrali I2C to 0x26. Płytka ma wymiary 19 x 19 x 3 mm.
Do modułu dołączono dwa złącza szpilkowe: męskie proste 1×5 oraz żeńskie kątowe 1×5. Oba można przylutować do otworów na płytce i w ten sposób wyprowadzić porty czujnika np. na płytkę stykową.
Połączenie z płytką Arduino
W dalszej części artykułu zaprezentuję prosty przykład działania czujnika MSA301 na platformie Arduino. Jako moduł bazowy wykorzystam Cytron Maker Uno w pełni zgodny z Arduino Uno. Aby skomunikować oba komponenty należy połączyć ze sobą odpowiednie wyprowadzenia magistrali I2C oraz dołączyć zasilanie do modułu z czujnikiem. We względu na szeroki zakres napięć można wybrać jedno z dwóch napięć dostępnych na płytce Arduino, 3,3 V lub 5 V. Ja wybrałem napięcie 3,3 V.
Dokładny sposób połączenia zaprezentowano w poniższej tabeli oraz fotografii.
Tabela 1. Połączenie czujnika MSA301 z Arduino
MSA301 3DoF Motion Sensor Breakout | Cytron Maker Uno |
SDA | SDA |
SCL | SCL |
GND | GND |
2-5V | 3.3V |
Rys. 2. Moduł z czujnikiem MSA301 podłączony do płytki Cytron Maker Uno
Przykład działania kodu
Teraz zaprezentuję prosty przykład działania czujnika MSA301 na platformie Arduino. Program będzie cyklicznie pobierał z sensora dane o przyspieszeniu we wszystkich trzech osiach, a następnie wypisze je na porcie szeregowym.
Na początek należy skorzystać z odpowiedniej biblioteki. Pimoroni udostępnia wiele kodów przykładowych oraz bibliotek na swoim profilu w portalu github. Niestety większość z nich jest przeznaczona na platformę Raspberry Pi. W związku z tym skorzystamy z biblioteki Adafruit przeznaczonej na podobny moduł z oferty tego producenta.
Biblioteka jest dostępna na stronie https://github.com/adafruit/Adafruit_MSA301. Należy ją pobrać w formie archiwum zip. Następnie należy dodać bibliotekę do platformy za pomocą opcji w menu Dodaj Bibliotekę .ZIP. Dodatkowo należy zainstalować biblioteki Adafruit Sensor oraz Adafruit BusIO w ten sam standardowy sposób.
Na początku kodu dołączamy wszystkie niezbędne biblioteki oraz inicjujemy obiekt klasy Adafruit_MSA301.
#include <Wire.h> #include <Adafruit_MSA301.h> #include <Adafruit_Sensor.h> Adafruit_MSA301 msa;
W funkcji setup uruchamiamy port szeregowy i ustawiamy pętlę, która sprawia, że kod zacznie pracę dopiero po włączeniu konsoli szeregowej.
while (!Serial) delay(10); // Pozwala uruchomić program dopiero po otwarciu portu szeregowego
Następnie inizjalizowane jest połączenie z czujnikiem MSA301. W przypadku, gdy czujnik nie zostanie znaleziony, kod wypisze ostrzeżenie i „zawiesi się” w pętli nieskończonej. Aby ponownie wtedy uruchomić program należy zresetować płytkę.
// Inicjalizacja połączenia I2C if (! msa.begin()) { Serial.println("Failed to find MSA301 chip"); while (1) { delay(10); } } Serial.println("MSA301 Found!");
W następnej kolejności konfigurowane są ustawienia czujnika. Konfiguracja jest następująca: częstotliwość pomiarów: 15,63 Hz, tryb poboru energii: normalny, pasmo pomiaru: 15,63 Hz, zakres: ±2g, rozdzielczość: 14 bitów.
msa.setDataRate(MSA301_DATARATE_15_63_HZ); //Czestotliwosc pomiarow - 15,63 Hz msa.setPowerMode(MSA301_NORMALMODE); // Pobor energii - tryb normalny msa.setBandwidth(MSA301_BANDWIDTH_15_63_HZ); //Pasmo pomiaru 15,63 Hz msa.setRange(MSA301_RANGE_2_G); //Zakres +/- 2g msa.setResolution(MSA301_RESOLUTION_14 ); //Rozdzielczosc 14 bitow
W pętli głównej programu następuje odczyt danych i wypisanie ich na port szeregowy. Następnie tworzony jest obiekt danych Sensor, który umożliwia normalizację danych. Natomiast w ostatnim kroku te dane są wypisywane ponownie, tym razem skonwertowane do jednostki m/s2.
void loop() { msa.read(); //odczyt danych Serial.print("X: "); Serial.print(msa.x); // Wypisanie danych Serial.print(" \tY: "); Serial.print(msa.y); Serial.print(" \tZ: "); Serial.print(msa.z); delay(100); /*Stworzenie obiektu danych w celu wykorzystania normalizacji z klasy Sensor*/ sensors_event_t event; msa.getEvent(&event); /* Wypisanie danych znormalizowanych do jednostki m/s^2) */ Serial.print("\t\tX: "); Serial.print(event.acceleration.x); Serial.print(" \tY: "); Serial.print(event.acceleration.y); Serial.print(" \tZ: "); Serial.print(event.acceleration.z); Serial.println(" m/s^2 "); Serial.println(); delay(300); }
Pełen kod jest dostępny w sekcji „Do pobrania”. Efekt działania kodu zaprezentowano na poniższym zrzucie ekranu.
Rys. 3. Efekt działania kodu do obsługi czujnika MSA301 na Arduino
Moduł MSA301 3DoF Motion Sensor Breakout, a także inne moduły produkcji Pimoroni znajdziesz w ofercie sklepu Kamami.pl