sábado, 2 de marzo de 2013

Ejemplos MMB. Acelerómetro SPI + Bluetooth UART.

Siguiendo con la entrada anterior, en la que os mostré como configurar el módulo SPI del PIC32 para enviar y recibir datos del acelerómetro, lo siguiente que nos quedaba era utilizar esos datos de aceleraciones que hemos recibido para algo. Lo más sencillo, y que además nos servirá para depurar un poco la aplicación, será mostrar por la pantalla de la MMB. Para ello, utilizamos la libreria LCDTerminal.h, y el código seria el siguiente:
sprintf(s,"Eje X:\t 0d \n", (AccX));
LCDPutString( s);
sprintf(s,"Eje Y:\t 0d \n", AccY);
LCDPutString( s);
sprintf(s,"Eje Z:\t 0d \n", AccZ);
LCDPutString( s);
Como veis el código es extremadamente sencillo, y el resultado es bastante bueno, aunque podemos hacer cosas más interesantes.
Una vez desarrollada la aplicación, y mostradas las aceleraciones en los 3 ejes en la pantalla, se me ocurre que lo siguiente que podríamos hacer, es enviar esos datos al PC, y procesarlos desde un programa en VB.NET.
Para ello lo primer que debemos hacer es convertir los datos que nos devuelven las funciones de lectura del acelerómetro, ya que como os comenté, nos puede devolver tanto valores positivos como negativos, además de un valor que numéricamente no significa nada, ya que el valor que leemos va desde –260 cuando la aceleración es –g, y 260 cuando la aceleración es +g. Estos valores los podemos convertir en un valor que vaya, por ejemplo desde 0 a 180, de forma que nos devuelva el ángulo que tenemos girada la placa en cada dirección. para ello, debemos realizar las siguientes operaciones:
AccX_tx= (AccX + 260) / 2.88;
AccY_tx= (AccY + 260) / 2.88;
AccZ_tx= (AccZ + 260) / 2.88;
Sumándole un offset para obtener valores solo positivos, y multiplicándolo por una ganancia, obtenemos los valores que queremos. Lo siguiente es enviar estos 3 valores, que ahora nos caben en un byte, por el puerto serie del PIC32. Configurar el puerto UART es muy sencillo, y lo hacemos de la siguiente forma. Lo primero nos creamos una definiciones generales que nos pueden servir para cualquier puerto UART de nuestro PIC.
// definiciones RS232
#define BAUDRATE 9600
#define BRGDATA (GetPeripheralClock()/4/BAUDRATE-1)
#define U_ENABLE 0x8008 // enable,BREGH=1, 1 stop, no parity
#define U_TX 0x1400 // enable tx & rx, clear all flags
Para luego configurar el puerto que queramos de forma más sencilla.
//CONFIGURAMOS EL MODULO USART
U2MODE = U_ENABLE; // initialize the UART module
U2STA = U_TX; // enable the Transmitter and Receiver
U2BRG = BRGDATA;
Una vez configurado, solo nos queda enviar los datos, pero para que el PIC no esté enviando los datos de forma continua, lo que hacemos es esperar a recibir un carácter, por ejemplo la ‘e’, desde el PC, y entonces el PIC32 le responde con los 3 valores de los ángulos
if( U2STAbits.URXDA){ //esperamos que llegue un dato nuevo
  if(U2RXREG == 'e'){
      LD2 = !LD2;
      U2TXREG = AccX_tx;
       while(!U2STAbits.TRMT);  //esperamos a que se envíe el dato
       U2TXREG = AccY_tx;
       while(!U2STAbits.TRMT);  //esperamos a que se envíe el dato
       U2TXREG = AccZ_tx;
       while(!U2STAbits.TRMT);  //esperamos a que se envíe el dato
       }
}
En este momento, ya tenemos los datos en el PC, y lo que queda es procesarlos. Buscándo por internet encontré un aplicación que es bastante llamativa. Se trata de un programa en visual basic, que dibuja un cubo 3d en el formulario, y este cubo va girando de forma automática en sus 3 ángulos. El programa lo encontré en la página CodeNTronix. Si a este código lo añadimos en primer lugar la comunicación UART, mediante un objeto SerialPort, le añadimos un Timer que mande al microcontrolador cada 100ms la letra ‘e’, un par de botones que nos permitan conectar y desconectar la placa, y le pasamos los datos que recibimos a los ángulos del cubo, nos podría quedar algo bonito… y así fué! este es el resultado.
Espero que os haya resultado interesante!! en breve subiré todos los archivos para que os lo podáis descargar.

No hay comentarios:

Publicar un comentario