Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

Práctica 12 con Miuva. Sensor acelerómetro con RS232 con PIC C

En esta práctica utilizaremos lo que hicimos tanto para hacer la comunicación RS232 con un dispositivo móvil como el protocolo I2C para leer el valor de un acelerómetro.

Vamos a leer los tres ejes del acelerómetro (xy y z) y lo enviaremos para mostrarlo en nuestro dispositivo, para de esta forma saber la posición en la que se encuentra el sensor de forma remota.

El primer paso será crear prototipos de funciones para cada acción:

void acel_init();     //Función para inicializar el acelerómetro
void escritura_acel(unsigned int registro, unsigned int dato);     //Función para escribir con I2C
int leer_x();         //Función para leer el eje x
int leer_y();         //Función para leer el eje y
int leer_z();         //Función para leer el eje z

En cada una de esas funciones tendremos que definir los registros o el proceso a realizar, de forma similar a la práctica del acelerómetro, para que de esta forma nuestro programa principal termine más legible, en él lo que realizaremos, será la configuración de los puertos de entrada y salida, llamar las funciones creadas previamente y el envío por RS232 de la información recibida del acelerómetro.

Quedándonos el siguiente código:

Código para PIC C:

#include<18f4550.h>
#fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL2, CPUDIV1, VREGEN
#use delay (clock=48M)
#use I2C(MASTER, SCL=PIN_A1, SDA=PIN_A2)
#use RS232(BAUD = 9600, BITS = 8, PARITY = N, XMIT = PIN_C6, RCV = PIN_C7)
void acel_init();    //Función para inicializar el acelerómetro
void escritura_acel(unsigned int registro, unsigned int dato); //Función para escribir en I2C
int leer_x();        //Función para leer eje x
int leer_y();        //Función para leer eje y
int leer_z();        //Función para leer eje z
signed int eje_x, eje_y, eje_z;  //Variables para almacenar el valor de los ejes
void main(){         //Función principal
   set_tris_b(0b00000000); //Configurar como salidas
   acel_init();            //Inicializar acelerómetro
   while(true){
      eje_x = leer_x(); //Lee eje X
      eje_y = leer_y(); //Lee eje Y
      eje_z = leer_z(); //Lee eje Z
      printf("nx %2d, y %2d, z %2d", eje_x,eje_y,eje_z);   //Envia los tres ejes
      delay_ms(200); //Espera 200ms para actualizar los datos
   }
}
void acel_init(){
//Inicialización del módulo del acelerómetro
   escritura_acel(0x0B, 0x01); 
   escritura_acel(0x2A, 0x20);
   escritura_acel(0x2B, 0x19);
   escritura_acel(0x2C, 0x02);
   escritura_acel(0x2D, 0x01);
   escritura_acel(0x2E, 0x01);
   escritura_acel(0x2A, 0x21);
}
void escritura_acel(unsigned int registro, unsigned int dato){
   i2c_start();
   i2c_write(0x3A);
   i2c_write(registro);
   i2c_write(dato);
   i2c_stop();
}
int leer_x(){
   int x;
   i2c_start();
   i2c_write(0x3A);
   i2c_write(0x01);  //Registro del eje x del acelerómetro
   i2c_start();
   i2c_write(0x3B);
   x = i2c_read(0);
   i2c_stop();
   return x;
}
int leer_y(){
   int y;
   i2c_start();
   i2c_write(0x3A);
   i2c_write(0x03);  //Registro del eje y del acelerómetro
   i2c_start();
   i2c_write(0x3B);
   y = i2c_read(0);
   i2c_stop();
   return y;
}
int leer_z(){
   int z;
   i2c_start();
   i2c_write(0x3A);
   i2c_write(0x05);  //Registro del eje z del acelerómetro
   i2c_start();
   i2c_write(0x3B);
   z = i2c_read(0);
   i2c_stop();
   return z;
}