Podómetro con MMA7361.

En el capítulo anterior vimos como se carga una librería desde la consola e incluso como crear nuestras propias librerías.

En esta practica vamos a hablar sobre el sensor MMA7361 que es un acelerómetro de 3 ejes X, Y, Z. El nivel de medida de dicho acelerómetro, nos permite leer la aceleración o la inclinacion del elemento en el cual se ponga dicho módulo.

Entre sus características podemos decir que tiene un consumo de 400µA, lo cual es muy poco con una tensión de entre 2,2 y 3,6V (pero lo podremos conectar a nuestra placa Arduino UNO.

pines del integrado

También puedo destacar que tiene un tiempo de encendido rápido, alta sensibilidad y acondicionamiento de señales con filtro pasa bajo.

Un acelerómetro es la base para construir un podómetro, ya que el aparato podómetro es un dispositivo electrónico que mide los pasos que das en relación a la variación de movimiento de su propio acelerómetro.

Un podómetro es un dispositivo que mide tus pasos

Pero quedras saber como funciona un podómetro en función de un acelerómetro, y para eso hay que saber como funciona un acelerómetro.

Acelerómetro

Según la RAE, un acelerómetro es un instrumento que sirve para medir la aceleracion de un dispositivo en movimiento. Desde el punto de vista de la ingeniería, un acelerómetro es un dispositivo que te permite medir las aceleraciones de un sistema en función de la torsión de los ejes físicos que se estirán en dicho sistema.

acelerómetro de 3 ejes

Un acelerómetro es un dispositivo que mide la vibración o la aceleración del movimiento de una estructura. La fuerza generada por la vibración o el cambio en el movimiento (aceleración) hace que la masa "comprima" el material piezoeléctrico, generando una carga eléctrica que es proporcional a la fuerza ejercida sobre él. El hecho de que la carga sea proporcional a la fuerza y que la masa sea constante hace que la carga también sea proporcional a la aceleración.

Acelerómetro MMA7361

Los acelerómetros, como el sensor MMA7361 son capaces de medir la aceleración en 3 dimensiones, llamados ejes X, Y, Z. Todo cuerpo posee un centro de masa que es el lugar donde se equilibran todas sus fuerzas. Si aplicamos una fuerza en un centro de masa, el cuerpo no va a rotar, pero si se aplica desplazado de su centro experimentara un momento de fuerza que lo hará rotar.

Cuando un objeto, en general se mueve por alguna fuerza aplicada, esa fuerza se puede descomponer como componentes de fuerza parciales sobre los 3 ejes, es decir Rx, Ry y Rz, el módulo o intensidad de la fuerza se calcula aplicando el teorema de Pitágoras en tres dimensiones:

tres ejes y resultante de fuerza

El origen podemos considerar que corresponde al centro de masa. Esta Fuerza tendrá asociados 3 ángulos, uno respecto de cada eje tal que:

cos(Axr) = Rx ÷ R
cos(Ayr) = Ry ÷ R
cos(Azr) = Rz ÷ R

Y los ángulos:

Axr = arccos(Rx÷R)
Ayr = arccos(Ry÷R)
Azr = arccos(Rz÷R)

De esta manera, si nuestro acelerómetro sensor nos está indicando cierta medida de magnitud aplicada en cada eje, podremos realizar estos cálculos para determinar intensidad y ángulos de la Fuerza. Al adquirir nuestro módulo acelerómetro, es importante leer su Datasheet para conocer la referencia de sus ejes y su orientación. Por ejemplo el MMA7361 tiene la siguiente disposición: Es decir, colocado de esta manera vemos como nombra los ejes y su signo, el cual es de suma importancia.

estructura del MMA7361

Dependiendo de la posición del chip, se producirán una serie de tensiones y valores que podremos tener en cuenta dada su posición:

posiciones del MMA7361

Así que si utilizamos estos valores dependiendo de sus posiciones, podremos crear acelerómetros de gran precisión y podómetros específicos a nuestra altura y peso.

Pines del MMA7361

A continuacion te muestro los pines que tiene el MMA7361.

pines del 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.

Medidas de ejes.

Ahora que ya conocemos como funciona y como se utiliza el acelerómetro, podemos empezar a trastear con los ejercicios que te voy a indicar.

El scketch que puedes ver a continuación es el del acelerómetro completo. En cada sección particular comentaré el código para que solo puedas ver el eje en cuestión.

acelerómetro de 3 ejes

Medida de Eje X.
En este sketch vamos a comprobar unicamente la salida del eje X, pero antes te mostraré el esquema de conexión del circuito completo.

ensamblado del circuito

Partiendo del código anterior para que nos muestre solo la salida del eje X, tendremos que modificar el sketch anterior y a partir de la 25 hasta la línea 29, poner un comentario como se ve en pantalla:

comentario en varias líneas

Así que cuando cargues el sketch y desplaces la placa o el sensor acelerómetro en su eje X (recuerda que el eje X se da entre los extremos laterales del chip del MMA7361), verás un valor numérico de acuerdo a la posicion de la placa.

Medída del eje Y.
Para comprobar la medida del eje Y, seguimos con el mismo comentario de líneas, pero ahora tienes que sustituir la variable xVal por la variable yVal en la línea 30, para ver la medida del eje Y. Con eso te dará la medida del eje Y.

Medida del Eje Z.
Para terminar, el eje Z se puede ver cambiándo el valor de la variable yVal por el zVal. Así representarás el eje Z que recuerda, es el eje que sube o baja y mide la caida libre y aceleración.

Explicándo el código.

Antes de nada este circuito es capaz de funcionar con 5V, sin embargo internamente funciona con 3.3V lo cual utilizaremos como referencia para el convertidor Análogico - digital. Esto nos permitirá tener mayor precisión a la hora de leer.

Empezamos incluyendo la libreria math.h para nuestro proyecto. Esta librería nos ayudará a la hora de calcular los ángulos de los ejes para poder establecer unas referencias del sensor MMA7361.

declaración de variables y librerías

Necesitamos almacenar las variables de los valores de los ejes. Para eso utilizamos los valores del tipo integer y las variables xVal, yVal y zVal. También necesitamos almacenar los valores de los ángulos que se obtendrán con el eje XZ y el eje YZ, por lo que usamos un par de variables del tipo double (ya que utilizaremos más tarde funciones de la libreria matemática), llamadas angleXZ y angleYZ. Y como vamos a sacar todos los datos por el puerto serial, establecemos la comunicación en el setup(). También en este proceso, estableceremos la función de referencia de tensión con analogReferences(EXTERNAL), con lo cual indicaremos a la placa que la tensión de alimentación para los puertos analógicos será la que proporcione el pin AREF de la placa Arduino UNO.

setup

Ahora en el loop empieza lo bueno. Aquí tenemos que leer los valores que nos devuelven los diferentes ejes, pero el problema es que sin una referencia de posicionamiento, la lectura de los ejes es impredicible, y si no utilizaras la función map, no sabrias si el eje X está en la zona negativa o en la zona positiva, al igual que ocurriría con el eje Y, ya que el convertidor analógico - digital utiliza los valores de 0 a 1023.

La función map() nos permite que nuestro rango varíe entre valores positivos y negativos.

Así que, lo primero que hacemos es asignar los puertos analógicos a las variables respectivas y después asignar el valor de dichas variables a la función map específica.

funcion map sirve para establecer rango positivo y negativo

A continuación, establecemos los valores para calcular el ángulo de los ejes XZ e YZ. Son unas sencillas fórmulas trigonométricas que nos permiten calcular dichos ángulos. Y por eso hemos importado la librería math.h, ya que sino no hubiesemos sido capaz de implementar el cálculo. Observa como anotación especial, que el ángulo dado está en grados centígrados ya que se multiplica el valor de la operación de los ángulos por el valor de un radian.

cálculo del ángulo de los ejes

Para terminar representamos los datos en el monitor serie mediante las instrucciones Serial.

representación de los datos

Como puedes ver ahora la representación de los ángulos y los valores del acelerómetro están mas definidos que al principio y ya puedes utilizarlos para crear otras aplicaciones como por ejemplo si lo conectases a un módulo bluetooth para contar los pasos que dieras, por ejemplo.

proyecto final

Bueno, en la sección de vídeo podrás ver el proceso y la creación del sketch. En el menu inferior de ésta página podrás descargarte el .ino de los archivos y acelerómetro. Gracias por tu visita y espero volver a verte.

Saludos.