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
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.
|
#include <math.h>
void setup() {
analogReference(EXTERNAL);
Serial.begin(9600);
}
|
Definimos algunas variables para almacenar los valores de los componentes de las fuerzas en cada uno de los ejes del acelerómetro.
|
int xVal = 0;
int yVal = 0;
int zVal = 0;
|
Un par de variables de tipo flotante doble van a almacenar el ángulo en el que se encuentra el acelerómetro.
|
double angleYZ = 0;
double angleXZ = 0;
|
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 |
Como pueden ver en el código lo primero que hacemos es leer los valores que se encuentran en las entradas análogas
|
xVal = analogRead(0);
yVal = analogRead(1);
zVal = analogRead(2);
|
Luego utilizamos la función map para generar un rango más adecuado para los valores de entrada.
|
xVal = map(xVal, 0, 1023, -500, 500);
yVal = map(yVal, 0, 1023, -500, 500);
zVal = map(zVal, 0, 1023, -500, 500);
|
Por último aplicamos las sencillas funciones trigonométricas para calcular el ángulo correspondiente.
|
angleYZ = atan (( double )yVal / ( double )zVal);
angleYZ = angleYZ*(57.2958);
angleXZ = atan (( double )xVal / ( double )zVal);
angleXZ = angleXZ*(57.2958);
|
Una vez calculados los ángulos simplemente los imprimimos en el puerto serial para poder leerlos desde la computadora.
CÓDIGO