Skocz do zawartości

Czujnik przyspieszeń, akcelerometr MMA7361 +ARDUINO


Pomocna odpowiedź

Napisano

Witam, mam pytanie do bardziej zaawansowanych Kolegów , jak podłączyć akcelerometr MMA 7361 do modułu ARDUINO,w/w moduł ma wyjścia do zasilania 3 i 5 v i ma stabilizator , poza tym parę innych pinów.Czy te dwa piny do zasilania są do wyboru tj. albo 3 v lub 5 ( ciągnę to z ARDUINO ) a reszta ?

Za wskazówki i podpowiedzi z góry dziękuję.

Pozdrawiam[

Spojrzałem z ciekawości w notę (spojrzałeś?). Układ ma jeden tylko pin zasilania VDD (pin 6) i jest to +3,6V (max). VSS to masa a nie drugi do wyboru pin zasilania.

Spojrzałem z ciekawości w notę (spojrzałeś?). Układ ma jeden tylko pin zasilania VDD (pin 6) i jest to +3,6V (max). VSS to masa a nie drugi do wyboru pin zasilania.

Witam ponownie , nie ten moduł ma wyjście zasilania 5 i 3,3 v , pozostałe to GND(wiadomo) , nastepne to GS, ST,X,Y,Z,SL,OG

Źle wkleiłeś zdjęcie albo wcześniej go nie było.

IMHO możesz podłączyć dowolne zasilanie.

Jesli chcesz się upewnić sprawdź czy wyjście stabilizatora połączone jest z pinem 3V3.

GS to pewnie g-select, czyli wybór czułości, ST to Self-Test (sprawdź w dokumentacji, czy do normalnego działania podłącza się do 0 czy 1), X, Y i Z to sygnały analogowe przyspieszeń w odpowiednich osiach, SL to sleep (zapewne negowany), OG nie pamiętam. Generalnie wszystko powinieneś mieć w dokumentacji.

  • 1 rok później...

To mój pierwszy poast dlatego witam serdecznie! Trochę odświeżę temat bo właśnie bawię się mma7161.

Zmontowałem płytkę z atmegą, stabilizatorkiem, i układem akcelerometru. Działa ok - przez monitor portu szeregowego obserwuje zmieniające się parametry x,y,z ruszając płytką, ale chcę kod rozwinąć o funkcję włączania diody w przypadku przekroczenia pewnej wartości - np gdy wartość w osi X przekroczy 2g - dioda się zapala.

Kod mam taki:

#include <AcceleroMMA7361.h>
#include <avr/io.h>

AcceleroMMA7361 accelero;
int x;
int y;
int z;

void setup()
{
 Serial.begin(9600);
 accelero.begin(13, 12, 11, 10, A0, A1, A2);
 accelero.setARefVoltage(3.3);             
 accelero.setSensitivity(LOW);               
 accelero.calibrate();
}

void loop()
{
 x = accelero.getXAccel();
 y = accelero.getYAccel();
 z = accelero.getZAccel();
 Serial.print("\nx: ");
 Serial.print(x);
 Serial.print(" \ty: ");
 Serial.print(y);
 Serial.print(" \tz: ");
 Serial.print(z);
 Serial.print("\tG*10^-2");
 delay(500);                                
}

zakładam że do uzyskania żądanego efektu potrzebuję coś w stylu

 if(x>=150)
   {
     PORTB |= 0x02;
     }

oraz definicję portu atmegi do sterowania napęciem na diodę...

Niestety śleczę nad tym już pół dnia i jakkolwiek bym nie kombinował i dopisywał - układ odmawia współpracy.

Proszę o pomoc w tej kwestii - od rana stawiałem atmege na nogi i po tych bootloaderach, fusebitach itp mózg mi się już lasuje 🙂

Jakie wartości masz w poszczególnych osiach? Widzę, że wypisujesz je przez port szeregowy, więc upewnij się, że faktycznie osiągasz zadaną granicę.

Samo zgaszenie/zapalenie diody na Arduino jest banalne:

digitalWrite(pin, state);

Zazwyczaj led jest na pinie nr 13.

Na osiach przez serial podaje mi dobre wartości. Jak płytka poziomo leży to x i y 0g a na z 9-10g - oczywiście reaguje bardzo dokładnie na każdy ruch układu.

Dzięki za kod, ale ja nie mam płytki arduino tylko atmege na płytce prototypowej wiec w zasadzie diode mogę pod każdy pin podłączyć, tylko coś się nie mogę z tym "if" połapać...

Hmm, skoro dostajesz wartości z zakresu 0-10, to raczej nie uzyskasz wartości 150. Chyba że podałeś wartości już jakoś przetworzone.

zakres oczywiście jest wiekszy (do 6g - czyli 60m/s2)

10m/s2 (1g) jest w stanie spoczynku na osi "Z"

Program pokazuje z dokładnością do jednego miejsca po przecinku - tyle że bez przecinka, wiec dane wygladają - w stanie spoczynku 100, przy mocniejszym szarpnięciu można uzykac odczyt 200 i więcej...

chodzi o to że chcę aby atmega na obojętnie którym pinie sterowała diodą (włączała ją) gdy odczyt z osi x akcelerometru wskaże powyżej np 1g

No to zrób tak:

if(x>=150)
{
     PORTB |= 0x02;
} 
else
{
     PORTB &= ~0x02;
}

__________

Komentarz dodany przez: Treker

Dodałem znaczniki code.

  • 3 tygodnie później...

temat ogarnięty, pojawia się następny...

Korzystając z biblioteki do akcelerometru, oraz przykładowego programu

#include <AcceleroMMA7361.h>

AcceleroMMA7361 accelero;
int x;
int y;
int z;

void setup()
{
 Serial.begin(9600);
 accelero.begin(13, 12, 11, 10, A0, A1, A2);
 accelero.setARefVoltage(3.3);                   //sets the AREF voltage to 3.3V
 accelero.setSensitivity(LOW);                   //sets the sensitivity to +/-6G
 accelero.calibrate();
}

void loop()
{
 x = accelero.getXAccel();
 y = accelero.getYAccel();
 z = accelero.getZAccel();
 Serial.print("\nx: ");
 Serial.print(x);
 Serial.print(" \ty: ");
 Serial.print(y);
 Serial.print(" \tz: ");
 Serial.print(z);
 Serial.print("\tG*10^-2");
 delay(500);                                     //make it readable
}

programik działa, na monitorze portu kom pokazuje ładnie wartości.

Przy każdorazowym restarcie moduł się kalbruje ( i trzeba go w tedy w poziomie trzymać)

Jak zrobić żeby akcelerometr kalibrował się tylko raz po naciśnięciu switcha?

Próbowałem takiego kodu:

if(buttonStateRESET == HIGH)
{
accelero.calibrate();
}

ale nie zdaje egzaminu

Może każdorazową kalibracje wymusza biblioteka?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...