jueves, 7 de mayo de 2015

MSP430: ADXL335 + MSP430FR5739

Este capítulo usaremos la placa de desarrollo MSP430-EXP430FR5739 de la empresa Texas Instruments. Dicha placa de desarrollo contiene el microcontrolador MSP430FR5739 cuya novedad es la memoria interna, ya que es del tipo FRAM.

La memoria o tecnología FRAM presenta ciertas ventajas a la inmunidad al ruido y a la escritura en memoria. Pero no debemos asustarnos, los periféricos se trabajan de forma similar a cualquier microcontrolador de la familia MSP430.

El hecho de emplear esta placa, es que trae incorporado ciertos sensores que pueden ser útiles en nuestros proyectos personales, en este caso, el ejemplo que traemos consistirá obtener lecturas del dispositivo externo ADXL335 ( acelerómetro de tres ejes ) y la enviaremos por la UART para que pueda ser representado los tres ejes en una interfaz gráfica.

Y para hacerlo más vistoso, dicha comunicación serie será a través de un par de módulos XBee de forma inalámbrica.


Pero antes pasar al firmware, vamos a explicar brevemente, como manipular los datos leídos procedentes del dispositivo externo ADXL335. Y creo que merece la pena pararse en este punto ya que el acelerómetro ADXL335, nos entrega las aceleraciones siguientes: Eje X, Eje Y y Eje Z, en valor analógico.

Teniendo en cuenta la hoja de características del dispositivo ADXL335, en el apartado de especificaciones, tenemos los siguientes datos de interés:

· Sensibilidad ( Sensitivity ): Este es un dato muy importante ya que nos indica la sensibilidad del sensor y, está relacionada con el valor de alimentación del dispositivo. En la hoja de características del dispositivo ADXL335, nos encontramos la siguiente tabla:

SENSITIVITY
Parameter
Conditions
Min
Typ
Max
Unit
Sensitivity at XOUT, YOUT, ZOUT
( Each Axis ) VS = 3 V
270
300
330
mV/g


Donde podemos interpretar que para los tres ejes, la sensibilidad cuando el sensor está alimentado a 3 V, es de 300 mV/g ( valor nominal ).


· NOTA: ¡Ojo!, el valor está dado en mV.



· Valor 0 g: Cuando medimos aceleraciones, es normal representarlas en la unidad g, y por supuesto, es imprescindible saber, cuando no hay aceleración ( 0 g ). Fijándonos en la hoja de características del dispositivo, nos encontramos con la siguiente tabla:

ZERO g BIAS LEVEL
Parameter
Conditions
Min
Typ
Max
Unit
0 g Voltage at XOUT, YOUT
VS = 3 V
1.35
1.5
1.65
V
g Voltage at ZOUT
VS = 3 V
1.2
1.5
1.8
V


Es fácil reconocer que no tendremos aceleraciones cuando el valor de salida analógico del dispositivo ADXL335 sea la mitad del valor de su alimentación. En el ejemplo que encontramos en la hoja de característica, nos dice que el valor de alimentación es de 3 V, por lo tanto, no tendremos aceleración cuando:

· 0 g ≡  VS/2 = 3/2 = 1.5 V


Y bueno, existen más datos, pero con estos, ya tenemos los suficientes para realizar lecturas de aceleración procedentes del dispositivo ADXL335. Ahora la siguiente cuestión a resolver, sería la siguiente:

· Cuando realizo una lectura del dispositivo ADXL335, dicha lectura están en Voltios, ¿cómo las represento en las unidades de aceleración g?


Bien, la expresión matemática que deberemos usar es la siguiente:


· [ ValorLeídoADC - VADXL335/2 ]/Sensivity


Donde:

· ValorLeídoADCEs el valor obtenido de cada eje por nuestro microcontrolador
· VADXL335/2Es el valor 0 g
· SensivityParámetro de sensibilidad del dispositivo ADXL335


Muy bien, ¿pero como se usa esa expresión? Pongamos un par de ejemplos prácticos, supongamos que nuestro microcontrolador posee un módulo ADC de 10-bits y su expresión es la siguiente:


· N = 1023·[ ( Vin - VR- )/( VR+ - VR- ) ]


Donde:

· NValor digital obtenido por el módulo ADC de nuestro microcontrolador.
· VinValor analógico correspondiente al valor digital leído.
· VR-Valor de referencia R-
· VR+Valor de referencia R+


Por lo tanto, el valor que nos interesa es Vin, despejamos para obtenerlo:

· Vin = VR- + N·( VR+ - VR- )/1023


Ahora si, vamos con el primer ejemplo: [ Ejemplo 1 ] Supongamos que realizamos una lectura del Eje X del dispositivo ADXL335 con nuestro microcontrolador mediante el módulo ADC 10-bits, obteniendo un resultado de 511.

Teniendo en cuenta que el acelerómetro está alimentado a 3 V, y el valor de referencia positivo es de 3 V y el negativo es de 0 V, obtener la aceleración del Eje X en unidad g.


Realizamos una recopilación de datos:

· N=511.
· VADXL335=3 V.
· VR-=0 V
· VR+=3 V

Lo primero que debemos obtener, es el valor leído en Voltios:

· Vin = VR- + N·( VR+ - VR- )/1023 = 0 + 511·( 3 - 0 )/1023 ≈ 1.498534 ≈ 1.5 V

El otro dato que necesitamos en la sensibilidad que debemos aplicar, como ya se ha explicado, dicho parámetro depende del valor de alimentación del acelerómetro ADXL335, en este ejemplo, está alimentado a 3 V, por lo tanto, el valor de sensibilidad será de 300 mV ( valor nominal ).

Así que ya disponemos de todos los valores necesarios para obtener el valor de aceleración del Eje X, sustituimos valores en la expresión:


· Aceleración Eje X: [ ValorLeídoADC - VADXL335/2 ]/Sensivity = [ 1.5 - 3/2 ]/( 300·10-3 ) = 0 g.


Por lo tanto, la aceleración del Eje X leído es de 0 g.



Ejemplo 2 ] Supongamos que realizamos una lectura del Eje Z del dispositivo ADXL335 con nuestro microcontrolador mediante el módulo ADC 10-bits, obteniendo un resultado de 735.

Teniendo en cuenta que el acelerómetro está alimentado a 3.6 V, y el valor de referencia positivo es de 3 V y el negativo es de 0 V, obtener la aceleración del Eje Z en unidad g.


Realizamos una recopilación de datos:

· N=735.
· VADXL335=3.6 V.
· VR-=0 V
· VR+=3 V

Lo primero que debemos obtener, es el valor leído en Voltios:

· Vin = VR- + N·( VR+ - VR- )/1023 = 0 + 735·( 3 - 0 )/1023 ≈ 2.155425 ≈ 2.16 V

El otro dato que necesitamos en la sensibilidad que debemos aplicar, como ya se ha explicado, dicho parámetro depende del valor de alimentación del acelerómetro ADXL335, en este ejemplo, está alimentado a 3.6 V, por lo tanto, el valor de sensibilidad será de 360 mV ( valor nominal ).

Así que ya disponemos de todos los valores necesarios para obtener el valor de aceleración del Eje Z, sustituimos valores en la expresión:


· Aceleración Eje Z: [ ValorLeídoADC - VADXL335/2 ]/Sensivity = [ 2.16 - 3.6/2 ]/( 360·10-3 ) ≈ 1 g.


Por lo tanto, la aceleración del Eje Z leído es de g.



Y bien, hasta aquí la parte teórica, vamos con la parte práctica. Nuestro firmware consistirá en que un microcontrolador con un módulo ADC 10-bits obtenga lecturas de los tres ejes procedentes del acelerómetro ADXL335 y los mande por la UART para que pueda ser representado por pantalla de forma gráfica.


El material que vamos a necesitar y su función, es la que se muestra a continuación:

· MSP430 Launchpad FRAM: Evidentemente, nuestra placa de desarrollo con el microcontrolador MSP430FR5739 y el dispositivo externo ADXL335.

· Módulos XBee: Un par de ellos, en este caso, el módulo XBee es el modelo: XB24-ZB.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con independencia del sistema operativo, solo es necesario tener instalada la máquina virtual de JAVA con al menos, la versión 7 Update 45 o superior. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware..


El código del programa principal, es el siguiente:

/**
* @file       main.c
* @author     Manuel Caballero
* @date       27/4/2015
* @brief      Archivo principal.
* \copyright
*      AqueronteBlog@gmail.com
*
* Este archivo es propiedad intelectual del blog Aqueronte,
* cuya direccion web, es la siguiente:
*
*     http://unbarquero.blogspot.com/
*
* Se permite cualquier modificacion del archivo siempre y cuando
* se mantenga la autoria del autor.
*/

#include < msp430.h >
#include < stdint.h >
#include "variables.h"
#include "funciones.h"
#include "interrupciones.h"



/**
 *  \brief    void main( void )
 *  \details  Vamos a trabajar con la placa de desarrollo MSP-EXP430FR5739 y los
 *            periféricos disponibles externos e internos.
 *
 *            Este programa consiste en realizar una lectura de datos del sensor externo
 *            ADXL335 ( acelerómetro de 3 ejes ), aproximadamente 0.1 segundos ( 10 Hz ).
 *
 *            Una vez obtenidos los datos, se envían al ordenador por medio de un par de
 *            dispositivos XBee usando la UART. El resto del tiempo, el MCU permanecerá
 *            en estado bajo consumo LPM3.
 *
 *
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      27/4/2015
 *  \pre       Se utilizarán un par de módulos XBee XB24-ZB ( uno Coordinator y el otro End Device )
 *             a 115200 Baudios.
 *  \pre       El software de ordenador utilizado es el llamado UART1_SW, proporcionado con todos los
 *             archivos necesarios del éste proyecto.
 *  \pre       Code Composer Studio, Version: 6.0.1.00104.
 *  \pre       C Compiler, MSP430 GCC GNU v4.9.1.
 */
void main( void )
{
   conf_WDT    ();           // Configura WDT del sistema
   conf_CLK    ();           // Configura CLK del sistema
   conf_IO     ();           // Configura Entradas/Salidas
   conf_ADC10  ();           // Configura ADC10
   conf_UART   ();           // Configura UART
   conf_TA0    ();           // Configura Timer A0


   __enable_interrupt();     // Interrupciones ON.


   while(1)
   {
      LPM3;
      // __nop();            // Solo para DEBUG
   }
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:

MSP430FR5739: ADXL335+ LEDs
Compilador IARCompilador MSPGCC
CC
MSP430FR5739: ADXL335+ LEDs
MSP430FR5739: ADXL335+ LEDs
MSP430FR5739: ADXL335+ LEDs
MSP430FR5739: ADXL335+ LEDs


Podéis encontrar el código completo en nuestro repositorio GitHub:

·AqueronteBlog GitHub.


· NOTA 1: En caso de ejecutar el software UART.jar y no inicializarse, es debido a que las librerías no están instaladas debidamente. El software utiliza librerías externas como por ejemplo, para el manejo del puerto serie, dicha librería debe instalarse a mano. En el siguiente enlace hay una breve guía de como hacerlo: Instalar librerías RXTX.

0 comentarios: