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.
Schemat podłączenia modułu z sensorem do płytki z Raspberry Pi opisany jest w poniższej tabeli.
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ę:
Powinna ona zwrócić wartość 1e w komórce 10/e.
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:
Po uruchomieniu skryptu w terminalu powinniśmy zobaczyć coś takiego:
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:
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:
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:
Otrzymane dane można wyrysować, wykorzystując do tego chociażby gnuplota. Konfigutujemy go następująco:
Zapiszmy powyższy config do pliku gnuplot-compass.plg i posłużmy się komendą:
W ten sposób otrzymamy wykres, wyglądający mniej więcej tak:
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:
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:
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:
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:
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:
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
Odczyt namiaru
Przykłady odczytu wartości pojedynczych osi
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/
Schemat podłączenia modułu z sensorem do płytki z Raspberry Pi opisany jest w poniższej tabeli.
| Numer wyprowadzenia na RPi | Nazwa pinu w RPi | Nazwa pinu w module HMC5883L | 1 | 3V3 | VCC | 6 | Masa | GND | 3 | SDA | SDA | 6 | SCL | SCL |
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.
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
Po uruchomieniu skryptu w terminalu powinniśmy zobaczyć coś takiego:
Bearing: 70.0168934781Kalibracja 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.298412819995Dlaczego 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
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.datOtrzymane 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.plgW ten sposób otrzymamy wykres, wyglądający mniej więcej tak:
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:
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
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: 10Na 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
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.725859606Nigdy 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
Odczyt namiaru
Kod: Python
Przykłady odczytu wartości pojedynczych osi
Kod: Python
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
