RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.
El TPA81 es un sensor de temperatura sin contacto, controlado mediante bus I2C. Dispone de medida de temperatura ambiente y 8 píxeles alineados de medida a distancia. Junto con un servo controlado por el propio sensor y sus 32 posiciones es posible crear un mapa de temperaturas de 180º.
El TPA81 posee 10 registros, del 0 al 9.
oEscribir en el registro 0 supone , según su uso, cambiar la direcciónI2C del TPA81 o marcar la posición del servo asociado.
oEscribir en los registros 1, 2 y 3 supone recalibrar el sensor, lo cual no es aconsejable.
oEscribir en los registros del 4 al 9 no es posible.
oLeer el registro 0 devuelve la revisión del software del TPA81
oLeer el registro 1 nos proporciona la temperatura ambiente.
oLeer los registros 2 al 9 nos informa de las temperaturas correspondientes a los 8 pixeles.
En este proyecto se pretende mostrar a nivel práctico las principales opciones de funcionamiento de este sensor.
En el momento de conectar el circuito en la pantalla lcd aparece un mensaje de presentación y la versión del software del TPA81. Posteriormente ejecutará cuatro posibles opciones según el estado de las entradas A0 a A3. Con todas las entradas a 0 (todas las opciones activas), primero aparece la posición del servo, al cabo de 1 segundo, la temperatura ambiente, y un segundo más tarde, las temperaturas de los 8 píxeles. Cambia de posición el servo y se repite el ciclo para las otras 31 posiciones. Cuando alguna de las entradas no está activa, el proceso correspondiente no se realiza. Y cuando ninguna de las opciones está activa (las cuatro entradas a 1) la pantalla lcd muestra el mensaje de presentación.
El cableado se muestra en el esquema siguiente.
En los comentarios en el archivo fuente para el compiladorse intenta explicar el funcionamiento del programa.
////////////////////////////////////////////////////////////////////////////////
// //
// USO DEL SENSOR TPA81 CON PIC 16F876A Y CONTROL DEL SERVO ASOCIADO //
// //
// El programa muestra la temperatura ambiente y las temperaturas //
// de la matriz de pixeles para cada posición //
// del servo //
// //
// (c) RobotyPic 2010 //
// //
////////////////////////////////////////////////////////////////////////////////
#include <16F876A.h> //PIC a utilizar
#fuses XT,NOWDT,NOPROTECT //Protecciones
#use delay(clock=4000000) //Frecuencia cristal de cuarzo
#use i2c(master, SCL=PIN_C3, SDA=PIN_C4) //Configuración comunicación I2C #use standard_io(C)
#use standard_io(A)
#define use_portb_lcd TRUE //Configuración puerto b para lcd #include <lcd.c> //Archivo control lcd int TPA81_ID = 0xD0; //Dirección I2C de acceso al TPA81
int b[10]; //Buffer para datos lectura TPA81
int servo; //Posición del servo
int i; //Posiciones para Buffer de datos /******************************************************************************/
/******************** FUNCIÓN MENSAJE PRESENTACIÓN LCD ************************/
/***** Muestra mensaje de presentación y durante inactividad del proceso ******/ void mensaje_pres (){ printf(lcd_putc,"\fTPA81 y 16F876A");
printf(lcd_putc,"\n (c) RobotyPic ");
} /******************************************************************************/
/******************* FUNCIÓN DE LECTURA DEL SENSOR TPA81 **********************/
/*Carga valores de temperatura en el buffer b[]y revisión del software en b[0]*/ void lectura_tpa81( byte slaveID ) { for ( i=0; i<10; i++) { i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(slaveID); //...con la dirección del TPA81...
i2c_write(i); //...apuntando a la dirección (i) del registro
i2c_start(); //Reinicio
i2c_write(slaveID+1); //Cambio a función de lectura
b[i] = i2c_read(0); //Carga buffer b[] con datos leídos del TPA81
i2c_stop (); //Finalización de la transmisión
delay_ms(10);
}
} /******************************************************************************/
/********************** FUNCIÓN BARRIDO CON EL SERVO **************************/
/****************** Control de las posiciones del servo ***********************/ void servo_tpa81 ( byte slaveID, byte servo_pos ) { i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(slaveID); //...con la dirección del TPA81...
i2c_write(0); //...apuntando a la posición 0 del registro del TPA81
i2c_write(servo_pos&0x1F); //escribe posición del servo
i2c_stop (); //Finalización de la transmisión
} /******************************************************************************/
/************************ FUNCIÓN PRINCIPAL ***********************************/ void main() {
lcd_init(); //Inicialización lcd
mensaje_pres (); //Mensaje de bienvenida durante 2 seg.
delay_ms(2000); //Muestra en pantalla lcd versión del software TPA81 durante 2 seg.
lectura_tpa81( TPA81_ID ); //Lectura de temperaturas y versión software TPA81
printf(lcd_putc,"\f Firmware V.1.%u", b[0]);
delay_ms(2000);
servo=0; //Inicialización de la posición del servo while (1) {
//Con A0 a 0 se medirán temperaturas en diferentes posiciones del servo
if (!input(PIN_A0)){
if (servo==31) servo=0; //Reinicializa posición servo
servo = servo + 1; //Nueva posición del servo
servo_tpa81 ( TPA81_ID, servo ); //Cambio de posición del servo
}
//Con A1 a 0 se mostrará posición del servo durante 1 seg.
if (!input(PIN_A1)){
printf(lcd_putc,"\f Servo Pos. %u",servo); //Muestra posición servo 1 seg.
delay_ms(1000);
}
lectura_tpa81( TPA81_ID ); //Lectura de las temperaturas
//Con A2 a 0 muestra en pantalla tª ambiente durante 1 seg.
if (!input(PIN_A2)){
printf (lcd_putc,"\fT. ambiente %u C", b[1]);
delay_ms(1000);
}
//Con A3 a 0 muestra en pantalla tªs de los 8 pixeles durante 1 seg.
if (!input (PIN_A3)){
printf (lcd_putc,"\f%u %u %u %u\n", b[2], b[3], b[4], b[5]);
printf (lcd_putc,"%u %u %u %u", b[6], b[7], b[8], b[9]);
delay_ms(1000);
}
//Mientras no haya opción activada muestra mensaje de presentación en lcd
if (input_state(PIN_A0)){
if (input_state(PIN_A1)){
if (input_state(PIN_A2)){
if (input_state(PIN_A3)){
mensaje_pres();
}
}
}
}
}
}
Si se quiere reducir el numero de posiciones del servo en los 180º de giro, es decir, en lugar de 32que lo haga por ejemplo en 8, bastaría con sustituir la línea “servo=servo+1” por “servo=servo+4”. En función del incremento fijado se variará el numero de posiciones a lo largo de los 180º del giro.
En el siguiente video se muestra el funcionamiento del proyecto. En realidad, el sensor debería ir montado sobre el servo, pero para una observación más clara se optado por dejarlos por separado. En este caso están seleccionadas solo las opciones para mostrar las temperaturas de los pixeles conforme el servo cambia de posición.
Y en este otro con todas las opciones seleccionadas. En este caso el servo avanza lentamente para poder ver bien todo el proceso. Para acelerarlo bastaría con disminuir los tiempos de visualización en el lcd o disminuir el número de posiciones en los 180º del giro.
Descarga de los archivos del proyecto en este enlace:
No hay comentarios:
Publicar un comentario