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 akcelerometr ADXL345

Zadaniem akcelerometrów jest pomiar przyśpieszeń liniowych podczas własnego ruchu. Najczęściej stosuje się je do badania części ruchomych urządzeń oraz określenia ich przeciążeń. Akcelerometry możemy obecnie znaleźć w urządzeniach takich jak: telefony komórkowe, tablety, aparaty fotograficzne, a także w modelach zdalnego sterowania RC (np.: multi-coptery).

Oprócz określenia wartości przyśpieszeń liniowych, możliwe jest wyznaczenie za ich pomocą ułożenia przestrzennego obiektu oraz wykonania określonych interakcji podczas jego poruszania się.

Jednym z popularniejszych i niedrogich układów stosowanych w takich modułach jest ADXL345 od Analog Devices. Układ ten może komunikować się mikrokontrolerem za pomocą magistrali I2C lub SPI, mierząc przyśpieszenia we wszystkich trzech osiach w zakresie nawet do ±16 g z rozdzielczością 13 bitów.

Podczas pomiaru, maksymalny pobór prądu to zaledwie 23μA, przy napięciu zasilania od 2.0 do 3.6V. Ponieważ układ 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. Na szczęście zdecydowana większość dostępnych modułów z tym układem posiada wbudowany regulator napięcia.

Układ jest zamknięty w obudowie LGA o wymiarach 5mm x 3mm i wysokości 1mm - niech Was nie zmyli ta "pchełka", ponieważ ma on (oprócz pomiaru przyśpieszeń) jeszcze kilka niespodzianek. ADXL345 posiada również wyjścia cyfrowe (INT1 i INT2) mogące sygnalizować detekcję stuknięcia, podwójnego stuknięcia (tap, double tap), aktywności lub nieaktywności oraz stanu swobodnego spadania.

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

Podłączenie ADXL345 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). W moim układzie wykorzystałem również diodę RGB ze wspólną katodą oraz trzema rezystorami 220Ω, sterowaną wyjściami cyfrowymi Arduino (2,3,4) do sygnalizacji przerwań.

Do obsługi modułów z układami ADXL345 przygotowałem również odpowiednią do nich bibliotekę dla Arduino, którą można pobrać z repozytorium Git: https://github.com/jarzebski/Arduino-ADXL345

Prosty przykład

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

  1. #include <Wire.h>
  2. #include <ADXL345.h>
  3.  
  4. ADXL345 accelerometer;
  5.  
  6. void showRange(void)
  7. {
  8.   Serial.print("Wybrany zakres pomiarowy: ");
  9.  
  10.   switch(accelerometer.getRange())
  11.   {
  12.     case ADXL345_RANGE_16G: Serial.println("+/- 16 g"); break;
  13.     case ADXL345_RANGE_8G:  Serial.println("+/- 8 g");  break;
  14.     case ADXL345_RANGE_4G:  Serial.println("+/- 4 g");  break;
  15.     case ADXL345_RANGE_2G:  Serial.println("+/- 2 g");  break;
  16.     default: Serial.println("Bledny zakres"); break;
  17.   }
  18. }
  19.  
  20. void showDataRate(void)
  21. {
  22.   Serial.print("Wybrana szybkosc transmisji: ");
  23.  
  24.   switch(accelerometer.getDataRate())
  25.   {
  26.     case ADXL345_DATARATE_3200HZ: Serial.println("3200 Hz"); break;
  27.     case ADXL345_DATARATE_1600HZ: Serial.println("1600 Hz"); break;
  28.     case ADXL345_DATARATE_800HZ:  Serial.println("800 Hz");  break;
  29.     case ADXL345_DATARATE_400HZ:  Serial.println("400 Hz");  break;
  30.     case ADXL345_DATARATE_200HZ:  Serial.println("200 Hz");  break;
  31.     case ADXL345_DATARATE_100HZ:  Serial.println("100 Hz");  break;
  32.     case ADXL345_DATARATE_50HZ:   Serial.println("50 Hz");   break;
  33.     case ADXL345_DATARATE_25HZ:   Serial.println("25 Hz");   break;
  34.     case ADXL345_DATARATE_12_5HZ: Serial.println("12.5 Hz"); break;
  35.     case ADXL345_DATARATE_6_25HZ: Serial.println("6.25 Hz"); break;
  36.     case ADXL345_DATARATE_3_13HZ: Serial.println("3.13 Hz"); break;
  37.     case ADXL345_DATARATE_1_56HZ: Serial.println("1.56 Hz"); break;
  38.     case ADXL345_DATARATE_0_78HZ: Serial.println("0.78 Hz"); break;
  39.     case ADXL345_DATARATE_0_39HZ: Serial.println("0.39 Hz"); break;
  40.     case ADXL345_DATARATE_0_20HZ: Serial.println("0.20 Hz"); break;
  41.     case ADXL345_DATARATE_0_10HZ: Serial.println("0.10 Hz"); break;
  42.     default: Serial.println("Bleda szybkosc transmisji"); break;
  43.   }
  44. }
  45.  
  46. void setup(void)
  47. {
  48.   Serial.begin(9600);
  49.  
  50.   // Inicjalizacja ADXL345
  51.   Serial.println("Inicjalizacja ADXL345");
  52.   if (!accelerometer.begin())
  53.   {
  54.     Serial.println("Nie odnaleziono ADXL345, sprawdz podlaczenie!");
  55.     delay(500);
  56.   }
  57.  
  58.   // Wybor zakresu pomiarowego
  59.   // +/-  2G: ADXL345_RANGE_2G
  60.   // +/-  4G: ADXL345_RANGE_4G
  61.   // +/-  8G: ADXL345_RANGE_8G
  62.   // +/- 16G: ADXL345_RANGE_16G
  63.   accelerometer.setRange(ADXL345_RANGE_16G);
  64.  
  65.   // Wyswietlenie aktualnych parametrow
  66.   showRange();
  67.   showDataRate();
  68. }
  69.  
  70. void loop(void)
  71. {
  72.   // Odczyt wartosci surowych
  73.   Vector raw = accelerometer.readRaw();
  74.  
  75.   // Odczyt wartosci znormalizowanych
  76.   Vector norm = accelerometer.readNormalize();
  77.  
  78.   // Wyswietlenie danych surowych
  79.   Serial.print(" Xraw = ");
  80.   Serial.print(raw.XAxis);
  81.   Serial.print(" Yraw = ");
  82.   Serial.print(raw.YAxis);
  83.   Serial.print(" Zraw: ");
  84.   Serial.print(raw.ZAxis);
  85.  
  86.   // Wyswietlenie danych znormalizowanych m/s^2
  87.   Serial.print(" Xnorm = ");
  88.   Serial.print(norm.XAxis);
  89.   Serial.print(" Ynorm = ");
  90.   Serial.print(norm.YAxis);
  91.   Serial.print(" Znorm = ");
  92.   Serial.print(norm.ZAxis);
  93.  
  94.   Serial.println();
  95.  
  96.   delay(200);
  97. }

Wynik po uruchomieniu programu:

Interpretacja wyników

W wynikach znormalizowanych otrzymujemy wartość obecnego przyśpieszenia względem wszystkich trzech osi układu. Jak widzimy, kiedy układ jest w spoczynku, na oś "Z" działa przyśpieszenie o wartości około 8.75 m/s2 . Dlaczego takie? Pamiętajmy o przyśpieszeniu grawitacyjnym (normalnym), które wynosi około 9.80665 m/s2. Nie jest to oczywiście stała wartość, ponieważ jest zmienna w zależności od miejsca na ziemi - inna jest na biegunie (9.83 m/s2), inna też na równiku (9.78 m/s2). Wartość przyśpieszenia 9.80665 m/s2określamy również mianem przeciążenia o wartości 1 g. Łatwo więc obliczyć, że ADXL345 poradzi sobie z przyśpieszeniami sięgającymi do 157 m/s2 (16 g). Błąd jak wskazuje układ to Δδ ≈ 1 m/s2 czyli około  0.1 g. Możemy taki układ skalibrować, jednak do naszych potrzeb nie będzie to konieczne.

Wyznaczenie ułożenia przestrzennego obiektu (Pitch, Roll)

Zanim przejdziemy do obliczeń, przypomnijmy sobie jak wygląda konfiguracja osi X,Y,Z układu ADXL345:

Jak widać, przechylenia odbywają się na boki wokół osi X, natomiast nachyelania do góry i w dół wokół osi Y. Zmiana kierunku odbywa się wokół osi Z. Odpowiadają temu odpowiednie kąty:

  • Φ - Roll - obrót wokół osi X
  • θ - Pitch - obrót wokół osi Y
  • Ψ - Yaw - obrót wokół osi Z

Na podstawie bezpośrednio odczytanych wartości przyśpieszeń dla poszczególnych osi, możemy obliczyć kąt Φ - Roll oraz θ - Pitch. Nie jestem wybitnym matematykiem, aby przedstawić Wam szczegółowe metody obliczenia kątów na podstawie wartości wektorów przyśpieszeń, dlatego odsyłam zainteresowanych do noty aplikacyjnej AN3461, przygotowanej przez Freescale Semiconductor. Nas interesują jedynie końcowe wzory ze strony 10 powyższej noty:

Skorzystamy z funkcji atan2() zamiast tan2(), aby ułatwić sobie kontrolę mianownika, który nie może być zerem. Dodatkowo wyeliminujemy dwuznaczności kąta w zależności od ćwiartki układu. Dla ułatwienia odczytu, otrzymany wynik w radianach przekształcimy sobie na stopnie.

W przykładzie wykorzystano również filtr dolnoprzepustowy za pomocą funkcji lowPassFilter(), która pozwoli nam na drobne wytłumienie zbyt wielkich skoków odczytu. Pełne wytłumaczenie i wyprowadzenie wzoru znajdziecie również na Wikipedii.

  1. #include <Wire.h>
  2. #include <ADXL345.h>
  3.  
  4. ADXL345 accelerometer;
  5.  
  6. void setup(void)
  7. {
  8.   Serial.begin(9600);
  9.  
  10.   // Inicjalizacja ADXL345
  11.   Serial.println("Inicjalizacja ADXL345");
  12.   if (!accelerometer.begin())
  13.   {
  14.     Serial.println("Nie odnaleziono ADXL345, sprawdz podlaczenie!");
  15.     delay(500);
  16.   }
  17.  
  18.   // Wybor zakresu pomiarowego
  19.   accelerometer.setRange(ADXL345_RANGE_16G);
  20. }
  21.  
  22. void loop(void)
  23. {
  24.   // Odczyt znormalizowanych wartosci
  25.   Vector norm = accelerometer.readNormalize();
  26.  
  27.   // Filtr dolnoprzepustowy (0.1 - 0.9)
  28.   Vector filtered = accelerometer.lowPassFilter(norm, 0.15);
  29.  
  30.   // Obliczenie Pitch &amp; Roll z danych znormalizowanych
  31.   int pitch = -(atan2(norm.XAxis, sqrt(norm.YAxis*norm.YAxis + norm.ZAxis*norm.ZAxis))*180.0)/M_PI;
  32.   int roll  = (atan2(norm.YAxis, norm.ZAxis)*180.0)/M_PI;
  33.  
  34.   // Obliczenie Pitch &amp; Roll z danych filtra dolnoprzepustowego
  35.   int fpitch = -(atan2(filtered.XAxis, sqrt(filtered.YAxis*filtered.YAxis + filtered.ZAxis*filtered.ZAxis))*180.0)/M_PI;
  36.   int froll  = (atan2(filtered.YAxis, filtered.ZAxis)*180.0)/M_PI;
  37.  
  38.   // Wyswietlenie wartosci
  39.   Serial.print(" Pitch = ");
  40.   Serial.print(pitch);
  41.   Serial.print(" Roll = ");
  42.   Serial.print(roll);
  43.  
  44.   // Wyswietlenie wartosci (z filtra)
  45.   Serial.print(" (filter)Pitch = ");
  46.   Serial.print(fpitch);
  47.   Serial.print(" (filter)Roll = ");
  48.   Serial.print(froll);
  49.   Serial.println();
  50.  
  51.   delay(200);

Wynik po uruchomieniu programu:

W repozytorium Git znajdziecie jeszcze wersję programu dla Processingu oraz program wizualizacji danych. Można za jego pomocą porównać obliczenia bez i z wykorzystaniem filtra dolnoprzepustowego

Detekcja nieaktywności, swobodnego spadania oraz stuknięcia

Jak wspomniałem wcześniej, ADXL345 ma możliwość sygnalizowania o szeregu zdarzeń za pomocą przerwań INT1 lub INT2. Możemy zatem przechwycić moment wejścia w stan aktywności, nieaktywności, swobodnego spadania oraz stuknięcia - również podwójnego. Aby to uzyskać, należy ustawić szereg parametrów, które pozwolą układowi na odpowiednią interpretację wyników, czyli wartości granicznych i czasów trwania określonych fragmentów charakterystycznych.

Stuknięcie (tap) i podwójne stuknięcie (double tap).

Aby łatwiej zrozumieć ten proces, spójrzmy na poniższy wykres:

Pierwszą wartością, która nas interesuje jest THRESH_TAP. Jest to poziom wartości przyśpieszenia, jakie musi wystąpić, aby zdarzenie zostało zakwalifikowane jako stuknięcie.

Parametr DUR określa czas trwania charakterystyki odpowiadającej przy stuknięciu. Jest to więc czas, w którym układ pomiarowy osiągnie wartość THRESH_TAP oraz nastąpi reakcja działającej siły sprężystej odbicia (dolna część). Czas ten musi być odpowiednio krótki na tyle, aby zmieścił się w nim cały proces stuknięcia.

Parametr LATENT określa natomiast czas od momentu spadku wartości przyśpieszenia poniżej wartości THRESH_TAP do momentu całkowitej stabilizacji, czyli do momentu w którym nie działa na niego żadna siła powodująca przyśpieszenie.

Ostatnim parametrem jest WINDOW, który określa czas, w którym może wystąpić kolejne stuknięcie po pełnym zakończeniu charakterystyki pierwszego. Należy pamiętać, że czas ten musi objąć pełny przebieg drugiego stuknięcia od momentu stabilizacji pierwszego.

Na podstawie tych wartości generowane jest przerwanie informujące o wykrytym zdarzeniu. Parametry te określamy funkcjami: setTapThreshold(), setTapDuration(), setDoubleTapLatency() oraz setDoubleTapWindow(). Biblioteka pozwala również określić, względem której osi ma wykrywać wystąpienie stuknięcia.

Przejście w stan aktywności i nieaktywności

Powyższy opis stanowi przypadek stuknięć, jednak analogicznymi wartościami posługujemy się w przypadku detekcji aktywności i nieaktywności układu. Do określenia czy nastąpiła aktywność, definiuemy jeden parametr THRESH_ACT - jeśli wartość przyśpieszenia przekroczy tą wartość - traktowane jest jako przejście w stan aktywności. Badanie nieaktywności odbywa się poprzez podanie dwóch parametrów: THRESH_INACT oraz TIME_INACT. Pierwszy określa poziom przyśpieszenia poniżej którego musi znaleźć się odczytana wartość, natomiast drugi defunije jak długo taki stan musi się utrzymać, aby zdarzenie zostało zakwalifikowane jako przejście w stan nieaktywności. Jak łatwo wywnioskować, nie musi być to wcale przejście w stan całkowitego spoczynku, a może być określeniem granic braku czułości układu na  działające przyśpieszenia.

Parametry te określamy za pomocą funkcji:   setActivityThreshold(), setInactivityThreshold() oraz setTimeInactivity(). Tutaj także mamy również możliwość ustawienia, które osie układu będą badane.

Swobodne spadanie

Bardzo ciekawą funkcją jest możliwość wykrycia procesu swobodnego spadania układu. Tutaj również posłużymy się dwoma parametrami: THRESH_FF oraz TIME_FF. Pierwszym z nich, jak się zapewne domyślacie, jest wartość przyśpieszenia jaka musi występować podczas swobodnego spadania, drugi natomiast określa czas, jaki minimalny czas musi upłynąć od osiągnięcia poziomu THRESH_FF, aby zakwalifikować to zdarzenie jako swobodne spadanie.

Paremetry THRESH_FF oraz TIME_FF, przekazujemy za pomocą funkcji: setFreeFallThreshold() oraz setFreeFallDuration().

Jak odczytać zdarzenia pochodzące z przerwań?

Praktycznie wystarczy ustawić, które przerwanie będzie obsługiwało nasze zdarzenia (INT1 lub INT2) oraz odczytać odpowiedni rejestr za pomocą funkcji readActivites(). Ważne jest, aby funkcja ta została wywołana po odczycie danych za pomocą funkcji readNormalize() lub readRaw(). Nie zapominajmy również o konfiguracji powyżej opisanych parametrów. W repozytorium Git znajdziecie oddzielne przykłady dla poszczególnych zdarzeń.

  1. #include <Wire.h>
  2. #include <ADXL345.h>
  3.  
  4. ADXL345 accelerometer;
  5.  
  6. int RedPin = 4;
  7. int GreenPin = 3;
  8. int BluePin = 2;
  9.  
  10. long RedTime;
  11. long GreenTime;
  12. long BlueTime;
  13. long DTTime;
  14.  
  15. void setup(void)
  16. {
  17.   Serial.begin(9600);
  18.  
  19.   pinMode(RedPin, OUTPUT);
  20.   pinMode(BluePin, OUTPUT);
  21.   pinMode(GreenPin, OUTPUT);
  22.   digitalWrite(RedPin, LOW);
  23.   digitalWrite(BluePin, LOW);
  24.   digitalWrite(GreenPin, LOW);
  25.  
  26.   // Inicjalizacja ADXL345
  27.   Serial.println("Inicjalizacja ADXL345");
  28.   if (!accelerometer.begin())
  29.   {
  30.     Serial.println("Nie odnaleziono ADXL345, sprawdz podlaczenie!");
  31.     delay(500);
  32.   }
  33.  
  34.   // Wartosci dla wykrycia swobodnego spadania
  35.   accelerometer.setFreeFallThreshold(0.35);   // 0.35 g
  36.   accelerometer.setFreeFallDuration(0.1);     // 0.10 s
  37.  
  38.   // Wartosci dla wykrycia aktywnosci i jego braku
  39.   accelerometer.setActivityThreshold(1.2);    // 1.20 g
  40.   accelerometer.setInactivityThreshold(1.2);  // 1.20 g
  41.   accelerometer.setTimeInactivity(5);         // 5.00 s
  42.  
  43.   // Badanie aktywnosci i jego braku we wszystkich osiach
  44.   accelerometer.setActivityXYZ(1);
  45.   accelerometer.setInactivityXYZ(1);
  46.  
  47.   // Badanie stukniec tylko dla osi Z
  48.   accelerometer.setTapDetectionX(0);       // Nie sprawdzamy osi X
  49.   accelerometer.setTapDetectionY(0);       // Nie sprawdzamy osi Y
  50.   accelerometer.setTapDetectionZ(1);       // Uwzgledniamy jedynie os Z
  51.  
  52.   // Wartosci dla wykrywania stukniec
  53.   accelerometer.setTapThreshold(2.5);      // 2.50 g
  54.   accelerometer.setTapDuration(0.02);      // 0.02 s
  55.   accelerometer.setDoubleTapLatency(0.10); // 0.10 s
  56.   accelerometer.setDoubleTapWindow(0.30);  // 0.30 s
  57.  
  58.   // Wybieramy przerwanie INT1
  59.   accelerometer.useInterrupt(ADXL345_INT1);
  60. }
  61.  
  62. void loop(void)
  63. {
  64.   long time = micros();
  65.  
  66.   // Gaszenie zapalonych diod po uplywie danego czasu od zapalenia
  67.   if ((time - RedTime) > 300000) digitalWrite(RedPin, LOW);
  68.   if ((time - BlueTime) > 300000) digitalWrite(BluePin, LOW);
  69.  
  70.   // Opoznienie przed odczytem (poprawia wyniki) i odczytanie pomiaru
  71.   delay(50);
  72.  
  73.   Vector norm = accelerometer.readNormalize();
  74.  
  75.   // Odczytanie aktywnosci
  76.   Activites activ = accelerometer.readActivites();
  77.  
  78.   // Jesli wykryto swobodne spdanie - mrugaj dioda
  79.   if (activ.isFreeFall)
  80.   {
  81.     for (int i = 0; i <= 4; i++)
  82.     {
  83.       digitalWrite(RedPin, HIGH);
  84.       digitalWrite(BluePin, HIGH);
  85.       delay(100);
  86.       digitalWrite(RedPin, LOW);
  87.       digitalWrite(BluePin, LOW);
  88.       delay(100);
  89.     }
  90.  
  91.     delay(200);
  92.  
  93.     return;
  94.   }
  95.  
  96.   // Jesli wykryto podwojne stykniecie zapal czerowna
  97.   if (activ.isDoubleTap)
  98.   {
  99.     digitalWrite(RedPin, HIGH);
  100.     RedTime = micros();
  101.   } else
  102.   if (activ.isTap) // Jesli pojedyncze stukniecie zapal niebieska
  103.   {
  104.     digitalWrite(BluePin, HIGH);
  105.     BlueTime = micros();
  106.   }
  107.  
  108.   // Jesli nieaktywny zapal zielona diode
  109.   if (activ.isInactivity)
  110.   {
  111.     digitalWrite(GreenPin, HIGH);
  112.     GreenTime = micros();
  113.   }
  114.  
  115.   // Jesli aktywny zgas zielona diode
  116.   if (activ.isActivity)
  117.   {
  118.     digitalWrite(GreenPin, LOW);
  119.   }
  120. }

Demo

Materiały dodatkowe

Biblioteka ADXL345: https://github.com/jarzebski/Arduino-ADXL345
Dokumentacja techniczna: https://www.jarzebski.pl/datasheets/ADXL345.pdf
Nota aplikacjyna AN3461: https://www.jarzebski.pl/datasheets/AN3461.pdf

Reklama

Komentarze Komentarze
Avatar 1
Fioulmaster Windows 7 / Safari 537.36
27 September 2014 - 16:46 Brak informacji

Hello, I would use the sketch ADXL345_free_fall but I would like information about INT1. Where do I connect INT1 on the Arduino UNO?
So when I use the sketch ADXL345_rgb, I can not have the DoubleTap and FreeFall with the values ​​by default.
Can you help me?
Do not hesitate to contact me through my email (fioulmaster@hotmail.fr).
Thank you very much and good job. ;)

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 31.0
28 September 2014 - 09:33 Bytom

Hello, here is exmaples for use INT http://arduino.cc/en/Reference/attachInterrupt

Avatar 1
Krzysztof Windows 7 / Safari 537.36
03 November 2014 - 22:10 Kraków

Mam pytanie dotyczące przeliczenia surowych wartości pomiaru na wartości realne. Z tego co wiem wzór wygląda tak: Real = Raw*(Range/2^(Resolution-1)), czyli w tym przypadku przy zakresie +/-16g i rozdzielczości 13-bit wzór wygląda tak: Real = Raw * 32/4096. Jednak wartość jaką otrzymuję nie zgadza mi się z oczekiwaną. Czy we wzorze na pewno jest 2^(Resolution-1) czy też może powinno być: 2^Resolution - wówczas wartość zgadzałaby się.
Bardzo proszę o odpowiedź.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 33.0
05 November 2014 - 01:48 Bytom

Według dokumentacji:

"Full resolution, where resolution incre ases with g range, up to 13 - bit resolution at ±16g (maintaining 4mg/LSB scale factor in all g ranges)"

Real = Raw * 0.004 * gravityFactor;

gdzie grafityFactor = 9.80665f

Może dlatego się nie zgadza. Możesz podać swój przeliczniki:

Vector readNormalize(float gravityFactor = ADXL345_GRAVITY_EARTH);

ADXL345_GRAVITY_SUN 273.95f
ADXL345_GRAVITY_EARTH 9.80665f
ADXL345_GRAVITY_MOON 1.622f
ADXL345_GRAVITY_MARS 3.69f
ADXL345_GRAVITY_NONE 1.00f

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 33.0
05 November 2014 - 01:58 Bytom

Dla rozdzielczości mniejszej niż 13 bitów, przeliczniki są różne, ale biblioteka została napisana dla pełnej rozdzielczości 13-bitowej jest 4mg/LSB

Avatar 1
Karol Mac OS X / Safari 537.36
10 January 2015 - 17:48 Warszawa

Witam, mam mały problem z odpaleniem Pana projektu z wizualizacja danych znormalizowanych(pierwszy przykład na Pana stronie). Po skompilowaniu i wgraniu programu nic praktycznie się nie dzieje. Nie wyskakuje błąd kompilacji jedynie na akcelerometrze pali się tylko czerwona dioda. Dodam, że akcelerometr korzysta z napięcia z płytki Arduino (3,3V).
Bardzo proszę o pomoc

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
11 January 2015 - 14:12 Bytom

Program do wizualizacji nie wgrywa się do Arduino, korzysta się z niego w programie Processing. Do arduino wgrywasz tylko sketch wyrzucający dane, a do Processing sketch odbierający. Zobacz tutaj: http://www.jarzebski.pl/arduino/wstep/przetwarzanie-i-wizualizacja-danych.html

Avatar 1
Karol Mac OS X / Safari 537.36
12 January 2015 - 07:34 Warszawa

Przepraszam, źle się wyraziłem. Miałem na myśli pierwszy przykład z odczytem wartości oznaczony przez Pana jako "Prosty przykład".
Czy wie Pan co może stać na przeszkodzie, ze nie chce to ruszyć? Posiadam akcelerometr cyfrowy ADXL345. Dziękuje z góry za odpowiedz

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 30.0
12 January 2015 - 08:45 Katowice

Jeśli zasilasz 3.3v to czy i2c puszczasz przez jakiś konwerter stanów logicznych 5v - 3.3v? Jeśli tak, to sprawdź jeszcze taki sketch: http://playground.arduino.cc/Main/I2cScanner

Powinien wyświetlić Ci wykryte urządzenia podłączone do i2c.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 30.0
12 January 2015 - 08:45 Katowice

Aha :) I żadne mi tu per Pan ? :) ok?

Avatar 1
bigplik Linux Ubuntu / Mozilla Firefox 34.0
31 January 2015 - 13:12 Lublin

witam Korneliusz, pisałem już na Twoim koncie YT,
korzystałem z Twojego przykładu "tap" i zrobiłem sobie prosty projekt na pojedyńcze i podwojne stuknięcia, na stole działało wszystko ok, potem chciałem przenieść na płytkę, pulutowałem i zjarałem adxl345 ;P
teraz kupiłem nowy i on nie rozpoznaje ani podwójnych stuknięc "double tap" ani tych pojedyńczych z osi x, y, z, rozpoznaje tylko pojedyńcze stuknięcia "tap", wiesz może o co tu może chodzić?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 30.0
03 February 2015 - 13:59 Katowice

Spróbuj z innymi wartościami, dokładnie jak je dobrać dowiesz się datasheet. Poglądowo na tym wykresie:


Oryginalny obraz posiada rozmiar 546x418

Avatar 1
bigplik Linux Ubuntu / Mozilla Firefox 38.0
26 May 2015 - 14:58 Brak informacji

Korneljusz, czy wiesz jak można przełożyć dane z przyśpieszenia na prędkość wzglęm ziemi?
Zastanawia się, czy można użyć adxl do pomiaru prędkości, wykurzystując odczytywanie przyśpieszeń w g.?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
26 May 2015 - 22:51 Bytom

Pewnie można, całkując wyniki w czasie :) ?

Avatar 1
bigplik Linux Ubuntu / Mozilla Firefox 38.0
29 May 2015 - 14:49 Brak informacji

czyli jako nie matematyk, nic tu nie zdziałam ;)
myślałem, że jest jakieś proste rozwiązanie - gdzieś mi się obiło czytając jakieś artykuły, wydaje mi się, że ktoś to zrobił

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
04 June 2015 - 13:32 Bytom

Ale to nie jest w sumie trudne :) Postaram się wkrótce coś o tym napisać

Avatar 1
Usman Windows / Safari 537.36
15 June 2016 - 13:14 Brak informacji

Thankyou for the wonderful share . I have learned alot from this tutorial.
I am unable to detect freefall from my ADXL345.How do i connect the int1 pin with arduino nano?
Also can i detect multiple things from one ADXL345?

Avatar 1
vdeleon Windows / Safari 537.36
19 August 2016 - 09:51 Brak informacji

i have the same issue do you fix it?? i have working to dectec fre fall with ADXK345 and the arduino UNO maybe we can share code for check sendn a email or what do you say maybe a skype

Avatar 1
vdeleon Windows / Safari 537.36
19 August 2016 - 09:49 Brak informacji

Hi :

I have download the library and use the example of free fall, the sketch not detect the fre fall with other examples it work fine.

How long it to take the distance for fre fall in adlx345 ant least 60 CM or something like this???

Avatar 1
Adam_N56 Windows / Safari 537.36
04 December 2016 - 23:23 Poznań

// Obliczenie Pitch & Roll z danych znormalizowanych
int roll = (atan2(norm.YAxis, norm.ZAxis)*180.0)/M_PI;

To niestety źle działa... W pozycji czujnika: pitch 90 stopni pomimo, że roll nie fizycznie uległ zmianie (0 stopni), to jednak zmienia się jego wartość.

to działa poprawnie:
int roll = (atan2(norm.YAxis, sqrt(norm.XAxis*norm.XAxis + norm.ZAxis*norm.ZAxis))*180.0)/M_PI;

Avatar 1
thank you Windows / Safari 537.36
25 February 2017 - 22:48 Brak informacji

thank you man, it works. if you are using esp12e

#define I2C_SCL_PIN 5 //D1
#define I2C_SDA_PIN 4 //D2

and in setup

Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);

Avatar 1
Brendon Souza Windows / Safari 537.36
15 June 2017 - 21:51 Brak informacji

Czy mógłby Pan wyjaśnić, w jaki sposób wykonane połączenie? (Arduino i akcelerometr.)
Jestem brazylijski. Przepraszam za tłumaczenie.

Avatar 1
Vaclav Waloschek Linux x86_64 / Safari 537.36
05 February 2018 - 22:55 Brak informacji

Czy można podłączyć więcej akcelerometrów do arduina ? I jak się adresują ? Nie mogę znależć takiej informacji :/

Mam taki pomysł na przerobienie starego prawdziwego pianina na midi.

Avatar 1
xorkrus Windows XP / Safari 537.36
17 June 2018 - 09:55 Brak informacji

Hello, give me a help please.
I write:
accelerometer.useInterrupt(ADXL345_INT1);

but the interrupt does not work. I do not see any changes on the outputs INT1 :(

Avatar 1
xorkrus Windows XP / Mozilla Firefox 38.9
18 June 2018 - 18:20 Brak informacji

Hi, i write on arduino sketch next code: accelerometer.useInterrupt(ADXL345_INT1);
but on INT1 pin accelerometer nothing changes on any event. Why?

Avatar 1
Amin Windows / Mozilla Firefox 61.0
23 July 2018 - 23:01 Brak informacji

Hello
thanks so much because of your helpful website, would you please help me in my project, first please guide me for choosing best acceleration sensor for sensing free fall acceleration in ( g ) rate and acceleration effect after free fall contact, i want to calculate this acceleration ( after contact ) and draw that plot, can i use above code for this project?
please help me

thanks so much
have a good time
Amin

Avatar 1
Artur Windows / Safari 537.36
05 June 2019 - 10:16 Brak informacji

Taka mała uwaga a bardziej prośba bo widzę, że jest Pan bardzo wrażliwy w tej kwestii, jak Pan tworzy biblioteki to może było by praktyczniej gdyby nadawał im Pan własne nazwy, np. do ADXL345 dodawał prefiksy lub sufiksy. Ktoś kto korzysta z Pana bibliotek nie będzie musiał chować bibliotek producentów już wcześniej pobranych.

Avatar 1
Garibadi240 Windows / Mozilla Firefox 70.0
23 November 2019 - 09:11 Brak informacji

Dzień dobry mam problem. "exit status 1
no matching function for call to \'ADXL345::ADXL345()\'"

Powiedz mi jak to rozwiązać?

Avatar 1
gadzik90 Windows / Safari 537.36
26 December 2019 - 22:29 Warszawa

cześć, użyłem Twoich bilbiotek do projektu, który miał za zadanie odczyt wartości w m/s2 i zapis tego na kartę SD - celem było obliczenie na podst. zebranych danych prędkości i przebytej drogi (ktoś już wcześniej o tym pisał). Problem w tym, że w kierunku X ze zwrotem zgodnym z układem mam prawidłowy odczyt, natomiast w drugą stronę już nie (na podst. przyspieszenia ziemskiego). Moje krótkie pytanie: czy to wina mojego wadliwego układu? Czy może jest jakiś sposób aby to wykalibrować?

Avatar 1
TzOk Windows 7 / Mozilla Firefox 71.0
28 December 2019 - 00:32 Żory

Próbowałem używać sprzętowego przerwania na Twojej bibliotece i na SparkFun, nie działa ani tu, ani tu. Pin INT1 ma cały czas stan wysoki. Na MPU6050 działa bez problemu.