SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

3-osiowy magnetometr HMC5883L

HMC5883L jest cyfrowym, 3-osiowym magnetometrem pozwalającym na pomiar szerokiego zakresu wielkości pola magnetycznego Ziemi wynoszącego ±8 gausa. Jego rozdzielczość 12 bitów umożliwia pomiar z dokładnością do 2 miligausów przy poborze prądu zaledwie 100µA. HMC5883L komunikuje się z mikrokontrolerem za pomocą szyny I2C z maksymalną częstotliwością pomiarów wynoszącą 75 Hz w trybie ciągłym. 

Zakres pomiarowy Rozdzielczość Wzmocnienie
± 0.88 Ga 0.73 mG 1370
± 1.3 Ga 0.92 mG 1090
± 1.9 Ga 1.22 mG 820
± 2.5 Ga 1.52 mG 660
± 4 Ga 2.27 mG 440
± 4.7 Ga 2.56 mG 390
± 5.6 Ga 3.03 mG 330
± 8.1 Ga 4.35 mG 230

HMC5883L pozwala na osiągnięcie częstotliwości pomiarów nawet do 160 Hz, jeśli skorzystamy z trybu pojedyńczego pomiaru oraz monitorowania przerwania DRDY. Ciekawą możliwością jaką daje ten układ, to wybór ilości próbek (1, 2, 4 lub 8), które podlegają uśrednieniu końcowego wyniku.

Napięcie zasilania mieści się w zakresie od 2.0 do 3.6V, dlatego układ również nie toleruje zasilania wyższego (5V) - należy zwrócić szczególną uwagę na to, czy nasz moduł posiada możliwość zasilania takim napięciem. Układ jest zamknięty w obudowie LCC o wymiarach 3mm x 3mm i wysokości 0.91mm .

Pełna dokumentacja techniczna: https://www.jarzebski.pl/datasheets/HMC5883L.pdf

Podłączenie HMC5883L do Arduino

W przypadku moduł IMU GY-80, możemy skorzystać z 5V zasilania. Pin oznaczony SCL (adapter) podłączamy do pinu A5 (Arduino), natomiast pin SDA (adapter) do pinu A4 (Arduino).

Do obsługi modułów z układami HMC5883L skorzystamy z  przygotowanej na tą okazję biblioteki  dla Arduino, którą można pobrać z repozytorium Git: https://github.com/jarzebski/Arduino-HMC5883L

Prosty przykład

Pierwszym przykładem będzie odczyt surowych wartości oraz znormalizowanych (mg):

  1. #include <Wire.h>
  2. #include <HMC5883L.h>
  3.  
  4. HMC5883L compass;
  5.  
  6. void setup()
  7. {
  8.   Serial.begin(9600);
  9.  
  10.   // Inicjalizacja HMC5883L
  11.   Serial.println("Initialize HMC5883L");
  12.   while (!compass.begin())
  13.   {
  14.     Serial.println("Nie odnaleziono HMC5883L, sprawdz polaczenie!");
  15.     delay(500);
  16.   }
  17.  
  18.   // Ustawienie zakresu pomiarowego
  19.   // +/- 0.88 Ga: HMC5883L_RANGE_0_88GA
  20.   // +/- 1.30 Ga: HMC5883L_RANGE_1_3GA (domyslny)
  21.   // +/- 1.90 Ga: HMC5883L_RANGE_1_9GA
  22.   // +/- 2.50 Ga: HMC5883L_RANGE_2_5GA
  23.   // +/- 4.00 Ga: HMC5883L_RANGE_4GA
  24.   // +/- 4.70 Ga: HMC5883L_RANGE_4_7GA
  25.   // +/- 5.60 Ga: HMC5883L_RANGE_5_6GA
  26.   // +/- 8.10 Ga: HMC5883L_RANGE_8_1GA
  27.   compass.setRange(HMC5883L_RANGE_1_3GA);
  28.  
  29.   // Ustawienie trybu pracy
  30.   // Uspienie:              HMC5883L_IDLE
  31.   // Pojedynczy pomiar:     HMC5883L_SINGLE
  32.   // Ciagly pomiar: HMC5883L_CONTINOUS (domyslny)
  33.   compass.setMeasurementMode(HMC5883L_CONTINOUS);
  34.  
  35.   // Ustawienie czestotliwosci pomiarow
  36.   //  0.75Hz: HMC5883L_DATARATE_0_75HZ
  37.   //  1.50Hz: HMC5883L_DATARATE_1_5HZ
  38.   //  3.00Hz: HMC5883L_DATARATE_3HZ
  39.   //  7.50Hz: HMC5883L_DATARATE_7_50HZ
  40.   // 15.00Hz: HMC5883L_DATARATE_15HZ (domyslny)
  41.   // 30.00Hz: HMC5883L_DATARATE_30HZ
  42.   // 75.00Hz: HMC5883L_DATARATE_75HZ
  43.   compass.setDataRate(HMC5883L_DATARATE_15HZ);
  44.  
  45.   // Liczba usrednionych probek
  46.   // 1 probka:  HMC5883L_SAMPLES_1 (domyslny)
  47.   // 2 probki: HMC5883L_SAMPLES_2
  48.   // 4 probki: HMC5883L_SAMPLES_4
  49.   // 8 probki: HMC5883L_SAMPLES_8
  50.   compass.setSamples(HMC5883L_SAMPLES_1);
  51. }
  52.  
  53. void loop()
  54. {
  55.   // Pobranie pomiarow surowych
  56.   Vector raw = compass.readRaw();
  57.  
  58.   // Pobranie pomiarow znormalizowanych
  59.   Vector norm = compass.readNormalize();
  60.  
  61.   // Wyswielnie wynikow
  62.   Serial.print(" Xraw = ");
  63.   Serial.print(raw.XAxis);
  64.   Serial.print(" Yraw = ");
  65.   Serial.print(raw.YAxis);
  66.   Serial.print(" Zraw = ");
  67.   Serial.print(raw.ZAxis);
  68.   Serial.print(" Xnorm = ");
  69.   Serial.print(norm.XAxis);
  70.   Serial.print(" Ynorm = ");
  71.   Serial.print(norm.YAxis);
  72.   Serial.print(" ZNorm = ");
  73.   Serial.print(norm.ZAxis);
  74.   Serial.println();  
  75.  
  76.   delay(100);
  77. }

Wynik działania

HMC5883L jako kompas cyfrowy

Znajomość wartości pola magnetycznego Ziemi (wektor X i wektor Y) pozwala na określenie bieżącego kierunku południka magnetycznego, a tym samym uzyskanie cyfrowego kompasu. Kierunek południka magnetycznego można obliczyć z prostej zależności:

kierunek_pomiaru (rad) = atan( wektor_y, wektor_x );

Aby  poprawnie wyznaczyć kierunek, konieczne jest również uwzględnienie czynnika błędu - deklinacji magnetycznej. Deklinacja magnetyczna spowodowana jest zarówno położeniem bieguna magnetycznego Ziemi w innym miejscu niż biegun geograficzny oraz zróżnicowanymi warunkami magnetycznymi w miejscu pomiaru (np. poprzez występowaniem dużej ilości rud żelaza). Warto zauważyć, że deklinacja magnetyczna jest parametrem zmiennym w czasie, bowiem biegun magnetyczny Ziemi stale się przemieszcza. Wartość aktualnej deklinacji magnetycznej znajdziemy na specjalnych mapach magnetycznych, a także na mapach nawigacyjnych.

Na szczęście żyjemy w czasach Internetu i odpowiednią mapę znajdziemy pod adresem: http://magnetic-declination.com/

Deklinacja magnetyczna dla Bytomia

Jak widzimy, deklinacja magnetyczna dla mojej lokalizacji wynosi plus 4 stopnie i 26 minut (wschód). Wartość tą musimy przeliczyć na radiany:

kąt_deklinacji = (stopnie + (minuty / 60.0)) / (180 / Pi);
kąt_deklinacji = (4.0 + (26.0 / 60.0)) / (180 / Pi);

Obliczoną wartość kąta deklinacji dodajemy (wynik POSITIVE) lub odejmujemy (wynik NEGATIVE) od wartości zmierzonej z magnetometru:

kierunek = kierunek_pomiaru ± kąt_deklinacji

Jeśli nie znamy kąta deklinacji, możemy przyjąć wartość zero. W następnej kolejności musimy zadbać o to, aby otrzymany wynik kierunku bieguna magnetycznego mieścił się w zakresie 0π - 2π (chyba, że chcemy mieć kompas, który pokazuje na przykład 370° zamiast 10°).

jeśli kierunek < 0 to dodajemy do niego 2π
jeśli kierunek > 2π to odejmujemy od niego 2π

Teraz możemy zamienić już radiany na stopnie:

kierunek (deg) = kierunek (rad) * (180 / π)

Istotnym problemem (brzydką cechą) magnetometru HMC5883L jest nierównomierny pomiar pola magnetycznego w zakresie od 1° ÷ 180° oraz od 180° ÷ 360°. Dla pierwszego przedziału nasz magnetometr będzie generował przekłamane wyniki od 1° ÷ 240°, natomiast dla drugiego  od 240° ÷ 360°. Można w łatwy sposób to skorygować funkcją map() (patrz poniższy przykład programu). Do pełni szczęścia możemy jeszcze wygładzić wskazania naszego kompasu, ustawiajać jego reakcję na zmianę o 3°.

Nasz program przedstawia się więc następująco:

  1. #include <Wire.h>
  2. #include <HMC5883L.h>
  3.  
  4. HMC5883L compass;
  5.  
  6. int previousDegree;
  7.  
  8. void setup()
  9. {
  10.   Serial.begin(9600);
  11.  
  12.   // Inicjalizacja HMC5883L
  13.   Serial.println("Initialize HMC5883L");
  14.   while (!compass.begin())
  15.   {
  16.     Serial.println("Nie odnaleziono HMC5883L, sprawdz polaczenie!");
  17.     delay(500);
  18.   }
  19.  
  20.   // Ustawienie zakresu pomiarowego
  21.   compass.setRange(HMC5883L_RANGE_1_3GA);
  22.  
  23.   // Ustawienie trybu pracy
  24.   compass.setMeasurementMode(HMC5883L_CONTINOUS);
  25.  
  26.   // Ustawienie czestotliwosci pomiarow
  27.   compass.setDataRate(HMC5883L_DATARATE_15HZ);
  28.  
  29.   // Liczba usrednionych probek
  30.   compass.setSamples(HMC5883L_SAMPLES_4);
  31. }
  32.  
  33. void loop()
  34. {
  35.   // Pobranie wektorów znormalizowanych
  36.   Vector norm = compass.readNormalize();
  37.  
  38.   // Obliczenie kierunku (rad)
  39.   float heading = atan2(norm.YAxis, norm.XAxis);
  40.  
  41.   // Ustawienie kata deklinacji dla Bytomia 4'26E (positive)
  42.   // Formula: (deg + (min / 60.0)) / (180 / M_PI);
  43.   float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / M_PI);
  44.   heading += declinationAngle;
  45.  
  46.   // Korekta katow
  47.   if (heading < 0)
  48.   {
  49.     heading += 2 * PI;
  50.   }
  51.  
  52.   if (heading > 2 * PI)
  53.   {
  54.     heading -= 2 * PI;
  55.   }
  56.  
  57.   // Zamiana radianow na stopnie
  58.   float headingDegrees = heading * 180/M_PI;
  59.  
  60.   // Output
  61.   Serial.print(" Heading = ");
  62.   Serial.print(heading);
  63.   Serial.print(" Degress = ");
  64.   Serial.print(headingDegrees);
  65.   Serial.println();
  66.  
  67.   delay(100);
  68.  
  69.   delay(100);
  70. }

Wynik działania:

Program do processingu znajdziecie w archwium biblioteki.

Uwaga na koniec

Niestety kompas jest  wrażliwy na wszelkie przechylenia, fałszując kalkulację kierunku południka magnetycznego. Musi się więc znajdować na płaskiej powierzchni, aby wyniki były poprawne. Niepożądany efekt wpływu przechyleń można na szczęście wyeliminować za pomocą akcelerometru (na przykład ADXL345 lub MPU6050). Jak tego dokonać? Dowiesz się z tego artykułu - Komepnsacja przechyleń kompasów cyfrowych.

Demo

Materiały dodatkowe

Biblioteka HMC5883L: https://github.com/jarzebski/Arduino-HMC5883L
Dokumentacja techniczna: https://www.jarzebski.pl/datasheets/HMC5883L.pdf

Reklama

Komentarze Komentarze
Avatar 1
Bazyli Android 4.1 / Safari 537.36
06 March 2014 - 07:55 Warszawa

Gratuluje pięknej strony! Kiedy można spodziewać się projektu zawierajacego adxl345, l3g4200d i hmc5883l oraz filtr Kalmana?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 27.0
06 March 2014 - 18:46 Bytom

Niebawem :) Jeszcze w marcu na pewno. Dzięki za miłe słowa.

Avatar 2
Piwałek Windows 7 / Mozilla 11.0
18 March 2014 - 14:54 Brak informacji

Witam,

Jestem w miarę początkujący jeśli chodzi o arduino i processing. Próbuję przetestować czujnik HMC5883L na GY-271 i jak do tej pory wiele programów dostępnych w Internecie "wypluwa" mi dane, których jednak nie jestem w stanie poprawnie zinterpretować.

Widząc tak ładny projekt (i w końcu po Polsku!) chciałbym go uruchomić u siebie. Załadowałem Twój skech o nazwie HMC5883L_processing, a następnie program HMC5883L_processing z katalogu processing.

W podglądzie portu (u mnie COM5) widzę, że na prędkości 115200 lecą dane, np.:

-137.08:-16.56:-426.88:191.32:143.00:142
-135.24:-16.56:-427.80:191.41:143.00:142
-131.56:-14.72:-429.64:190.82:142.00:142

Niestety jednak, jak uruchamiam program Processing to pojawia mi się jedynie czarne okienko (bez żadnych błędów).

Czy mógłbym prosić o pomoc w uruchomieniu programu w Processing?

Pozdrawiam,
Paweł.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 27.0
18 March 2014 - 22:08 Bytom

Czy prędkość portu w Processing jest ustawiona taka sama jak w programie wysyłającym dane?

Avatar 1
Marcin Windows 7 / Safari 537.36
27 April 2015 - 20:29 Warszawa

Witam. Mam ten sam problem po odpaleniu programu w processing widzę tylko czarny ekran. W sketchu prędkość portu:

void setup(void)
{
Serial.begin(9600);

W Processing:

myPort = new Serial(this, Serial.list()[0], 115200);

jak przestawie na:

myPort = new Serial(this, Serial.list()[0], 9600); Jest nadal to samo. Gdy w obu przypadkach ustawie na 115200 jest tak samo czarny ekran.

Avatar 1
Aleksk Windows 7 / Safari 537.36
27 November 2016 - 14:43 Brak informacji

Change label of COM-port. [0] - is hardware COM1. [1] - any Arduino virtual COM-port.

For example for COM23

// Serial
myPort = new Serial(this, Serial.list()[1], 9600);

Avatar 1
pparsniak Windows / Safari 537.36
11 September 2014 - 19:46 Brak informacji

w przykladzie z kompasem aby uzyskac dokladniejsze "fixed degress"

nalezy przemnozyc wejsciowe wartosci przez 100 a po mapowaniu podzielic wartosc wyjsciowa przez 100 i wtedy wyjdzie "fixed degress" jako float.

if (headingDegrees >= 1 && headingDegrees < 240)
{
fixedHeadingDegrees = map(headingDegrees*100, 0, 239*100, 0, 179*100)/100.00;
} else
if (headingDegrees >= 240)
{
fixedHeadingDegrees = map(headingDegrees*100, 240*100, 360*100, 180*100, 360*100)/100.00;
}

ale ogolnie genialne bibioteki do obslugi gy-80, tylko brakuje jednej, ktora wszystkie czujniki wezmie do kupy i wyprodukuje ostateczne wartosci.
Pozdrawiam
Przemek

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 31.0
15 September 2014 - 20:03 Bytom

Wielkie dzięki za sugestię, sprawdzę w boju jak to się ma do "odczuwalnych" wyników

Avatar 1
Antoni Windows 7 / Safari 537.36
25 November 2014 - 20:38 Kraków

Czy informacje o tej niejednorodności pomiaru pola wynikają z twoich obserwacji, czy to jest oficjalne podejście? gdzieś w dokumentacji jest o tym?

Antoni

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
25 February 2015 - 21:06 Bytom

Jest pełno materiałów w sieci - poczytaj o deklinacji magnetycznej

Avatar 2
roblad Windows / Mozilla Firefox 54.0
05 July 2017 - 14:16 Brak informacji

Czesc,

potrzebuje wykozystac ten 1 nie podlaczony pin, podobno to inicjowanie przerwania , ktore chcialbym wykorzystac jako element zalaczania innego modulu i obudzenia Atmegi gdzy nastapi ruch o okreslona wielkosc z okreslona czuloscia. Ma kotos pomysl gdzie znajde biblioteke ktora obsluguje ten DRDY pin i co z nim mozna zrobic, jak przeslac do HMC5883L po I2C parametry, ktore on zapamieta a bedace pozniej podstawa do wyzwolenia DRDY. Moze jest jakas inna biblioteka, chcialem HMC5883L uzyc jak tego MPU6050 dla Detekcja ruchu i bezruchu z tematu:

http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-zyroskop-i-akcelerometr-mpu6050.html

pomoze ktois ?

Pozdr,
RL

Avatar 1
davide Windows 7 / Safari 537.36
22 February 2015 - 22:23 Brak informacji

Hi. Thanks to the article. I implemented your code in my project, also the part about the "bad feature", but the measue is not correct. If I rotate the sensor to 180°, actually I view "headingDregress = 240" and "FixedHeadingDregress = 180°, according to the map() instruction, but if I rotate the sensor to 90° fixedheadingDegress show me about 130-140°.
What is the math rule behind the non-linearity? How I can solve this problem?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
25 February 2015 - 21:09 Bytom

Try without this part

Avatar 1
Abner Windows / Safari 537.36
25 November 2015 - 21:24 Brak informacji

hola, tengo el mismo problema encontro alguna solución???

Avatar 1
Grzesiek Windows / Safari 537.36
20 March 2015 - 14:15 Gdynia

O co chodzi z tą deklinacją magnetyczną?
Dla Opola jest to 4 stopnie 29 minut. Ale dla Szczecina już ponad 5 stopni.

Więc robiąc kompas w Opolu nie będę mógł go używać w Szczecinie dopóki nie zmienię parametrów?

Trochę to, hmmm, bez sensu. To jak działa kompas cyfrowy np. w Samsungu galaxy S4? Można go używać w dowolnej części świata, ale niczego się nie modyfikuje w ustawieniach.

Proszę o jakieś wyjaśnienie tego.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
23 March 2015 - 19:00 Bytom

:) wpływ deklinacji magnetycznej nie powoduje, że kompas nagle będzie pokazywał Ci zupełnie inny kierunku w tych miastach - owszem będzie obarczony błędem, ale niewielkim. Deklinację ustawia się, jeśli chcesz bardzo dokładne wskazanie i to północy geograficznej. Kompasy bez możliwości ustawienia poprawki wskazują północ magnetyczną. Zobacz tutaj (strona 3): http://www.timex.pl/sites/default/files/product_manual/w268_EU_PL_6.pdf

Wiele programów na smartfony wspomaga się jeszcze np. GPS i/lub pobiera z sieci deklinację dla współrzędnych, jeśli nie, to zwyczajnie pokazują północ magnetyczną.

Avatar 1
Nick Windows / Safari 537.36
10 July 2015 - 03:07 Brak informacji

Hello,

Thank you for this library. It is the only one that I could get to interface with my MPU-6050 and the HMC5883L to give me a tilt compensated heading. I had troubles trying to find the compatible MPU-6050 library until I discovered it was under your GitHub account. Could you please update your raeadme.md file with instructions for future users? Also, time permitting, it would be nice to put conditions for any orientation (if pitch or roll are > 45) to map them accordingly.

Thank you again,
Nick

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
11 July 2015 - 22:36 Bytom

Thanks :) I will update readme file soon

Avatar 1
Matthijs Windows 7 / Mozilla Firefox 39.0
21 July 2015 - 21:53 Brak informacji

Hello,

Fisrt off thank you so much for this! Even though it\'s in Polish I could understand quite well.
Though I do have one problem.
It seems my tilt compensation only works when tilting it towards North, not relative to the sensor.
So when the sensor is pointing North it keeps pointing North when I tilt it towards North
When the sensor is pointing East, it only keeps point East as long as I tilt it towards North
And so on and so forth.

In the other directions it keeps deviating.

So my thought is I need to calibrate the MPU6050 somehow.

What do you think? Is this the case?
Can you help me with this?

Matt

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
23 July 2015 - 00:34 Bytom

I will try this soon, be patient :)

Avatar 1
Aleksk Windows 7 / Safari 537.36
27 November 2016 - 15:17 Brak informacji

Magnetometer must be calibrated in all three axes.
For full tilt compensation must enter the offset axis Z.
In my magnetometer ( HMC5883L) offset Z axis was -180. This shift is strongly influenced tilt compensation.

Avatar 1
Matthijs Windows 7 / Mozilla Firefox 39.0
22 July 2015 - 23:36 Brak informacji

I calibrated the MPU6050 and it\'s still doing the same thing. (read my post above)
Is this normal?

Avatar 1
ft Windows 7 / Mozilla Firefox 41.0
25 September 2015 - 17:42 Brak informacji

Mam następujący problem: obracam płytkę w prawo "heading" rośnie przykładowo od 90 do 120, potem obracam w lewo "heding" maleje z powrotem, ale po przekroczeniu "90" zaczyna znowu rosnąć. Co tu jest nie tak ?
Odzczyt z magnetometru jest przez mpu6050, czyżby moduł hmc5883l był uszkodzony ?

Avatar 1
Marek Windows / Mozilla Firefox 43.0
17 January 2016 - 17:06 Poznań

Czy przypadkiem w bibliotece HMC5883L.cpp nie ma błędu? W kodzie:
case HMC5883L_RANGE_0_88GA:
mgPerDigit = 0.073f;
break;
nie powinno być:
mgPerDigit = 0.73f;
(bez zera po przecinku)?

Avatar 1
Software error Linux Ubuntu / Mozilla Firefox 47.0
06 August 2016 - 11:23 Brak informacji

Hi Korneliuz,
Thanks for the nice repository. Realy good work.
As part of my megration with arduino to unix ( Lubuntu ) I treid your scetch for calibration the HMC5883 sensor.
I am using he GY-87 board. The teapot is working very well.
I\'am realy impressed by your compas sketch also in combination with processing.
But during compile the arduino sketch "HMC5883L_processing_MPU6050" i get the error while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
class"MPU6050 has no member named begin.
How is this error to solve?
Help is very much apreceated.
Kind regards,
Theo

Avatar 1
Software error Windows 7 / Safari 537.36
14 August 2016 - 14:04 Brak informacji

Hi Korneliusz,

As I presume you had your holiday recently.
Hopefully it was relaxing for you.
In the mean time I am very excited about your articles concerning the MPU60050 & HMC5883L.
The question asked in an earlier post I have answered myself. It has all to do with the libraries.
When you mixed up libraries that can give the mentioned error ( or better lack of skills. ) Sorry for the question.
For the rest I am delighted about your software for Arduino as well as for processing.
I,am working on a windstation wind direction and force with the help of a MPU6050.
Kind regards,
Theo

Avatar 1
angela Windows / Safari 537.36
10 December 2016 - 17:25 Brak informacji

Hi i have a problem, because the serial port said that the device is not recognized, i took medition of the clock signal so i think the device is okey, so i dont understand why it doesn\'t work

Avatar 1
Christof Mac OS X / Safari 602.1
19 January 2017 - 11:24 Brak informacji

Dear Korneliusz,

I found this fantastic site with lots of great examples and libraries. I tried the Hmc, acc sensor and GPS. All worked perfectly fine on my Uno. The more I added the more I got into trouble with RAM and ROM. therefore I changed to the Mega 2560.
Unfortunately I can\'t get the HMC and the ADXL345 to work any more.
The I2C scanner shows that the devices are there and connected well to pin 20,21 on the mega. But your libraries don\'t work on the mega. Both devices are not detected.
Any idea is highly appreciated!
In any case, thanks for sharing all this!

Cheers
Christof

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 50.0
19 January 2017 - 18:25 Bytom

I sent you an E-mail :)

Avatar 2
roblad Windows / Mozilla Firefox 54.0
06 July 2017 - 22:44 Brak informacji

Czesc,

potrzebuje wykozystac ten 1 nie podlaczony pin, podobno to inicjowanie przerwania , ktore chcialbym wykorzystac jako element zalaczania innego modulu i obudzenia Atmegi gdzy nastapi ruch o okreslona wielkosc z okreslona czuloscia. Ma kotos pomysl gdzie znajde biblioteke ktora obsluguje ten DRDY pin i co z nim mozna zrobic, jak przeslac do HMC5883L po I2C parametry, ktore on zapamieta a bedace pozniej podstawa do wyzwolenia DRDY. Moze jest jakas inna biblioteka, chcialem HMC5883L uzyc jak tego MPU6050 dla Detekcja ruchu i bezruchu z tematu:

http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-zyroskop-i-akcelerometr-mpu6050.html

pomoze ktois ?

Pozdr,
RL

Avatar 1
Kivi Windows 7 / Safari 537.36
18 July 2017 - 19:21 Gdynia

Panie Korneliuszu,
Nie uważam się za doświadczonego elektronika, ale myślałem, że z kompasem sobie poradzę. Otóż nie... Szukając w internecie różnych bibliotek i sposobów podłączania, na każdym wyskakiwały zera albo komunikat o tym abym sprawdził podłączenie... Próbowałem zarówno z arduino UNO w którym podpiąłem do A4 i A5, jak i MEGA która ma piny 20 i 21 specjalnie po to :
Mam nadzieję że moduł nie jest zepsuty a jeśli tak to czy mogę w jakikolwiek sposób się upewnić?
Z góry dziękuję i gratuluje wykonywania tak dobrej roboty ;)

Avatar 2
roblad Windows / Mozilla Firefox 54.0
08 August 2017 - 19:52 Brak informacji

Detekcja ruchu i bezruchu

czy ma ktos jakis przyklad z wyzwalaniem przerwania DRDY i budzenia arduino ze stanu uspienia.

Dzieki

Avatar 1
Ashish_T Windows / Safari 537.36
07 October 2017 - 09:10 Brak informacji

How can I use the library for raspberry Pi?

Avatar 1
wojciech_k02 Windows 7 / Safari 537.36
21 November 2017 - 21:16 Ruda Śląska

Dzień dobry Panie Korneliuszu,
Zmagam się z obsługą magnetometru na mikrokontrolerze AVR Atmega8. Wzorująć się na Pana bibliotekach udało mi się odczytać dane z czujnika oraz obliczyć kąt obrotu bez kompensacji. Natomiast nie udaje mi się obliczyć kąta obrotu z kompensacją. Kąty pitch i roll obliczam na podstawie danych z MPU6050:
roll = ((atan2(ay,az))*180/M_PI);
pitch = -(atan2(ax,sqrt(ay*ay + az*az))*180)/M_PI;
Kolejno obliczam sin i cos kąta pitch i roll, zamieniając wcześniej kąty na radiany:
sinroll = sin(roll*M_PI/180);
cosroll = cos(roll*M_PI/180);
sinpitch = sin(pitch*M_PI/180);
cospitch = cos(pitch*M_PI/180);
i na końcu obliczam kąt obrotu na podstawie Pana wzoru:
yaw = atan2(kalib.mx_off*sinroll*sinpitch + kalib.my_off*cosroll - kalib.mz_off*sinroll*cospitch,kalib.mx_off*cospitch + kalib.mz_off*sinpitch)*180/M_PI;
gdzie kalib.mx_off, kalib.my_off i kalib.mx_off są przeliczonymi wartościami na mili gausy.
Gdy czujnik znajduje się w pozycji bez przechyleń to wynik jest podobny do obliczonego bez kompensacji. Natomiast jeśli czujnik przechylę to kąt "ucieka", nie działa kompensacja. Czy byłby Pan w stanie pomóc mi w rozwiązaniu tego problemu?

Avatar 1
Heitor Windows / Safari 537.36
15 March 2018 - 00:16 Brak informacji

Nice job Mr. Jarzębski. Thank you a lot for share.

I have found a good reference to improve the magnetometer calibration in this link:
https://www.jameco.com/Jameco/Products/ProdDS/2150248.pdf

I still learning about this sensor and i have some dificulties to determine the heading at quadrant 240-360 degrees. I hope to undestand it soon.

Avatar 1
krzywy187 Windows / Safari 537.36
05 May 2018 - 16:51 Warszawa

Witam, widzę że dużo tu komentarzy osób znających się na rzeczy. Mam pytanie, używam magnetometr GY-273 HMC5883L. Bez względu jaki program wgram wartość pokazuje mi 0 albo 1. Wiem że arduino wykrywa po I2C czujnik bo pokazuje adres 0d (ale domyślnie powinno działać na 1E). Czy czujnik mógł ulec uszkodzeniu podczas lutowania goldpinów czy to jednak błąd dość powszechny ?

Avatar 1
John Sved Linux Ubuntu / Mozilla Firefox 60.0
20 June 2018 - 12:08 Brak informacji

Thanks for your work. Please view my video of a recent test in an observatory dome.

Avatar 1
reem Windows / Safari 537.36
20 March 2019 - 11:04 Brak informacji

hello,
thank you for uploading the code, but am having an error while compiling it
the error says :"class hmc5883l has no member named begin "
the error is shown in this code line "while (!compass.begin())"
thank you again