sábado, 26 de diciembre de 2015

Combinaciones de sensores

CÓDIGO

MMA7361 Sensor Acelerometro

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
sensor MMA7361
 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 GVoltaje salidaArduino analogRead()Luego de map()
1.5~3.3V~1023~500
0~1.6V~511~0
1.5~0V~0~-500


void loop() {
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