Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Akcelerometr ADXL325 wyłuskanie kąta odchylenia.

A.T. 27 Jul 2010 19:19 3138 17
  • #1
    A.T.
    Level 20  
    Witam
    posiadam akcelerometr trzyosiowy ADXL325. Buduję robota balansującego. Mam problem z wyciągnięciem informacji o kącie odchylenia od pionu. Mam zamiar korzystać z dwóch osi X i Y. Wiem, że trzeba zastosować wzór: α=artg(Ax/Ay)
    α to kąt który chce poznać
    Ay to przyspieszenie w osi Y
    Ax to przyspieszenie w osi X



    Nie rozumiem tylko jak te napięcie przeliczyć na g. Wydaje mi się, że najważniejsze informacje z pdfu to:
    -Sensitivity at XOUT, YOUT, ZOUT - 174mV/g
    -0 g Voltage at XOUT, YOUT, ZOUT - 1,5V

    Akcelerometr działa dla zakresu +/-5g czyli ja to rozumiem tak, że przy 0 g, czyli brak ruchu jest 1,5V na poszczególnych wyjściach, oczywiście nie na wszystkich, ponieważ jest jeszcze przyciąganie ziemskie, czyli na którejś osi będzie +/-1g w zależności od ustawienia czujnika. A podczas każdego ruchu te napięcie będzie się zwiększało lub zmniejszało w zależności od zwrotu przyspieszenia. Np. dla 1g będzie wynosiło 1,674V, a dla -1g będzie wynosiło 1,326V. I te wartości po przeliczeniu na przyspieszenie podstawiam do tego wzorku i wychodzi mi kąt α (odchylenie od pionu). Czy dobrze myślę, jeśli nie to proszę o poprawienie tego co napisalem. I jeśli ktoś kiedyś pisał albo posiada fragment kodu z zastosowaniem tego wlaśnie wzoru i zczytaniem akcelerometru w języku c to bardzo proszę o udostępnienie go. Bardzo by mi to pomogło przy tworzeniu własnego.
    Pozdrawiam
    A.T.
  • #2
    tmf
    Moderator of Microcontroller designs
    Myślisz dobrze, z tym, że mała poprawka - jeśli obiekt jest w spoczynku lub porusza się ruchem jednostajnym prostoliniowym to przyśpieszenie jest równe 0. Stary dobry Newton się kłania. Stąd też na wszystkich pinach w spoczynku będziesz miał 1,5V, niezależnie od grawitacji. Zmiana się pojawi jeśli ten czujnik zacznie swobodnie spadać :)
  • #3
    atom1477
    Level 43  
    tmf: co to za herezje?
  • #5
    __Grzegorz__
    Level 29  
    Pyt.: a przyspieszenie ziemskie gdzie?
    Odp.: Rozłoży się na 3 składowe x, y i z... w zależności od położenia akcelerometru w stosunku do Ziemii.... I tu dopiero zaczyna się zabawa...
  • #6
    A.T.
    Level 20  
    tmf mi się wydaje, że akcelerometr jednak będzie pokazywał przyspieszenie ziemskie, w końcu to nie zależy od ruchu danego ciała tylko ziemi. Tak mi się wydaję.

    Zgadza przyspieszenie ziemskie rozłoży się na trzy osie jeśli ułożymy akcelerometr byle jak. Ja mam zamiar ułożyć go równolegle osią Y do płaszczyzny ziemi, czyli osią X prostopadle do ziemi. I mam zamiar użyć tych dwóch osi, czyli rozumiem, że przed podstawieniem do tego wzorku trzeba jedynie odjąć g z osi Y (czyli odjąć 174mV). Dobrze myślę?
  • #8
    A.T.
    Level 20  
    Napisałem coś w C tylko nie wiem do końca czy o to chodzi:)

    Code:

    #include <stdio.h>
    #include <math.h>

    unsigned int danaK = 0;
    float axis_X = 0;
    float axis_Y = 0;
    float alfa = 0;

    int main(void)

    axis_X = danaK - 1500
    axis_X = axis_X / 174

    axis_Y = danaK - 1674;
    axis_Y = axis_X / 174;
          
    alfa = axis_X / axis_Y;
    alfa = atan(alfa);
    return 0;
    }


    Czyli na początku deklaruję zmienne:
    danaK to jest zmienna pomocnicza przy zczytywaniu danych z przetwornika ADC,
    axis_X to jest napięcie wychodzące z akcelerometru (Oś X),
    axis_Y to jest napięcie wychodzące z akcelerometru (Oś Y),
    alfa to jest kąt odchylenia od pionu,

    Przetwornik to MCP3208, 12 bitowy, napięcie odniesienia MCP1541 4,096V, czyli danaK bez przekształceń pokazuje mV 0-4095. Od każdej z osi odejmuję 1500 czyli napięcie 1,5V, które jest gdy akcelerometr wykrywa 0g, dodatkowo od axis_Y odejmuję 174 ( czyli odejmuję 1500+174 = 1674) ponieważ wykrywa 1g czyli przyspieszenie ziemskie. Następnie każdą oś dzielę na 174 aby zamienić na g i później podstawiam do wzoru i obliczam alfę. Czy to ma szansę działać?
    Pozdrawiam
    A.T.
  • #10
    A.T.
    Level 20  
    Wybacz, ale do końca nie rozumiem pytania. Robot ma utrzymywać równowagę tzn. ma stać w miejscu, a jak się go np. popchnie to ma się utrzymać:)
  • #11
    __Grzegorz__
    Level 29  
    Inaczej:
    wg ciebie oś X jest prostopadle do ziemii (normalna do powierzchni Ziemii), czyli płaszczyzna YOZ jest równolegle do niej.

    Robot może poruszać się w kierunkach osi OY i OZ, czy tylko OY albo tylko OZ?
  • #12
    A.T.
    Level 20  
    Oj przepraszam z tych wszystkich osi mi się wszystko pomyliło. Akcelerometr jest ustawiony tak, że oś X jest ustawiona równolegle do płaszczyzny ziemi. Czy robot porusza się tylko po płaszczyźnie osi X (rysunek poniżej)
    Akcelerometr ADXL325 wyłuskanie kąta odchylenia.
  • #13
    Maticool
    Level 20  
    A czy Kolega zdaje sobie sprawę, że sam akcelerometr liniowy to za mało żeby sterować robotem?

    Problem leży w fizyce. Kiedy robot zaczyna się przewracać robi to ruchem przyspieszonym. Pojawiają się dodatkowe siły bezwładności "mylące" właściwe pomiary szczególnie kiedy akcelerometr jest daleko od osi obrotu kół jak kolega narysował. Dodatkowo dochodzą jeszcze przyspieszenia wynikające z ruchów jakie nadają robotowi silniki. Dlatego twórcy takich robotów używają jeszcze żyroskopów -> Link

    Quote:
    An accelerometer alone is not enough to balance. A gyroscope alone is enough to balance for a while, but eventually gyro drift will cause the robot to fall over. This is why all successful inertial balancers use a gyro/accelerometer pair. (If you want a balancer without the inertial hassle, check out IR-based balancers like Legway.)

    The reason you can't use an accelerometer alone for balancing goes back to the motors -- your speedy motors will cause the robot to jerk rapidly, and without a gyroscope, the accelerometer will be unable to distinguish the jerk from angular rotation. There is no way to filter or model this away. Dozens of smart people have documented their attempts to build inertial balancers with accelerometers alone, and none of them have come close to working. (But it's still fun to learn from other people's attempts.)
  • #14
    __Grzegorz__
    Level 29  
    W tej sytuacji nie eliminowałbym przyspieszenia ziemskiego z obliczeń,
    a wręcz przeciwnie, wykorzystałbym je do liczenia kąta odchylenia robota.

    W spoczynku na robota działa tylko ziemskie g i w zależności od pochylenia robota
    rozkładać się ono będzie pomiędzy składowe y i x.

    Przy założeniach:
    - robot nie zostanie szybko wyprowadzony z równowagi
    - kąt wychylenia nie przekroczy ~20stopni

    kąt wychylenia można by określić ze wzoru

    pomiarAx = odczyt z ADC
    pomiarAx = pomiarAx - wartośćAx dla Ax=0
    pomiarAy = odczyt z ADC
    pomiarAY = pomiarAy - wartośćAy dla Ay=0

    alfa = atan (pomiarAx/pomiarAy)

    przypominam także, że dla małych kątów alfa (~<15 stopni)
    tg(α) ≈ α (α w radianach)
    czyli w stanie bliskim równowagi
    α (stopnie) = 180/pi*pomiarAx/pomiarAy
    ...

    No i dowód, że kąty można wyznaczyć akcelerometrem:
    http://www.youtube.com/watch?v=DyFacsOiuoE&feature=channel

    Sama zrobiłem :)
  • #15
    A.T.
    Level 20  
    Wiem, że nie wystarczy sam akcelerometr, używam także żyroskopu LPR510AL.
    Wszystko będzie filtrowa filtr kalmana, tylko na jego wejście potrzebuję właśnie odchylenie od pionu (akcelerometr) i prędkość kątową (żyroskop)

    Dodano po 5 [minuty]:

    Co to jest u Ciebie watośćAx i wartośćAy? Rozumiem że te 1,5V gdy jest 0g.
  • #16
    atom1477
    Level 43  
    tmf wrote:
    Tak, ten istotnie mierzy przyśpieszenie ziemskie, o czym piszą w pdf.

    Ten?
    Znajdź mi choć jeden akcelerometr który nie mierzy :D

    A co do pomiarów kąta nachylenia za pomocą akcelerometru to przydały by się jeszcze czujniki obrotu.
  • #17
    A.T.
    Level 20  
    Wiem, wiem, że aby mieć pełnego PIDa to muszą być także czujniki prędkości obrotowej silników. I takie też będą:) Dwa enkodery magnetyczne AS5040, ale to później przy sterowniku PID. Teraz tylko chcę napisać kod odczytujący wartości przyspieszeń z akcelerometru i zamieniający je na kąt odchylenia. To wraz z informacją o prędkości kątowej (żyroskop) pójdzie na filtr kalmana. On je odfiltruje i dokona fuzji tych pomiarów. Następnie to pójdzie na regulator PID, który będzie sterował silnikami, będzie miał także informacje o prędkości silników z czujników AS5040.
  • #18
    A.T.
    Level 20  
    Mam jeszcze jedno pytanie. Czy cały ten kod czyli kalmana , PID i odczyt czujników mam wrzucić w jedno przerwanie? A np. ewentualnie wyświetlacz i klawiaturę obsługiwać w pętli głównej? Czy macie inny pomysł? Proszę o odpowiedź, chciałbym już zacząć pisać program:)