LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

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