Obsługa akcelerometru i śledzenie pozycji wahadła - Arduino + Python

(opracował: dr hab. inż. Adrian Bekasiewicz, prof. PG)

Cel:

Celem laboratorium jest praktyczne wykorzystanie czujnika MPU6050 [1] – akcelerometry/żyroskopu zainstalowanego na wahadle podłączonym do zdalnego zestawu laboratoryjnego. Laboratorium jest podzielone na dwa główne moduły dotyczące: (i) implementacji obsługi układu MPU6050 w środowisku Arduino oraz (ii) opracowaniu w języku Python funkcji pozwalających na odebranie sygnałów z sensora oraz wyświetlenie jego pozycji z wykorzystaniem graficznej aplikacji.

Zasady realizacji zadań:

Laboratorium zostało podzielone na cztery ćwiczenia o stopniowo rosnącym poziomie złożoności. Do zaliczenia laboratorium należy zrealizować przynajmniej dwa pierwsze ćwiczenia. Kolejność wykonywania zadań jest sekwencyjna – rozwiązanie danego ćwiczenia stanowi punkt początkowy do wykonania kolejnego. Schemat połączeń niezbędny do realizacji zadania przedstawiono na Rys. 1.

Zadania do realizacji:

  1. Zaimportować bibliotekę obsługującą sensor MPU6050 oraz przeprowadzić kalibrację urządzenia [2]. Wykorzystać informacje wyświetlone w monitorze portu szeregowego do ustalenia offsetów dla osi X, Y, oraz Z akcelerometru [3].

  2. Napisać program, który będzie wyliczał kąt wychylenia wahadła na podstawie przyspieszenia względem odpowiednich osi. Wyświetlać kąt przez port szeregowy tak aby można było obserwować jego zmiany wraz ze zmianą położenia wahadła.

  3. Zmodyfikować program w języku Python poprzez stworzenie funkcji, które będą realizowały następujące funkcjonalności: (i) odbieranie informacji o kącie wychylenia wahadła przez port szeregowy, oraz (ii) konwersję kąta oraz długości wahadła (stała RAD_LENGTH) na kartezjański układ współrzędnych. Wykorzystać zmodyfikowany program do śledzenia pozycji wahadła na ekranie komputera. W razie konieczności zmodyfikować zakresy zmiany kątów odczytanych z akcelerometru w taki sposób aby pozycja kwadratu odzwierciedlała pozycję wahadła.

  4. Napisać funkcję, która będzie wygładzała sygnał z czujnika w taki sposób, aby ograniczyć drgania kwadratu przy zmianie jego pozycji. Dobrać liczbę próbek do wygładzania w taki sposób aby uzyskać akceptowalny kompromis pomiędzy opóźnieniem zmiany położenia kwadratu na ekranie względem wahadła, a jego stabilnością.

Opis zadań:

Serwomechanizm jest sterowany z wykorzystaniem funkcji rotServo(). Parametrem wejściowym funkcji jest opóźnienie pomiędzy kolejnymi wychyleniami wahadła w milisekundach (domyślnie 2000). Wyjściem funkcji jest wartość binarna wskazująca aktualne wychylenie wahadła (0 w przypadku wychylenia w lewą stronę oraz 1 przy wychyleniu w prawo). Opóźnienie pomiędzy kolejnymi zmianami położenia wahadła można zmieniać w zakresie 1000-5000 ms.

Nie dopuszcza się stosowania funkcji delay() do realizacji zadań opisanych poniżej ponieważ powoduje ona wstrzymanie pracy całego mikrokontrolera. Opóźnienia należy realizować z wykorzystaniem nieblokujących funkcji opóźniających [2].

Rys. 1. Stanowisko do zdalnej realizacji laboratoriów – schemat ideowy.

  1. Obsługa układu akcelerometru/żyroskopu sprowadza się do zainicjalizowania bibliotek MPU6050.h oraz I2Cdev.h [1], stworzenia obiektu czujnika oraz jego inicjalizacji. Kalibrację należy przeprowadzić z wykorzystaniem gotowej funkcji Initialize() [2], a uzyskane wartości offsetów należy ustalić poprzez wywołanie odpowiednich metod z biblioteki MPU6050 [3].

  2. Zmianę przyspieszenia względem dwóch osi akcelerometru zaprezentowano schematycznie na Rys. 2. Informacje o przyspieszeniu można wykorzystać bezpośrednio do wyznaczenia kąta wychylenia wahadła na podstawie funkcji trygonometrycznych:

gdzie aX i aZ to przyspieszenie odpowiednio względem osi x i z. Kąty α oraz φ reprezentują nachylenie sensora względem osi z oraz nachylenie (dodatniego) wektora stanowiącego superpozycję aX i aZ (patrz Rys. 2).

  1. Realizacja zadania wymaga uzupełnienia programu LAB3_code_task3.py o funkcje pozwalające na odczyt sygnałów wysyłanych przez Arduino za pośrednictwem portu szeregowego oraz konwersję odebranych informacji do aktualizacji położenia obiektu (biały kwadrat) wyrażonych w kartezjańskim układzie współrzędnych. Obsługę portu szeregowego realizuje biblioteka serial. Do parsowania danych odebranych przez port szeregowy konieczne będzie wykorzystanie biblioreki re (wyrażenia regularne) oraz math (obsługa funkcji sin(), cos()). W przypadku braku biblioteki należy ją doinstalować w konsoli IDE dla języka python przy użyciu komendy:

Biblioteka serial jest dostępna pod nazwą pyserial.

Konwersja cylindrycznego do kartezjańskiego układu współrzędnych realizuje się przy użyciu następującej zależności:

gdzie x i y stanowią koordynaty w kartezjańskim układzie współrzędnych, a r reprezentuje odległość kątową punktu (kwadratu na ekranie) od osi z. Parametr r w programie w języku Python reprezentuje stała RAD_LENGTH.

Rys. 2. Wyznaczanie kąta nachylenia na podstawie wartości przyspieszenia odczytanych z akcelerometru.

  1. Wygładzanie danych powinno zostać zaimplementowane poprzez opracowanie funkcji wyliczającej średnią kroczącą z kątów wyznaczonych na podstawie odczytów z akcelerometru. Funkcja powinna umożliwiać wybór liczby próbek do uśrednienia odpowiedzi na podstawie ustawienia jednego parametru wejściowego.

Pliki:

  1. Szkic programu Arduino: LAB5_code_template.zip

  2. Metody dla MPU6050: I2Cdevlib_MPU6050_Class_Reference.pdf

Literatura:

  1. Akcelerometr/żyroskop MPU6050 – datasheet

  2. Kalibracja MPU6050: https://github.com/ElectronicCats/mpu6050/tree/master/examples

  3. Metody dla MPU6050: https://www.i2cdevlib.com/docs/html/class_m_p_u6050.html

  4. SG90 – datasheet

  5. ATmega328P – datasheet