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.
Consiste en un robot que detecta y sigue focos de calor. De igual manera, como foco de calor que es, es capaz de seguir el calor generado por el cuerpo humano.
Para conseguirlo se ha empleado un sensor térmico TPA81. Cómo se controla uno de estos sensores con un PIC se puede ver en el artículo anterior.
Los 8 píxeles del sensor estan distribuidos linealmente siguiendo un trazado horizontal. El servo es controlado por la señal que el propio sensor dispone para ello. Básicamente, el robot intenta que el píxel de mayor temperatura quede entre los dos centrales aumentando o disminuyendo el valor que marca la posición del servo. Cuando el servo llega a la posición extrema, el robot hace un giro de todo el cuerpo para seguir frente al foco de calor. De esta forma da la sensación de que el robot lo sigue.
En los comentarios del programa del PIC desarrollado bajo el compilador PCWHD de CCS se explica la función de las diferentes instrucciones.
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 DE LECTURA DEL SENSOR TPA81 **********************/
/*************** Carga valores de temperatura en el buffer b[] ****************/
void lectura_tpa81( byte slaveID ) {
for ( i=0; i<10; i++) { //Contador de posiciones del buffer b[]
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 CONTROL DEL SERVO ****************************/
/****************** Control de las posiciones del servo ***********************/
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() {
int media_izq; //El valor medio de b[2] b[3] y b[4]
int media_der; //El valor medio de b[7] b[8] y b[9]
int condicion; //Condición para girar sensor térmico
servo=16; //Posición 0º del servo
while (1) {
lectura_tpa81( TPA81_ID ); //Lectura de los valores de temperatura
condicion = ((b[1]+b[5]+b[6])/3);
//obtine la media de entre b[2], b[3], b[4] y Tª ambiente
media_izq=(b[1]+b[2]+b[3]+b[4])/4;
//obtiene la media de entre b[7], b[8], b[9] y Tª ambiente
media_der=((b[1]+b[7]+b[8]+b[9])/4);
//Comprueba si debe girar a la izquierda
if (media_izq > condicion){ //Si temp. a izquierda es mayor que central...
if (media_izq > media_der){ //...y además es mayor que la derecha...
servo=servo+1; //... entonces gira el servo una posición
if (servo>=30) { //Si servo llega al final de su giro...
servo=16; //...lo deja en 0º ...
servo_tpa81 ( TPA81_ID, servo );
delay_ms(50);
GIRO_IZQUIERDA; //... y gira el cuerpo a la izquierda
delay_ms(800);
PARO;
}
else servo_tpa81 ( TPA81_ID, servo ); //Sino sólo gira el servo
}
}
//Comprueba si debe girar a la derecha
if (media_der > condicion){ //Si temp. a derecha es mayor que central...
if (media_der > media_izq){
servo=servo-1; //... entonces gira el servo una posición
if (servo<=1){ //Si servo llega al final de su giro...
servo=16; //...lo deja en 0º ...
servo_tpa81 (TPA81_ID, servo);
delay_ms(50);
GIRO_DERECHA; //... y gira el cuerpo a la derecha
delay_ms(800);
PARO;
}
else servo_tpa81 ( TPA81_ID, servo ); //Sino sólo gira el servo
}
}
}
}
Pulsar en la imagen para ampliarla
Los archivos del proyecto se pueden descargar del siguiente enlace:
No hay comentarios:
Publicar un comentario