Descripsion.
Se procede con el diseƱo de dos sistemas electronicos, transmisor y receptor IR.
El sistema electrico transmisor envia datos hexadecimales (codificado en protocolo NEC y modulado a una frecuencia de 38kHz) mediante un led emizor de luz infrarroja, la codificacion como la modulacion y la transmision realiza el MCU PIC16F628A.
Receptor recibe la seƱal infrarroja, demudula (CHQ1838) y decodifica (PIC16F628A), ejecuta alguna accion dependiendo del dato que le envio el transmisor (emisor).
Se controla el encendido, apagado de un bombillo, la intensidad de un led por PWM, y muchas otras funciones que podrian ser aƱadidas dependiendo de la necesidad.
Materiales. 
  • 2 PIC16F628A
  • 1 Diodo emisor IR (infrarrojo)
  • 1 Receptor infrarrojo-CHQ1838
  • 3 pulsadores N/A (normalmente abierto)
  • 2 leds del color que se disponga 
  • 3 resistencias 220--- 470 ohm.
  • 2 resistencias 10k ohm.
  • 1 relay de 5 voltios DC/220 AC (opsional)
  • cables de conexcion.
  • Fuentes de 5 Voltios.
  • Pogramador de PICs.
Desarrollo.
Protocolo NEC.
El protocolo NEC utiliza la codificaciĆ³n de distancia de pulso de los bits. Cada pulso es una rĆ”faga portadora de 38kHz de 560 Āµs de longitud (aproximadamente 21 ciclos). Un "1" lĆ³gico tarda 2.25ms en transmitir, mientras que un "0" lĆ³gico es solo la mitad de eso, siendo 1.125ms. Al finalizar la transmisiĆ³n del dato se envĆ­a una seƱal junto al ultimo bit.
Esta seƱal no es mas que una oscilaciĆ³n de PWM a 50% por un tiempo de 560us.
Se muentra un tren de pulso tĆ­pico del protocolo NEC. Con este protocolo, el LSB se transmite primero. En este caso se transmite la direcciĆ³n $ 59 y el comando $ 16. Una rĆ”faga AGC de 9 ms inicia la transmicion, esta rĆ”faga de AGC es seguida por un espacio de 4.5 ms, que luego es seguido por la direcciĆ³n y el comando.
PIC16F628A
Dispone de dos puertos RA, RB. Cuenta con un oscilador interno, por lo cual no es necesario disponer de un cristal externo para su funcionamiento.
Transmisor TX.
Pines asignados (PIC16F628A).
Por el RB3 se envia la seƱal.
RB0, RB1,RB2 reciben la seƱal de los pulsadores 
GeneraciĆ³n de PWM y Codificacion Protocolo NEC
El calculo de la frecuencia como tambien el ancho de pulso se realiza mediante la siguiente ecuacion.

Con el modulo CCP1 (de 8 bits) del MCU es con la que se genera la seƱal PWM, (f=38.46kHz) con el cual se modulan los datos a transmitir, se sigue el siguiente algoritmo.
  1. Se detecta un pulso bajo por una de sus entradas.
  2. Empieza la transmision de un dato.
  3. SeƱal start, PWM 50% ciclo de trabajo t= 9ms y PWM 0%  t=4.5ms.
  4. 1 PWM 50% t=560us y PWM 0% t=1.69ms
  5. 0 PWM 50% t=560us y PWM 0% t=560us
  6. SeƱal final, PWM 50% t=560us.
Diagrama Circuital.
Para reducir el harware, se recurre a las resistencias pull up del MCU.
Estas son activadas por software en los pines configurados como entradas, que en las cuales estƔn conectadas los pulsadores.
Se debe aƱadir un capacitor de 100nF en paralelo a la fuente de alimentacion, esto con el objetivo de eliminar ruidos que pueden afectar en el funcionamiento del circuito.

Codigo en PIC C Compiler (ccs).
/*Control por IR Transmisor Protocolo NEC
 *Universidad: UMSS (FCYT)
 *Carrera: Ing. Electronica
 *Autor : Univ. Puente C. Javier (JaviP)
 *Fecha: 1-1-2020
*/
#include <16F628A.h>
#fuses NOWDT,INTRC_IO,NOCPD,NOPROTECT,MCLR,PUT,NOBROWNOUT//Fusibles configuraciĆ³n
#use delay(clock=4M)// oscilador interno a 4MHz
#use fast_io(b)  // 
const int32 A=0x20DF10AA,B=0x20DF11AB,C=0x20DF12AC;//Datos
void irTx(int32 code);//Funcion codificador NEC
void main(){ // Funcion principal
   set_tris_b(0xF7);
   port_b_pullups(true);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1,25,1);
   set_pwm1_duty(0);
    while(true) {
       if(input(pin_b0)==0){
         irTx(A);
         delay_ms(200);
       }
       if(input(pin_b1)==0){
         irTx(B);
         delay_ms(200);
       }
       if(input(pin_b2)==0){
          irTx(C);
          delay_ms(200);
       }
      }
    }
void irTx(int32 code){
   unsigned char i = 0;
   disable_interrupts(GLOBAL); 
   // bit de inicio
   set_pwm1_duty(13);
   delay_us(9000);
   set_pwm1_duty(0);
   delay_us(4500);

   while (i < 32) {//Transmision bit a bit
      #bit ultbit = code.31
      if (ultbit) {    // Tx 1
         set_pwm1_duty(13);
         delay_us(560);
         set_pwm1_duty(0);
         delay_us(1690);   
      }
      else {// Tx0
         set_pwm1_duty(13);
         delay_us(560);   
         set_pwm1_duty(0);
         delay_us(560);   
      }
      
      code <<= 1;
      i++;
   }
   set_pwm1_duty(13);
   delay_us(560);   
   set_pwm1_duty(0);
   enable_interrupts(GLOBAL);
}


Receptor RX.
Pines asignados (PIC16F628A)
RB0, pin por el cual se recibe la seƱal demodulada.
Por RB3, se controla la intensidad de un led y por RB4 el encendido, apagado de un led (o un bombillo de AC).
Demodulacion y Decodificacion.
La seƱal IR es demodulada por el sensor (CHQ1838) (tambien puede utilzar otros modelos), despues se procede con la decodificacion.
La seƱal es decodificada mediante interrupcion externa en flaco de bajada, ya que el pin out del sensor IR estara en alto mientras no reciva una seƱal valida, y con esto se invierte la seƱal.
para detectar si es un 0 , 1 o bit de inicio se calcula el tiempo con el TMR0 de un blanco de bajada a otro flanco de bajada de la seƱal, en la siguiente imagen se muestran los valores calculados para identificar si el bit es 0 o 1.
Para mas precision en la de codificacion se elige un rago al rededor de los valores ya calculados
Generacion PWM 10kHz.
Con esta seƱal se controla la intensidad de un led o tambien podria ser la velocidad de un motor, volumen de un equipo de sonido, etc.
Como se ya se explico anteriormente la genercion de PWM con CCP1, se muestran los calculos a continuacion.




Diagrama Circuital.
al pin RB4 podrĆ­a conectarse un modulo rele para controlar una carga ac, como tambien al RB3 un transistor de potencia para controlar velocidad de un motor DC.

!Al momento de de trabajar con corriente alterna de la red se debe tomar las medidas adecuadas, si es menor de edad es mejor que cuente con la ayuda de un tutor o alguien responsable¡ 

Se debe aƱadir un capacitor de 100nF en paralelo a la fuente de alimentacion, esto con el objetivo de eliminar ruidos que pueden afectar en el funcionamiento del circuito. 

Codigo en PIC C Compiler (ccs).
/*Control por IR Receptor Protocolo NEC
 *Universidad: UMSS (FCYT)
 *Carrera: Ing. Electronica
 *Autor : Univ. Puente C. Javier (JaviP)
 *Fecha: 1-01-2020
*/
#include<16f628a.h>
#fuses NOWDT,INTRC_IO,NOCPD,NOPROTECT,MCLR,PUT,NOBROWNOUT
#use delay(clock=4M)
#use fast_io(b)
int8 T=0,n=0,valor=0;
int1 BS=0,c=0;
int32 code=0;
#int_ext
void RB0(){ 
T=get_timer0();
set_timer0(0);
if(BS==1){
      //BIT 1
      if(T>=30&& T<=45){
         code=code|0x00000001;
         if(n<31){
         code<<=1;
         }
         n++;
      }else{
      //BIT 0
      if(T>=12 && T<=26){
        code=code|0x00000000;
             if(n<31){
             code<<=1;
             }
             n++; 
       }
      }
      if(n==32){
        BS=0;
        c=1;
      }
    
  }else{
   if(T>=206 && T<=216){
        BS=1;
        n=0;
       }
  } 
}
void main(){
 set_tris_b(0x01);
 port_b_pullups(1);
 output_low(pin_b4);
 setup_timer_0(T0_INTERNAL|T0_DIV_64);
 set_timer0(0);
 setup_timer_2(T2_DIV_BY_1,99,1);
 setup_ccp1(CCP_PWM);
 set_pwm1_duty(0);
 ext_int_edge(H_TO_L);
 enable_interrupts(INT_EXT);
 enable_interrupts(GLOBAL);
 while(true){
   if(c){
     if(code==0x20DF10AA){
       output_toggle(pin_b4);
       code=0;
     }
     if(code==0x20DF11AB){
       if(valor<100){
       valor=valor+5;
       }
       set_pwm1_duty(valor);
       code=0;
     }
     if(code==0x20DF12AC){
       if(valor>0){
        valor=valor-5;
       }
       set_pwm1_duty(valor);
       code=0;
     }
     c=0;
     code=0;
    }  
 }

}
Video.
Video explicativo.


Descargas. 
Descarga de archivos simulados (proteus 8.8), codigo en .c .hex


Opsion 1


Opsion 2