Este sensor (MMA7361) es un acelerómetro analógico de 3 ejes (x,y,z). El nivel de las medidas del acelerómetro, nos permite medir la aceleración, o la inclinación de una plataforma con respecto al eje terrestre.
Otras características que tiene son el modo sleep, acondicionamiento de señal, filtro pasa bajas de 1 polo, compensación de temperatura, auto prueba, y detección de 0g para caída libre. Este sensor funciona con alimentaciones entre 2.2 y 3.6VDC (3.3V es el valor óptimo), y consume solamente 400µA de corriente.
Especificaciones del sensor MMA7361:
- – Bajo consumo de corriente: 400 μA.
- – Modo de espera: 3 μA.
- – Bajo Voltaje de la operación: 2,2 V – 3,6 V.
- – Alta sensibilidad (800 mV / g@1.5g).
- – Sensibilidad seleccionable (± 1,5 g, ± 6 g).
- – Encendido Rápido Tiempo de calentamiento (0.5 ms Tiempo de Respuesta Activa).
- – 0g-Detect para la Protección de la caída libre.
- – Acondicionamiento de señales con filtro de paso bajo.
- – Diseño robusto, alto Shocks supervivencia.

de pines del sensor MMA7361:

Eje – X | Es una señal de salida analógica a lo largo del eje X |
Eje – Y | Es una señal de salida analógica a lo largo del eje Y |
Eje – Z | Es una señal de salida analógica a lo largo del eje Z |
Sleep(SL) | Este pin se activa de forma negada el integrado pasara a sleep y no nos enviara nada en sus salidas. se reanudará la operación cuando se consuma mas energía. |
Detect(0G) | Este pin será alto cuando se detecta 0g en los 3 ejes. Útil para detectar caida libre |
5V | Este pin está conectado a un regulador construido en el que traerá de 5v a 3.3v que se requieren en el chip para ejecutarse. |
3.3V | Este pin no pasa por el regulador de 5v, es para aquellos que tienen un voltaje de 3.3v regulado previamente. |
Ground(GND) | Este pin debe estar conectado a la tierra del circuito. |
Sense Select(GS) | Este pin es un habilitador de los sensores x, y , z. Este hay que habilitarlo a nivel bajo, y luego restan los pines de alimentación y masa. se utiliza para seleccionar entre las dos sensibilidades. Si este pin es bajo se encuentra en modo 1,5 g. si es alto, se cambia al modo de 6 g. |
Self Test(ST) | Este chip se ha construido en un auto-test para verificar que tanto las piezas mecánicas y eléctricas en el interior del chip están funcionando correctamente.Es útil para la calibración. |
Se explicara como crear un inclinómetro utilizando el acelerómetro MMA7361 de 3 ejes y Arduino
Material que se necesita:
Conexión del sensor (MMA7361) al arduino:

Mapa de pines del SENSOR MMA7361
ARDUINO | CABLE/COLOR | MMA7361 |
GND | NEGRO | GND = Tierra |
5V | ROJO | 5V |
A0 | AZUL | X = Salida x |
A1 | VERDE | Y = Salida y |
A2 | AMARILLO | Z = Salida z |
GND | CAFE | GS = g-Select |
GND | CAFE | ST = Self Test |
AREF | GRIS | 3.3 y SL = Sleep |

Explicación del programa:
Este circuito es capaz de funcionar con 5V, sin embargo internamente funciona con 3.3V lo cual utilizaremos como referencia para el convertidor Análogo->Digital. Esto nos permitirá tener mayor precisión a la hora de leer.
[code language=»cpp»]
#include <math.h>
void setup() {
analogReference(EXTERNAL);
Serial.begin(9600);
}
[/code]
Definimos algunas variables para almacenar los valores de los componentes de las fuerzas en cada uno de los ejes del acelerómetro.
[code language=»cpp»]
int xVal = 0;
int yVal = 0;
int zVal = 0;
[/code]
Un par de variables de tipo flotante doble van a almacenar el ángulo en el que se encuentra el acelerómetro.
[code language=»cpp»]
double angleYZ = 0;
double angleXZ = 0;
[/code]
Vamos a utilizar el puerto serial para escribir los valores.
Luego, en el loop principal tenemos que leer los valores análogos y hacer un pequeño ajuste utilizando la función map(). El problema es que el convertidor análogo-digital tiene un rango que va desde 0 a 1023, si utilizáramos la función arco tangente utilizando estos valores nos mentiría ya que los componentes de la fuerza solo tendrían valores positivos y por lo tanto valores erróneos.
Para corregir este problema utilizamos la función «map()» que nos permitirá que nuestro rango varíe entre valores positivos y negativos como se muestra en la siguiente tabla:
Fuerza G | Voltaje salida | Arduino analogRead() | Luego de map() |
1.5 | ~3.3V | ~1023 | ~500 |
… | … | … | … |
0 | ~1.6V | ~511 | ~0 |
… | … | … | … |
1.5 | ~0V | ~0 | ~-500 |
[code language=»cpp»]
void loop() {
[/code]
Como pueden ver en el código lo primero que hacemos es leer los valores que se encuentran en las entradas análogas
[code language=»cpp»]
xVal = analogRead(0);
yVal = analogRead(1);
zVal = analogRead(2);
[/code]
Luego utilizamos la función map para generar un rango más adecuado para los valores de entrada.
[code language=»cpp»]
xVal = map(xVal, 0, 1023, -500, 500);
yVal = map(yVal, 0, 1023, -500, 500);
zVal = map(zVal, 0, 1023, -500, 500);
[/code]
Por último aplicamos las sencillas funciones trigonométricas para calcular el ángulo correspondiente.
[code language=»cpp»]
angleYZ = atan((double)yVal / (double)zVal);
angleYZ = angleYZ*(57.2958);
angleXZ = atan((double)xVal / (double)zVal);
angleXZ = angleXZ*(57.2958);
[/code]
Una vez calculados los ángulos simplemente los imprimimos en el puerto serial para poder leerlos desde la computadora.
[code language=»cpp»]
Serial.write(«yz:»);
Serial.print(angleYZ);
Serial.write(«\n»);
Serial.write(«xz:»);
Serial.print(angleXZ);
Serial.write(«\n»);
delay(100);
}
[/code]
Si revisan la salida del puerto serial notarán que los valores varían «bastante», esto sucede ya que siempre hay algo de «ruido» o interferencias en la señal y es completamente normal.
Hasta este punto simplemente compilamos nuestro programa y lo guardamos en nuestro Arduino.


Configuración del puerto serial
Para cargar el programa e ingresar al monitor serial que ofrece el Arduino es necesario asegurarse que el puerto COM sea el correcto. Para ello tenemos que acceder a “Administrador de dispositivos” desde la PC y verificar que el COM que nos muestra sea el mismo que marca el software de Arduino.

Una vez que este verificado el puerto serial solo damos click en la lupa que aparece en la parte superior derecha y automáticamente abre otra ventana que muestra los datos en el puerto serial.

Nota: observe que la nueva ventana marca como título del COM de la tarjeta que corresponde al serial monitoreado.
Para analizar el comportamiento del sensor se mueve de un lado a otro dependiendo las cordenedas se marcara los grados en la que se movió el sensor ya sea en xz o yz.
Hola muchas gracias, una duda: el módulo tiene un LED. Cuando está funcionando con normalidad debería estar encendido o apagado? Tienes que ver con el Sleep Mode ?
El LED esta conectado a VCC, siempre va a estar encendido.
sabes en que unidades mide la aceleracion el acelerometro?
Hola, es g = gravedad, es la unidad que maneja este tipo de sensor para esa variable
Buenos dias! Que calcula exactamente el sensor MMA7361? Aceleracion o inclinacion? Gracias.
Hola, las unidades que calcula te ayudan a medir variables para procesos como son: control de robótica, medición de vibración, detector de caídas, sensor de distancia y velocidad, entre otras variables, te dejo la hoja de datos https://hetpro-store.com/images/companies/1/DATSH/SMMA7361.pdf?1459869541779
Muy buena la informacion! Una pregunta! Como puedo hacer para usar el pin 0g para detectar una caida?
Hola tengo una duda… Porque se multiplica por 57.2958????
angleYZ = angleYZ*(57.2958);
De antemano gracias
Se multiplica para pasar de radianes a grados.
La funcion atan devuelve el angulo en radianes. 1 radian = 57.2958º
Hola que tal amigo hice las conexiones tal y como viene, pero me imprime solo 45 y no cambia, y si no utilizo el analogReference(EXTERNAL); da otros resultados.
Hola que tal 45 en el código? en la terminal? los 3 ejes? de cualquier manera te recomiendo probar a medir el voltaje con un multimetro del eje que este ortogonal al horizonte y después mide el voltaje volteando el dispositivo en ese eje en 180º.
la función map(), cual es el proceso que realiza
Cambia el rango de un numero a otro, común mente conocido como regla de tres o también relacionado con la ecuación de la recta. Por ejemplo el PWM trabaja a 8 bits y el ADC trabaja a 10 bits, esto es que cada módulo tiene un valor máximo de 256 y 1024 respectivamente. Entonces si tu quieres pasar el dato del ADC al PWM cuando el ADC llegue al 1/4 de su valor máximo va a dejar al PWM al máximo. Entonces aplicas la función map para que 1/4 del rango del ADC signifique ese 1/4 al valor de el PWM que en este caso para 1/4 seria: 64. https://www.arduino.cc/en/Reference/Map
Hola, yo quisiera guardar los datos en un archivo .txt, como podría hacerlo?
Hola necesito ayuda
Plar, dimos tu duda. Saludos.