[Aporte] Comunicación IR PIC-PIC.

Buenos días!!

Pues bueno tal vez a muchos no les parezca un gran aporte pero para mi fue uno de los proyectos que tuve que leer mucho ya que no entendía el funcionamiento de este, sin embargo después de entenderlo pues ya te das cuenta de que no era tan difícil como parecía.

Ya tenia bastante tiempo queriéndolo postear pero me daba pena mi código ya que soy noob en esto todavía.

Esta demás decir que mucha ayuda e recibido de este foro y no e aportado nada!.

Trasmisión IR.

Se utiliza la Uart del PIC y el PWM para trasmitir por medio de IR, la modulación de la señal debe estar alrededor de 38khz para que el de modulador la entienda sin percibir ruido, por medio de la uart del PIC 16F628a y el PWM se combinan las dos señales para trasmitir un dato, el receptor ejecuta dependiendo el dato obtenido, en este ejemplo uso un 16F628a como transmisor y un 16F876a como receptor para manejar 5 salidas independientes.

Código emisor:
Código:
/**********************************************************
*                    SPECIAL PROJECTS                     *
*                       MARZO 2014                        *
*               LUIS ALBERTO ZAMORA LARA                  *
*                      Transmisor IR                         *
**********************************************************/
////////////////////////////////////////////////////////////////////////////////
// 1/40khz = 25us =.000025
// 1/8mhz = 125ns =.000000125
// PR2=((Periodo del PWM)/(4*Tosc*TMR2 Preescaler))-1*
// PR2= (25us/(4*125ns*1))-1 = 49
// CTPWM 50%= Periodo PWM / 2 = 12.5us
// CCPR1L:CCP1CON=(Ciclo de trabajo del PWM)/(Tosc*TMR2 Preescaler)*
// CCPR1L:CCP1CON = 12.5us/(125ns*1) = 100
////////////////////////////////////////////////////////////////////////////////
/*PR2= [(4MHz)/(38KHz)*(1)*(4)]-1 PR2=1000-1* <---bien importante no olvidarse del -PR2=999*/
//4000000/40000*1*4-1
//24

#include <16f628A.h>            //pic a utilizar


#fuses INTRC_IO,NOWDT,PROTECT,PUT,NOLVP,NOBROWNOUT,NOMCLR    //ordenes para el programador
#use delay(clock=4000000)   //Fosc=4Mhz
#byte PORTB = 06
#use rs232(baud=2400, bits=8, xmit=PIN_b2, rcv=PIN_b1,invert,force_sw) 


void main()
{
setup_timer_2(t2_div_By_1,25,1);
setup_ccp1(ccp_PWM);
set_pwm1_duty(100);//25
setup_comparator(NC_NC_NC_NC);

set_tris_b(0b00000110);
set_tris_a(0b00011111);
PORTB = 0x00;

while(true){
set_pwm1_duty(1);
  if(input(pin_a0)==1){
  delay_ms(200);
  printf("a");
  while(input(pin_a0)==1);
}


if(input(pin_a1)==1){
  delay_ms(200);
  printf("b");
   while(input(pin_a1)==1);
}

if(input(pin_a2)==1){
  delay_ms(200);
  printf("c");
   while(input(pin_a2)==1);
}
if(input(pin_a3)==1){
  delay_ms(200);
  printf("d");
  while(input(pin_a3)==1);
}
if(input(pin_a4)==1){
  delay_ms(200);
  printf("e");
  while(input(pin_a4)==1);
}
set_pwm1_duty(0);
}
}

Código del receptor
Código:
/*********************************************************************
** Special Projects
** Luis Alberto Zamora  Lara
** Ultima revisión
** Marzo-2014
*********************************************************************/

#include <16f876a.h>
#device adc=10
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#FUSES XT, NOPUT, PROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOWDT
#use delay(clock=4M)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)
#byte PORTA= 0x05
#byte PORTB= 0x06
#byte PORTC= 0x07

char caracter=0x00;
int1 hay_dato;
int estado,estado1,estado2,estado3,estado4;

#int_rda
void rda_isr()
{
caracter=getc();
hay_dato=1;
}

void main()
{
set_tris_b(0x00);
set_tris_a(0x00);
PORTB=(0x00);
PORTC=(0x00);
PORTA=(0x00);
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
hay_dato=0;
estado=0;
estado1=0;
estado2=0;
estado3=0;
estado4=0;

while(1){

if (hay_dato==1){
hay_dato=0;
switch(caracter){
       case 'a': 
       estado++;
       break;
       case 'b':
       estado1++;
       break;
       case 'c':
       estado2++;
       break;
       case 'd':
       estado3++;
       break;
       case 'e':
       estado4++;
       break;
}
}
if(estado==1){
   output_high(pin_b0);
}
if(estado1==1){
   output_high(pin_b1);
}
if(estado2==1){
   output_high(pin_b2);
}
if(estado3==1){
   output_high(pin_b3);
}
if(estado4==1){
   output_high(pin_b4);
}

/*Apagar leds */

if(estado==2){
   estado=0;
   output_low(pin_b0);
}
if(estado1==2){
   estado1=0;
   output_low(pin_b1);
}
if(estado2==2){
   estado2=0;
   output_low(pin_b2);
}
if(estado3==2){
   estado3=0;
   output_low(pin_b3);
}
if(estado4==2){
   estado4=0;
   output_low(pin_b4);
}

 }
}

Diagramas:
En los diagramas utilizo LED para simular pero se puede poner transistores para activar reley o alguna otra cosa.
El transmisor solo puede llevar un IR eso no afecta, su alcance es aprox. 3mts

Saludos!!
 

Adjuntos

  • Desktop.rar
    20.9 KB · Visitas: 68
Última edición:
Atrás
Arriba