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):
- #include <Wire.h>
- #include <ADXL345.h>
- ADXL345 accelerometer;
- void showRange(void)
- {
- Serial.print("Wybrany zakres pomiarowy: ");
- switch(accelerometer.getRange())
- {
- case ADXL345_RANGE_16G: Serial.println("+/- 16 g"); break;
- case ADXL345_RANGE_8G: Serial.println("+/- 8 g"); break;
- case ADXL345_RANGE_4G: Serial.println("+/- 4 g"); break;
- case ADXL345_RANGE_2G: Serial.println("+/- 2 g"); break;
- default: Serial.println("Bledny zakres"); break;
- }
- }
- void showDataRate(void)
- {
- Serial.print("Wybrana szybkosc transmisji: ");
- switch(accelerometer.getDataRate())
- {
- case ADXL345_DATARATE_3200HZ: Serial.println("3200 Hz"); break;
- case ADXL345_DATARATE_1600HZ: Serial.println("1600 Hz"); break;
- case ADXL345_DATARATE_800HZ: Serial.println("800 Hz"); break;
- case ADXL345_DATARATE_400HZ: Serial.println("400 Hz"); break;
- case ADXL345_DATARATE_200HZ: Serial.println("200 Hz"); break;
- case ADXL345_DATARATE_100HZ: Serial.println("100 Hz"); break;
- case ADXL345_DATARATE_50HZ: Serial.println("50 Hz"); break;
- case ADXL345_DATARATE_25HZ: Serial.println("25 Hz"); break;
- case ADXL345_DATARATE_12_5HZ: Serial.println("12.5 Hz"); break;
- case ADXL345_DATARATE_6_25HZ: Serial.println("6.25 Hz"); break;
- case ADXL345_DATARATE_3_13HZ: Serial.println("3.13 Hz"); break;
- case ADXL345_DATARATE_1_56HZ: Serial.println("1.56 Hz"); break;
- case ADXL345_DATARATE_0_78HZ: Serial.println("0.78 Hz"); break;
- case ADXL345_DATARATE_0_39HZ: Serial.println("0.39 Hz"); break;
- case ADXL345_DATARATE_0_20HZ: Serial.println("0.20 Hz"); break;
- case ADXL345_DATARATE_0_10HZ: Serial.println("0.10 Hz"); break;
- default: Serial.println("Bleda szybkosc transmisji"); break;
- }
- }
- void setup(void)
- {
- Serial.begin(9600);
- // Inicjalizacja ADXL345
- Serial.println("Inicjalizacja ADXL345");
- if (!accelerometer.begin())
- {
- Serial.println("Nie odnaleziono ADXL345, sprawdz podlaczenie!");
- delay(500);
- }
- // Wybor zakresu pomiarowego
- // +/- 2G: ADXL345_RANGE_2G
- // +/- 4G: ADXL345_RANGE_4G
- // +/- 8G: ADXL345_RANGE_8G
- // +/- 16G: ADXL345_RANGE_16G
- accelerometer.setRange(ADXL345_RANGE_16G);
- // Wyswietlenie aktualnych parametrow
- showRange();
- showDataRate();
- }
- void loop(void)
- {
- // Odczyt wartosci surowych
- Vector raw = accelerometer.readRaw();
- // Odczyt wartosci znormalizowanych
- Vector norm = accelerometer.readNormalize();
- // Wyswietlenie danych surowych
- Serial.print(" Xraw = ");
- Serial.print(raw.XAxis);
- Serial.print(" Yraw = ");
- Serial.print(raw.YAxis);
- Serial.print(" Zraw: ");
- Serial.print(raw.ZAxis);
- // Wyswietlenie danych znormalizowanych m/s^2
- Serial.print(" Xnorm = ");
- Serial.print(norm.XAxis);
- Serial.print(" Ynorm = ");
- Serial.print(norm.YAxis);
- Serial.print(" Znorm = ");
- Serial.print(norm.ZAxis);
- Serial.println();
- delay(200);
- }
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.
- #include <Wire.h>
- #include <ADXL345.h>
- ADXL345 accelerometer;
- void setup(void)
- {
- Serial.begin(9600);
- // Inicjalizacja ADXL345
- Serial.println("Inicjalizacja ADXL345");
- if (!accelerometer.begin())
- {
- Serial.println("Nie odnaleziono ADXL345, sprawdz podlaczenie!");
- delay(500);
- }
- // Wybor zakresu pomiarowego
- accelerometer.setRange(ADXL345_RANGE_16G);
- }
- void loop(void)
- {
- // Odczyt znormalizowanych wartosci
- Vector norm = accelerometer.readNormalize();
- // Filtr dolnoprzepustowy (0.1 - 0.9)
- Vector filtered = accelerometer.lowPassFilter(norm, 0.15);
- // Obliczenie Pitch & Roll z danych znormalizowanych
- int pitch = -(atan2(norm.XAxis, sqrt(norm.YAxis*norm.YAxis + norm.ZAxis*norm.ZAxis))*180.0)/M_PI;
- int roll = (atan2(norm.YAxis, norm.ZAxis)*180.0)/M_PI;
- // Obliczenie Pitch & Roll z danych filtra dolnoprzepustowego
- int fpitch = -(atan2(filtered.XAxis, sqrt(filtered.YAxis*filtered.YAxis + filtered.ZAxis*filtered.ZAxis))*180.0)/M_PI;
- int froll = (atan2(filtered.YAxis, filtered.ZAxis)*180.0)/M_PI;
- // Wyswietlenie wartosci
- Serial.print(" Pitch = ");
- Serial.print(pitch);
- Serial.print(" Roll = ");
- Serial.print(roll);
- // Wyswietlenie wartosci (z filtra)
- Serial.print(" (filter)Pitch = ");
- Serial.print(fpitch);
- Serial.print(" (filter)Roll = ");
- Serial.print(froll);
- Serial.println();
- 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ń.
- #include <Wire.h>
- #include <ADXL345.h>
- ADXL345 accelerometer;
- int RedPin = 4;
- int GreenPin = 3;
- int BluePin = 2;
- long RedTime;
- long GreenTime;
- long BlueTime;
- long DTTime;
- void setup(void)
- {
- Serial.begin(9600);
- pinMode(RedPin, OUTPUT);
- pinMode(BluePin, OUTPUT);
- pinMode(GreenPin, OUTPUT);
- digitalWrite(RedPin, LOW);
- digitalWrite(BluePin, LOW);
- digitalWrite(GreenPin, LOW);
- // Inicjalizacja ADXL345
- Serial.println("Inicjalizacja ADXL345");
- if (!accelerometer.begin())
- {
- Serial.println("Nie odnaleziono ADXL345, sprawdz podlaczenie!");
- delay(500);
- }
- // Wartosci dla wykrycia swobodnego spadania
- accelerometer.setFreeFallThreshold(0.35); // 0.35 g
- accelerometer.setFreeFallDuration(0.1); // 0.10 s
- // Wartosci dla wykrycia aktywnosci i jego braku
- accelerometer.setActivityThreshold(1.2); // 1.20 g
- accelerometer.setInactivityThreshold(1.2); // 1.20 g
- accelerometer.setTimeInactivity(5); // 5.00 s
- // Badanie aktywnosci i jego braku we wszystkich osiach
- accelerometer.setActivityXYZ(1);
- accelerometer.setInactivityXYZ(1);
- // Badanie stukniec tylko dla osi Z
- accelerometer.setTapDetectionX(0); // Nie sprawdzamy osi X
- accelerometer.setTapDetectionY(0); // Nie sprawdzamy osi Y
- accelerometer.setTapDetectionZ(1); // Uwzgledniamy jedynie os Z
- // Wartosci dla wykrywania stukniec
- accelerometer.setTapThreshold(2.5); // 2.50 g
- accelerometer.setTapDuration(0.02); // 0.02 s
- accelerometer.setDoubleTapLatency(0.10); // 0.10 s
- accelerometer.setDoubleTapWindow(0.30); // 0.30 s
- // Wybieramy przerwanie INT1
- accelerometer.useInterrupt(ADXL345_INT1);
- }
- void loop(void)
- {
- long time = micros();
- // Gaszenie zapalonych diod po uplywie danego czasu od zapalenia
- if ((time - RedTime) > 300000) digitalWrite(RedPin, LOW);
- if ((time - BlueTime) > 300000) digitalWrite(BluePin, LOW);
- // Opoznienie przed odczytem (poprawia wyniki) i odczytanie pomiaru
- delay(50);
- Vector norm = accelerometer.readNormalize();
- // Odczytanie aktywnosci
- Activites activ = accelerometer.readActivites();
- // Jesli wykryto swobodne spdanie - mrugaj dioda
- if (activ.isFreeFall)
- {
- for (int i = 0; i <= 4; i++)
- {
- digitalWrite(RedPin, HIGH);
- digitalWrite(BluePin, HIGH);
- delay(100);
- digitalWrite(RedPin, LOW);
- digitalWrite(BluePin, LOW);
- delay(100);
- }
- delay(200);
- return;
- }
- // Jesli wykryto podwojne stykniecie zapal czerowna
- if (activ.isDoubleTap)
- {
- digitalWrite(RedPin, HIGH);
- RedTime = micros();
- } else
- if (activ.isTap) // Jesli pojedyncze stukniecie zapal niebieska
- {
- digitalWrite(BluePin, HIGH);
- BlueTime = micros();
- }
- // Jesli nieaktywny zapal zielona diode
- if (activ.isInactivity)
- {
- digitalWrite(GreenPin, HIGH);
- GreenTime = micros();
- }
- // Jesli aktywny zgas zielona diode
- if (activ.isActivity)
- {
- digitalWrite(GreenPin, LOW);
- }
- }
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

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. ;)

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

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ź.

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

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

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

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

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

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.

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

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ć?

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

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.?

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

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ł

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

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?

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

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???

// 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;

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);

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

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.

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 :(

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

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

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.

Dzień dobry mam problem. "exit status 1
no matching function for call to \'ADXL345::ADXL345()\'"
Powiedz mi jak to rozwiązać?

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ć?

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.