Collegare un accelerometro MMA7361 ad Arduino

In questo tutorial vi mostrerò come collegare ed utilizzare un accelerometro MMA7361 con Arduino.




Questo sensore è stato comprato su ebay ad un prezzo di circa 6 euro, non sarà il più preciso del mercato, ma va benissimo per semplici esperimenti.





Nella realizzazione dello schema ho scelto di inserire anche un pulsante per permettere l'azzeramento della lettura dei 3 assi.
In questo modo, se vogliamo piazzare il sensore su un piano non in bolla, possiamo poi azzerare e vedere la variazione della lettura in modo più evidente.
Inoltre, per permettere una lettura più accurata, facciamo eseguire all'Arduino un campionamento di 10 valori, tra i quali prendere il valore medio.

Ecco un video che è meglio di mille parole:



Il collegamento da fare è il seguente:



Mentre questo è lo stesso collegamento ma schematizzato:



Ed infine caricate questo sketch ed aprite il monitor seriale.
Come al solito se avete qualcosa da chiedere non esitate!

  1. int ZPin = A2;
  2. int YPin = A1;
  3. int XPin = A0;
  4. int valz[10];
  5. int valy[10];
  6. int valx[10];
  7. int sommaz;
  8. int sommay;
  9. int sommax;
  10. int mediaz;
  11. int mediay;
  12. int mediax;
  13. int cal = 8;
  14. int calz;
  15. int caly;
  16. int calx;
  17. int z;
  18. int y;
  19. int x;
  20. void setup() {
  21.   Serial.begin(9600);
  22.   Serial.println("MMA 7361");
  23.   pinMode (cal, INPUT);
  24.   digitalWrite (8, HIGH);
  25.   calz = 0;
  26.   caly = 0;
  27.   calx = 0;
  28. }
  29. void loop() {
  30.   for (int i=0;i<10;i++)
  31.   {
  32.     valz[i] = analogRead(ZPin);
  33.     valy[i] = analogRead(YPin);
  34.     valx[i] = analogRead(XPin);
  35.     delay(40);
  36.   }
  37.   sommax = 0;
  38.   sommay = 0;
  39.   sommaz = 0;
  40.   for(int i=0; i<10; i++){
  41.     sommaz = sommaz + valz[i];
  42.     sommay = sommay + valy[i];
  43.     sommax = sommax + valx[i];
  44.   }
  45.   mediaz = sommaz / 10;
  46.   mediay = sommay / 10;
  47.   mediax = sommax / 10;
  48.   int buttonState = digitalRead(cal);
  49.   if (buttonState == LOW)
  50.   {
  51.     calz = mediaz;
  52.     caly = mediay;
  53.     calx = mediax;
  54.   }
  55.   z = mediaz-calz;
  56.   y = mediay-caly;
  57.   x = mediax-calx;
  58.   Serial.print("Z: ");
  59.   Serial.print(z);
  60.   Serial.print("  Y: ");
  61.   Serial.print(y);
  62.   Serial.print("  X: ");
  63.   Serial.println(x);
  64.   delay(500);
  65. }

CIAO!!

20 commenti:

  1. I ԝas recommenɗed this web site through mmy cousin.
    I'm now not sure whether this post іs written through hhim as nobodsy else recognise such ϲertain about my proƅlem.
    You're amazinɡ! Thank you!

    My pаge ... Personal Loan

    RispondiElimina
    Risposte
    1. I'm glad you like it, continue to read me! :)

      Elimina
  2. I do agree with all of the ideas you've offered to your post.

    They are really convincing and will certainly work. Nonetheless, the posts are too short for
    novices. May you please extend them a little from next time?
    Thank you for the post.

    my website ... Poker Ringspel Strategi

    RispondiElimina
    Risposte
    1. Sure, i'll try to add more information in my post,
      Thank you for your constructive comment!

      Elimina
  3. preavviso che davvero ne conosco poco, per ora, di Arduino e linguaggio in generale.
    Potresti spiegarmi l'utilizzo dell'array in questo sketch?

    RispondiElimina
    Risposte
    1. Ciao, l'ho usato per poter campionare 10 valori, che poi divido per 10, cosí facendo ottengo come valore finale il valore medio di 10 letture che è un valore con buona precisione.

      Elimina
  4. Ciao Daniele, ma questo accelerometro come mai rimane sull ultimo valore che legge ? non dobrebbe tornare a zero dopo aver letto l accelerazione ?

    RispondiElimina
    Risposte
    1. No perché l'accelerazione gravitazionale è sempre presente.

      Elimina
    2. ma non è che nel modulo è implementato un tilt sensing ? mi sembra strano che un accelerometro in se mantenga il valore.

      Elimina
  5. Ciao, stesso collegamento per Arduino mega2560? e sopratutto, posso togliere il pulsante (che presumo sia un semplice ON OFF) collegato nel DIGITAL8 e collegare questo pin direttamente sul GND di arduino?
    Grazie!

    RispondiElimina
    Risposte
    1. Se colleghi il pulsante a gnd resetterai la posizione di riferimento continuamente. Piuttosto non collegare affatto il pulsante.
      Per l'arduino mega penso non ci siano problemi, usa gli stessi pin.

      Elimina
    2. Innanzi tutto grazie della risposta!
      Ho disegnato questo schema, dici che possa andare? ho il terrore di provarlo :)

      http://forum.arduino.cc/index.php?action=dlattach;topic=282076.0;attach=104215;image

      Elimina
    3. L'ho guardato e mi sembra tutto a posto, prova..

      Elimina
    4. Grazie! e grazie anche per condividere i tuoi esperimenti!

      Elimina
  6. Salve, volevo collegare un accelerometro ad un trasmettitore radio, muovendolo dovrei avere una trasmissione, potete aiutarmi? a.stora@alice.it

    RispondiElimina
  7. Ciao, che tipo di trasmissione radio?

    RispondiElimina
  8. Ciao,possibile fare in modo che durante una scossa arduino emetta una nota acustica oppure una uscita per attivare un rele' ?

    RispondiElimina
    Risposte
    1. certo, devi aggiungere un "if" dove vai a vedere se il valore di un asse ("x" ad esempio) supera un certo valore, in questo caso attivi l'uscita.

      Fammi sapere, ciao!

      Elimina
  9. Io no sono pratico di arduino potresti aiutarci?,vorrei testare sul campo la possibilità di installare detti sensori in modo di inviare un allarme acustico locale e anche via radio.

    RispondiElimina
    Risposte
    1. Certo, inizia a realizzare il progetto di questo post (è la base per quello che vuoi fare), poi scrivimi nella sezione "chiedi e rispondi" e cercherò di darti una mano! Ciao

      Elimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Related Posts Plugin for WordPress, Blogger...