SEGUIDOR DE LINEAS PIC 16F877A Un robot seguidor de lineas esta conformado por tres partes fundamentales: 1º Los Lo s ojos: observar la linea, que se haría obteniendo el contraste con traste negro que produce la linea con respecto al entorno blanco, utilizando una serie de sensores infrarrojos. 2º El cerebro, este va a decidir que camino tomar según los datos que le suministren los ojos, en este apartado se utiliza un pic para decidir el rumbo: derecha, izquierda, adelante, atrás y las estrategias de corrección para no perder la linea. 3º Los pies: la tracción el movimiento: dos ruedas dan el movimiento que dependiendo de las decisiones que tome el cerebro giraran a la misma velocidad, o creara una diferencia entre ambas para dar un giro en un sentido u otro. El software necesario para la programación del cerebro y la simulación electrónica es PIC-C para la programación e ISIS PROFESSIONAL para la simulación electrónica. Ahora hablemos del apartado que corresponde a la programación que es el mas importante en este robot: el cerebro, PIC 16F877A.
Control de puertos: El pic posee 5 puertos de entrada salida I/O son A,B,C,D,E. cada puerto tiene tiene 8 pines que se numeran de 0 a 7. Su configuración para decidir qué pines serán salidas o entradas se hace mediante la funcion SET_TRIS_X(HEX) donde X sera el puerto que se quiere configurar y HEX un numero hexadecimal de la forma 0x YZ , Y: numero hexadecimal de rango 0 a F, controla los pines 7,6,5,4. Z: numero hexadecimal de rango 0 a F, controla los pines 3,2,1,0.
Binario 0: Salida. Binario 1: Entrada.
PINES
7 6 5 4
HEX
decimal
8 4 2 1 (0 a F)
BINARIO 0 0 0 0
0x0Z
BINARIO 1 1 1 1
0xFZ
BINARIO 0 1 0 1
0x5Z
PINES
3 2 1 0
HEX
decimal
8 4 2 1 (0 a F)
BINARIO 0 0 0 0
0x Y0
BINARIO 1 1 1 1
0x YF
BINARIO 1 0 1 0
0x Y A
Ejemplos: SET_TRIS_B(0x50); pines entrada (6,4), pines salida (7,5,3,2,1,0). SET_TRIS_B(0x77); pines entrada (6,5,4,2,1,0), pines salida (7,3).
La otra forma de controlar los puertos es utilizando la correspondencia binaria en el parámetro de entrada en la función SET_TRIS_X(Binary) en el binary el orden de los pines es de forma descendente de izquierda a derecha del pin 7 al pin 0.
Ejemplo: set_tris_a(0b00011111); entrada(4,3,2,1,0).
//pines
de
salida
(7,6,5),
pines
de
Control de PIN: Entrada: para obtener el estado lógico (0-1) de un pin de entrada por cada ciclo de programa se utiliza la función INPUT(PIN_XN), X:para el puerto, N: para el pin (0-7). Ejemplo: while ( !input(PIN_B1) ); Salida: para llevar el estado lógico (0-1) a un pin de salida existen varias funciones que se pueden utilizar: 1. OUTPUT_BIT(PIN_XN,ESTADO): X:puerto, N:pin, ESTADO: el estado lógico (0-1) que se desea sacar por el pin de salida. 2. OUTPUT_HIGH(PIN_XN): X:puerto, N:pin, esta funcion lleva la salida del pin automaticamente a 1 logico. 3. OUTPUT_LOW(PIN_XN): X:puerto, N:pin, esta funcion lleva la salida del pin automaticamente a 0 logico.
Control de PWM: En este pic los pines de salida del PWM están en el puerto c específicamente en los pines PIN_C2 que corresponde al PWM1 y el PIN_C1 que corresponde al PWM2. Para obtener una señal particular en cualquiera de los PWM se debe calcular el periodo del pic, el periodo del PWM con la frecuencia deseada, y asi calcular el PR2 necesario para configurar la señal de salida del PWM. El PWM está asociado al TIMER2. Ejemplo: si se quiere como salida una frecuencia de 20khz con un ciclo de servicio o trabajo del 50% entonces se hacen los cálculos siguientes: Periodo del PWM = 1/20khz = 50us Periodo del pic = 1/20Mhz = 50ns PR2 = (periodo PWM/(4*periodo PIC*Prescaler))-1 PR2 = (50us/(4*50ns*1))-1=249
Teniendo esta información podemos configurar el PWM por código.
setup_ccp1(ccp_PWM); //activa el pin_c2 como salida PWM, antes activar el pin como salida. setup_timer_2(prescaler,PR2,postscaler); setup_timer_2(t2_div_By_1,249,1); // Ahora debemos calcular el tamaño del DUTY (ciclo de servicio) que aumentara o disminuira el tiempo de señal alta por cada ciclo, como se muestra en la figura: DUTY= t alta, Un led con poca iluminación.
Un led con mucha iluminación
DUTY = Periodo PWM * ciclo de servicio(porcentaje) / periodo PIC * Prescaler DUTY = 50us*0.5/(50ns*1) = 500 (al 50%) set_pwm_duty(500);
Habiendo conocido la teoría necesaria para comprender las partes necesarias para la programación ahora veremos el código en pic-c.
Simulacion en isis
Cargando el codigo en isis, usando el .hex generado por picc abriendo las propiedades del pic.