logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kompas-magnetometr na I2C dla Raspberry Pi

ghost666 30 Lip 2015 13:57 6396 2
  • Kompas-magnetometr na I2C dla Raspberry Pi
    Poniższy artykuł opisuje w jaki sposób podłączyć, skalibrować i oprogramować w Pythonie sensor HMC5883L na Raspberry Pi. Jest to trójosiowy kompas-magnetometr, czyli układ pozwalający na nawigację w trzech wymiarach dzięki pomiarowi ziemskiego pola magnetycznego. Poniżej znajduje się zdjęcie przykładowego modułu z tym sensorem.

    Kompas-magnetometr na I2C dla Raspberry Pi


    Schemat podłączenia modułu z sensorem do płytki z Raspberry Pi opisany jest w poniższej tabeli.

    Numer wyprowadzenia na RPiNazwa pinu w RPiNazwa pinu w module HMC5883L
    13V3VCC
    6MasaGND
    3SDASDA
    6SCLSCL


    Aby uruchomić moduł, w pierwszej kolejności upewnić się trzeba, czy interfejs I²C w RPi jest włączony. Opis w jaki sposób włączyć interfejs poprzez raspi-config znajduje się tutaj. Po włączeniu interfejsu i ponownym uruchomieniu RPi sprawdzić możemy obecność sensora pod adresem 1e poprzez komendę:

    i2detect -y <port>


    Powinna ona zwrócić wartość 1e w komórce 10/e.

    Kompas-magnetometr na I2C dla Raspberry Pi


    Kalibracja modułu

    Poniżej znajduje się prosty skrypt napisany w Pythonie, który pozwala na obliczenie i prezentację namiaru jaki podaje nam oś magnetometru w danym momencie:

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Po uruchomieniu skryptu w terminalu powinniśmy zobaczyć coś takiego:

        Bearing:  70.0168934781


    Kalibracja kompasu

    Pierwszy krok za nami, ale przed nami jeszcze trochę pracy. Gdy obrócimy nasz układ, możemy zauważyć, że wartości odczytywane podczas obrotu nie do końca są takie, jak wydawać by się mogło, że być powinny. Ustawmy układ w miejscu gdzie pokazuje 0 i wykonujmy nim obroty o 90° aż do pełnego obrotu. Otrzymamy mniej więcej takie odczyty po każdym z ćwierć-obrotów:

        Bearing:  0.292322869229
        Bearing:  89.4543424066
        Bearing:  175.645778937
        Bearing:  266.66908262
        Bearing:  0.298412819995


    Dlaczego tak się dzieje? Widać jasno, że coś jest lekko nie tak. Zmieńmy nasz skrypt, zastępując linie 35-43 poniższym kodem:

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Następnie uruchommy skrypt z zapisem bezpośrednio do pliku. Podczas pracy skryptu obróćmy powoli w jednej osi kompas wprzód i w tył o jeden cały obrót. Trzeba koniecznie trzymać moduł płasko, tak aby obracać w jednej osi, inaczej można otrzymać dziwne rezultaty.

    Aby zapisać wyniki do pliku należy uruchomić skrypt w następujący sposób:

        sudo ./compass-test.py > compass-plot.dat


    Otrzymane dane można wyrysować, wykorzystując do tego chociażby gnuplota. Konfigutujemy go następująco:

        set terminal wxt persist size 800,800 background '#000000' 
        set style line 99 linecolor rgb "#ffffff" linetype 0 linewidth 2
        set key top right textcolor linestyle 99 
        set grid linestyle 99
        set border linestyle 99
        plot filename using 1:2 title "Raw compass values" linecolor rgb "green" 


    Zapiszmy powyższy config do pliku gnuplot-compass.plg i posłużmy się komendą:

        gnuplot -e "filename='compass-plot.dat'" gnuplot-compass.plg


    W ten sposób otrzymamy wykres, wyglądający mniej więcej tak:

    Kompas-magnetometr na I2C dla Raspberry Pi


    Otrzymane punkty leżą na okręgu, którego środek nie pokrywa się z punktem (0,0), jednakże w tym przypadku problem nie jest wielki. Dla innego pomiaru z wykorzystaniem innego modułu wykres pokazywał odchyłkę w osi Y o około 150 jednostek:

    Kompas-magnetometr na I2C dla Raspberry Pi


    Wykorzystując zebrane dane możemy wyznaczyć offsety w osiach X i Y i zastosować je do kalibracji odczytów z kompasu. Zamieńmy pętlę for w skrypcie Pythona następującym kodem:

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Po ponownym uruchomieniu skryptu i wykonaniu obrotu kompasem o 360° skrypt poda nam wartości, które musimy wykorzystać do kalibracji. W przykładzie otrzymano następujące wartości:

        minx:  -216
        miny:  -193
        maxx:  197
        maxy:  213
        x offset:  -10
        y offset:  10


    Na tym kroku już prawie skończyliśmy. Wracamy do pierwszego programu i dodajemy do niego kalibrację. Zamienić trzeba linie 35 - 37 w skrypcie na:

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Teraz możemy powtórzyć nasz pierwszy test, obracając moduł o ćwierć obrotu i dokonując pomiaru namiaru. Otrzymane wartości wyglądają teraz o wiele lepiej:

        Bearing:  0.278132667296
        Bearing:  90.0
        Bearing:  180.290839022
        Bearing:  272.501622814
        Bearing:  359.725859606


    Nigdy nie otrzyma się idealnych danych, z uwagi na szum pomiaru, jednakże te wartości są już bardzo bliskie prawdy.

    Biblioteka dedykowana do kompasu HMC5883L

    Zaprezentowana poniżej biblioteka ułatwia korzystanie z sensora i jest w stanie podawać namiary z wykorzystywaniem tylko kilku linijek kodu napisanego w Pythonie.

    Niektóre z funkcji biblioteki:

    * Łatwe wprowadzanie deklinacji, tak aby otrzymywać namiar względem prawdziwej północy
    * Namiar może być odczytywany w stopniach i minutach lub w klasycznej wartości numerycznej
    * Możliwy jest niezależny odczyt wszystkich trzech osi, co pozwala na stosowanie magnetometru do innych aplikacji, np. detekcji magnesów.

    Podstawowe przykłady

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Odczyt namiaru

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Przykłady odczytu wartości pojedynczych osi

    Kod: Python
    Zaloguj się, aby zobaczyć kod


    Szacowanie deklinacji magnetycznej

    Prawdziwa północ różni się od tej magnetycznej w większości rejonów świata. Różnica ta nazywa się deklinacją i wyrażana jest w stopniach i minutach. Zmienia się ona też w czasie, więc trzeba na bieżąco aktualizować dane. Aby opisywana biblioteka działała poprawnie i pokazywała północ konieczne jest wprowadzenie aktualnej deklinacji dla miejsca gdzie znajduje się układ. Deklinacje dla punktów na świecie znaleźć można tutaj.

    Instalacja bibliotek I²C

    Opis jak zainstalować opisaną bibliotekę znaleźć można tutaj.

    Funkcje

    __init__(port, addr=0x1e, gauss=1.3)

    Konstruktor tworzący instancję mającą dostęp do portu I²C (0 dla starych RPi, 1 dla nowszych).

    __str__

    Drukuje osie, deklinacje i namiar na ekranie.

    setContinuousMode()

    Ciągłe odświeżanie wartości osi.

    setScale(gauss)

    Ustawienie skali dla osi. Musi wynosić: 0,88, 1,3, 1,9, 2,5, 4,0, 4,7, 5,6 lub 8.1.

    setDeclination(degrees, minutes=0)

    Ustawia deklinację, co pozwala na kompensację i odnajdowanie prawdziwej północy.

    setOption(register, options)

    Konfiguruje opcje w podanym rejestrze.

    getDeclination()

    Zwraca deklinację w stopniach i minutach

    getDeclinationString()

    Zwraca deklinację w standardowym formacie.

    getHeading()

    Zwraca namiar w stopniach i minutach.

    getHeadingString()

    Zwraca namiar w standardowym formacie.

    getAxes()

    Zwraca wartości dla osi x, y i z.

    Źródło:
    http://www.recantha.co.uk/blog/?p=2547
    http://blog.bitify.co.uk/2013/11/connecting-and-calibrating-hmc5883l.html
    http://think-bowl.com/raspberry-pi/i2c-python-library-3-axis-digital-compass-hmc5883l-with-the-raspberry-pi/

    Fajne? Ranking DIY
    O autorze
    ghost666
    Tłumacz Redaktor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    https://twitter.com/Moonstreet_Labs
    ghost666 napisał 11960 postów o ocenie 10197, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.
  • #2 14898499
    pone13
    Poziom 2  
    Dlaczego wszystkie projekty na rpi programuje się w pythonie?
    C/C++ nie wystarcza?
  • #3 14899031
    ghost666
    Tłumacz Redaktor
    pone13 napisał:
    Dlaczego wszystkie projekty na rpi programuje się w pythonie?
    C/C++ nie wystarcza?


    Zasadniczo z tego samego względu z jakiego programuje się w C++ a nie w ASM ;). Jest prościej.
REKLAMA