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.
Antes que nada, hay que tener claro el funcionamiento en la transmisión y recepción por infrarojos. Por un lado, el transmisor genera dos señales, la señal de control, que es la que lleva la información que será interpretada por el pic receptor, y la portadora, con una frecuencia fija y mucho más alta que hace la función de “canal de la transmisión”. El receptor de infrarojos solo captará las señales con la frecuencia de la portadora.
En este proyecto se ha empleado como receptor IR un TSOP 1138, que capta las señales de 38KHz, por lo tanto, la frecuencia de la portadora emitida por el emisor debe ser de ese valor.
pulsa en la imagen para ampliarla
Por tanto, para la emisión por infrarojos se van a emplear varias señales con diferentes frecuencias. Por un lado 3 señales de 200Hz, 100Hz y 60Hz generadas por el PIC en función del pulsador accionado. Por otro lado la señal de 38KHz que será la portadora de la señal de control, generada por un NE555.
En el receptor, el detector TSOP1138 demodula la señal eliminando la portadora y recuperando la señal de control que será interpretada por el pic receptor.
El pic mide el ancho del semiperiodo alto de la señal de control recibida y en función de ese valor ejecutará la acción que le corresponda, en este caso encender un led concreto.
Para generar la señal de control por el pic emisor, la variable “frecuencia” se carga con un valor concreto en función del pulsador accionado y por tanto de la frecuencia que se quiere generar. Cada vez que se produce un rebose del timer0 se ejecuta el bucle por la interrupción de rebose. En ese bucle se establece el estado en el que debe estar la salida que ofrece la generación de la señal.
control_senal++;
if (control_senal<frecuencia) Bit_PWM=1;
if (control_senal>frecuencia) Bit_PWM=0;
if (control_senal>=(2*frecuencia)) control_senal=0;
Generada la señal de control, esta se modula con la portadora, es decir, cada semiperiodo en estado alto de la señal de control se transformará en un tren de impulsos de 38KHz de una duracion correspondiente al semiperiodo.
#bit Bit_PWM = PORTB.0 //Bit 0 puerto B Salida señal de control
/********************** Prototipos de las funciones ***************************/
void main (void); //función principal
void generacion_senales (void); //genera señales moduladas
/************** Variables para generación señales control *********************/
int8 control_senal;
int8 frecuencia; //Valor de la frecuencia de la señal de control
/******************************************************************************/
/******************* FUNCIÓN GENERACIÓN SEÑALES CONTROL ***********************/
#int_Timer0
void generacion_senales(){
control_senal++;
//Estado alto de las señales generadas
if (control_senal<frecuencia) Bit_PWM=1;
//Estado bajo de las señales generadas
if (control_senal>frecuencia) Bit_PWM=0;
//Inicio del ciclo de las señales generadas
if (control_senal>=(2*frecuencia)) control_senal=0;
//Carga del contador
set_timer0(200);
}
/******************************************************************************/
/******************** FUNCIÓN PRINCIPAL ***************************************/
enable_interrupts(INT_TIMER0); //Habilitación interrup. generación señales
enable_interrupts(GLOBAL); //Habilitación de las interrupciones
while (true){
set_tris_b (0x01); //Deshabilita salida señal hasta saber frecuencia
if (!input(PIN_A0)){ //Si actua pulsador verde...
set_tris_b (0x00); //...se habilita la salida de señal...
frecuencia=5; //...con una frecuencia de 200Hz(semiperiodo 2,5 ms)
delay_ms(100);
}
if (!input(PIN_A1)){ //Si actua pulsador amarillo...
set_tris_b (0x00); //...se habilita la salida de señal...
frecuencia=10; //...con una frecuencia de 100Hz(semiperiodo 5 ms)
delay_ms(100);
}
if (!input(PIN_A2)){ //Si actua pulsador rojo...
set_tris_b (0x00); //...se habilita la salida de señal...
frecuencia=17; //...con una frecuencia de 60Hz(semiperiodo 8 ms)
delay_ms(100);
}
}
}
Ahora el receptor debe captar esta señal. El receptor infrarojos aquí empleado dispone internamente de un filtro pasabanda de 38KHz, es decir, solo leerá las señales a esa frecuencia de ahí el haber empleado una portadora con ese valor. Por tanto, esos trenes de impulsos los transformará en pulsos completos con lo que se obtiene la señal de control generada en el emisor.
Obtenida la señal, el pic receptor debe ahora interpretarla. Para ello vamos a medir el tiempo del semiperiodo en estado alto de la señal de control mediente el módulo CCP.
if(cambio==0){
TFS=CCP_2;
setup_ccp2(CCP_CAPTURE_FE); cambio=1
}
else {
TFB=CCP_2;
setup_ccp2(CCP_CAPTURE_RE); cambio=0;
if(nuevopulso==0)
nuevopulso=1;
}
if(nuevopulso==1){
TF=(TFB-TFS);
semiperiodo=TF/1000;
nuevopulso=0;
}
Y una vez obtenido el valor, se compara con los valores esperados para decidir la actuación a ejecutar
if (semiperiodo<3&&semiperiodo>1) verde=verde+1
if (verde>6) portb=0x01;
if (semiperiodo<6&&semiperiodo>3) amarillo=amarillo+1;
/********************** Prototipos de las funciones ***************************/
void main (void); //función principal
void ccp2_int(void); //captura de la señal de control
/******************** Variables para captura de señal *************************/
int1 nuevopulso=0; //Entra otro pulso para lectura
int16 TFB=0,TFS=0,TF=0; //Tiempo flancos
float semiperiodo=0.0; //Valor semiperiodo de la señal de control
int1 cambio=0; //Control flanco subida o bajada del impulso leido
int pulsado, pulsado2, rojo, verde, amarillo;
/******************************************************************************/
/********************* FUNCIÓN LECTURA SEÑAL DE CONTROL ***********************/
#int_ccp2 //LLamada por interrupción flanco en RC2
void ccp2_int(){
if(cambio==0){ //Si es flanco de subida...
TFS=CCP_2; //Carga en valor flanco subida valor registro ccpr1
setup_ccp2(CCP_CAPTURE_FE); //Configuración modo captura flanco de bajada
cambio=1; //Próximo flanco debe ser de bajada
}
else { //Si es flanco de bajada...
TFB=CCP_2; //Carga valor flanco bajada valor registro ccpr2
setup_ccp2(CCP_CAPTURE_RE); //Configuración modo captura en flanco subida
cambio=0; //Próximo flanco debe ser de subida
if(nuevopulso==0) //¿Fin de pulso?
nuevopulso=1; //Pulso finalizado.
}
if(nuevopulso==1){ //Finalizado el pulso leido se calcula su valor.
TF=(TFB-TFS); //Valor entre flanco de subida y bajada.
semiperiodo=TF/1000; //Valor semiperiodo leido en ms
nuevopulso=0; //Listo para recibir nuevo semiperiodo
if (semiperiodo<3&&semiperiodo>1) verde=verde+1; //Si semiperiodo entre 1 y 3 ms...
if (verde>6) portb=0x01; //...se asegura con 6 ciclos y enciende led verde
if (semiperiodo<6&&semiperiodo>3) amarillo=amarillo+1; //Si semiperiodo entre 3 y 6 ms...
if (amarillo>6) portb=0x02; //...se asegura con 6 ciclos y enciende led amarillo
if (semiperiodo<9&&semiperiodo>6) rojo=rojo+1; //Si semiperiodo entre 6 y 9 ms...
if (rojo>6) portb=0x04; //...se asegura con 6 ciclos y enciende led rojo
}
pulsado=pulsado+1; //Controla que se esta recibiendo señal
}
/******************************************************************************/
/*************************** FUNCIÓN PRINCIPAL ********************************/
void main(){
trisb=0x00; //Puerto B todo salidas
trisc=0b00000100; //Puerto C definición de entradas y salidas
setup_ccp2(CCP_CAPTURE_RE); //Configuración modo captura en flanco de subida
enable_interrupts(INT_CCP2); //habilitación interrupción modo comparación
enable_interrupts (GLOBAL);
while (1){
delay_ms(50);
if (pulsado>pulsado2) pulsado=pulsado2; //Detecta que se producen pulsos...
else {
portb=0x00; //...sino apaga todos los led
verde=amarillo=rojo=0;
}
}
}
Todos los archivos se pueden descargar en este enlace:
Chabier he tratado de armar el circuito, pero podrias explicar por que has utilizado un condensador electrolitico de 0.0018uf y si se puede cambiar por otro. Te dejo mi correo: alexanderlibra@hotmail.com.
Hola Deyvis. Para la emisión-recepción de los infrarrojos necesitas una frecuencia portadora de 38KHz. Esos 38 KHz se obtienen mediante los valores de R11, R12 y C1 mediante esta expresión:
38.000 Hz = 1,44 / ((R11 + 2R12)*C1)
Si cambias el valor de C1 debes cambiar los valores de las resistencias de forma que el resultado te siga saliendo 38000
Hola Chabier. De nuevo tengo una nueva duda, como calcular la potencia total del circuito de manera teorica para dar con los calculos, que formulas y metodos deberia aplicar. Te dejo mi correo: alexanderlibra@hotmail.com.
Disculpa amigo una duda soy nuevo en lo de los pics, una estas usando PIC C u otro y que código exactamente estas mandando con cada pulsador quiero enviar yo una señal parecida pero donde se mande una cadena continua y infinita 10101010101010101010101 que tendría que hacer para estos agradezco tu apoyo a y veo que en el circuito emisor en la parte del ne555 el código lo introduces al ne555 por la pata 4 reset como funciona esta parte garcías.
Disculpa me queda otra duda el oscilador ne555 que usas en el emisor esta configurado a un 50% duty o funciona con cualquier porcentaje es deci 30% dyty 40%, 60% en treo otros o es necesario que sea aun 50% gracias.
Con el ne555 se crea una señal de 38Khz. Son los que se necesitan para que el receptor capte la señal del emisor. Con el PIC se le dice al ne555 cuando enviar estos 38Khz. Según la frecuencia con la que se envie el receptor sabe que pulsador se ha activado.
La señal de 38Khz debe ser cuadrada. Las señales generadas por el PIC pueden ser las que tu quieras pero teniendo en cuenta que el receptor debe saber interpretarlas. Una señal 01010101 entiendo que es una señal cuadrada sin más.
Christ. De esta forma, durante los semiperiodos altos de la señal generada por el PIC el 555 generará la señal de 38KHz. En los semiperiodos en estado bajo el 555 mantendrá la señal también en estado bajo.
15 comentarios:
Chabier he tratado de armar el circuito, pero podrias explicar por que has utilizado un condensador electrolitico de 0.0018uf y si se puede cambiar por otro.
Te dejo mi correo: alexanderlibra@hotmail.com.
Hola Deyvis.
Para la emisión-recepción de los infrarrojos necesitas una frecuencia portadora de 38KHz. Esos 38 KHz se obtienen mediante los valores de R11, R12 y C1 mediante esta expresión:
38.000 Hz = 1,44 / ((R11 + 2R12)*C1)
Si cambias el valor de C1 debes cambiar los valores de las resistencias de forma que el resultado te siga saliendo 38000
Hola Chabier.
De nuevo tengo una nueva duda, como calcular la potencia total del circuito de manera teorica para dar con los calculos, que formulas y metodos deberia aplicar.
Te dejo mi correo: alexanderlibra@hotmail.com.
Se podra montar para pic16f628a
Si. Al final del artículo tienes el enlace de descarga de los archivos.
COMO OBTENGO LAS LIBRERIAS DE TSOP 1138 Y E TSL6200
Yelsin. No se necesitan librerías, solo el código mostrado.
Disculpa amigo una duda soy nuevo en lo de los pics, una estas usando PIC C u otro y que código exactamente estas mandando con cada pulsador quiero enviar yo una señal parecida pero donde se mande una cadena continua y infinita 10101010101010101010101 que tendría que hacer para estos agradezco tu apoyo a y veo que en el circuito emisor en la parte del ne555 el código lo introduces al ne555 por la pata 4 reset como funciona esta parte garcías.
Disculpa me queda otra duda el oscilador ne555 que usas en el emisor esta configurado a un 50% duty o funciona con cualquier porcentaje es deci 30% dyty 40%, 60% en treo otros o es necesario que sea aun 50% gracias.
Con el ne555 se crea una señal de 38Khz. Son los que se necesitan para que el receptor capte la señal del emisor. Con el PIC se le dice al ne555 cuando enviar estos 38Khz. Según la frecuencia con la que se envie el receptor sabe que pulsador se ha activado.
Disculpa entonces no importa si la onda de salida del ne555 no es cuadra y disculpa como podría sacar un código de 010101010 infinita.
La señal de 38Khz debe ser cuadrada. Las señales generadas por el PIC pueden ser las que tu quieras pero teniendo en cuenta que el receptor debe saber interpretarlas.
Una señal 01010101 entiendo que es una señal cuadrada sin más.
Hola amigo, disculpa en la parte de emisor porque colocas la salida RB0 hacia el reset del 555 ?
saludos
Christ. De esta forma, durante los semiperiodos altos de la señal generada por el PIC el 555 generará la señal de 38KHz. En los semiperiodos en estado bajo el 555 mantendrá la señal también en estado bajo.
Hello,
I can't download code of this tutorial, could you please resolve this problem ?
Publicar un comentario