Conectar un Emisor Infrarrojo.

Buenos días desde México.
El motivo de este tema es preguntar acerca de cómo conectar un emisor infrarrojo.
Estoy trabando en un proyecto en el cuál se recibe una señal por medio de un receptor IR, el microcontrolador lo decodifica y luego guarda la señal.
Posteriormente al apretar un botón esta señal es nuevamente emitida pero ahora por un emisor IR conectada al PIC.

Bueno, el problema no radica allí sino que he visto algunas páginas en donde ponen el IR conectado de la siguiente manera.

1. Una resistencia de 47k a la base de un transistor 2N2222A.
2. El emisor del transistor a tierra.
3. Una resistencia de 100 entre la fuente y el colector del transistor seguida del IR.

Les comento que yo solo conecto el IR a una resistencia de 220 a la salida del puerto B del PIC.

Me podrían decir por qué algunas personas hacen ese arreglo.

Nota.: Estoy usando el PIC16f877a con un oscilador de 4MHz.
La señal creo que si se manda con la configuración que hago. porque al apretar el botón, el LED prende (suplante por un momento en IR por un LED normal para asegurarme de que si encendiera).

Espero su ayuda.
Gracias.
 
Me podrían decir por qué algunas personas hacen ese arreglo.
para aumentar la distancia entre emisor y receptor.

en pocas palabras como se emite en forma pulsante, generalmente a 38KHz, el Led soporta mas corriente por eso ponen una resistencia de 100 Ohms, pero el pic como solo suministra como maximo 20mA , podria sufrir algun daño, y por eso utilizan un transistor.
 
Allí están los diagramas el 1 es el que proponen y el 2 es el que yo propongo.
Estoy de acuerdo en lo de la corriente. Sin embargo el PIC maneja 25mA. y mis cálculos me dan 15 mA. para el IR.
 

Adjuntos

  • 1.jpg
    1.jpg
    54.8 KB · Visitas: 10
  • 2.jpg
    2.jpg
    32.9 KB · Visitas: 5
Allí están los diagramas el 1 es el que proponen y el 2 es el que yo propongo.
Estoy de acuerdo en lo de la corriente. Sin embargo el PIC maneja 25mA. y mis cálculos me dan 15 mA. para el IR.

SI pero es esa la respuesta... es porque no quieren exponer a quemar el PIC, pero de ambas forma funciona... la tuya mas economica claro esta, pero no te confíes porque la sumas de las cargas puede llevar a una muerte inminente

saludos
 
yo me quedo con la duda dice que su IR tiene un If de 20mA pero el IfP puede ser mayor quizas de unos 200mA, si va utilizar segun entiendo como repetidor quizas es pulsante y si requiere de mayor distancia es mejor si pone el transistor, se entiende?

bueno... como sea.. :D
 
yo me quedo con la duda dice que su IR tiene un If de 20mA pero el IfP puede ser mayor quizas de unos 200mA, si va utilizar segun entiendo como repetidor quizas es pulsante y si requiere de mayor distancia es mejor si pone el transistor, se entiende?

bueno... como sea.. :D

Te entiendo, pero parece que tu tienes mas preguntas que el creador del topic dale tiempo :LOL:

:apreton:
 
Eso de que el transistor es para mayor corriente lo entiendo. Es que pensé que eso me afectaría en algo la frecuencia.
Es que ya tengo el programa para guardar la señal pero no me la reproduce.
Utilizo un IR de 276-640 .



Código:
__config _CP_OFF & _DEBUG_OFF & _PWRTE_ON & _CPD_OFF & _LVP_OFF & _WDT_OFF & _XT_OSC
		list 	p=16f877A
		include "P16F877A.inc"
		CBLOCK 0xA0
		HTIM01						;Primera variable
		HTIM02
		HTIM03
		HTIM04
		HTIM05
		HTIM06
		HTIM07
		HTIM08
		HTIM09
		HTIM10
		HTIM11
		HTIM12
		HTIM13
		HTIM14
		HTIM15
		HTIM16
		HTIM17
		HTIM18
		HTIM19
		HTIM20
		HTIM21
		HTIM22
		HTIM23
		HTIM24
		HTIM25
		HTIM26
		HTIM27
		HTIM28
		HTIM29
		HTIM30
		HTIM31
		HTIM32
		HTIM33
		HTIM34
		HTIM35
		HTIM36
		HTIM37
		HTIM38
		HTIM39
		HTIM40
		HTIM41
		HTIM42
		HTIM43
		HTIM44
		HTIM45
		HTIM46
		HTIM47
		HTIM48
		HTIM49
		HTIM50						;Ultima variable
		ENDC
		CBLOCK 0x20
		LTIM01						;Primera variable
		LTIM02
		LTIM03
		LTIM04
		LTIM05
		LTIM06
		LTIM07
		LTIM08
		LTIM09
		LTIM10
		LTIM11
		LTIM12
		LTIM13
		LTIM14
		LTIM15
		LTIM16
		LTIM17
		LTIM18
		LTIM19
		LTIM20
		LTIM21
		LTIM22
		LTIM23
		LTIM24
		LTIM25
		LTIM26
		LTIM27
		LTIM28
		LTIM29
		LTIM30
		LTIM31
		LTIM32
		LTIM33
		LTIM34
		LTIM35
		LTIM36
		LTIM37
		LTIM38
		LTIM39
		LTIM40
		LTIM41
		LTIM42
		LTIM43
		LTIM44
		LTIM45
		LTIM46
		LTIM47
		LTIM48
		LTIM49
		LTIM50						;Ultima variable
		REG_SAVEL					;Sabremos en que variable guardaremos el tiempo LOW
		REG_SAVEH					;Sabremos en que variable guardaremos el tiempo HIGH
		TIEMPO						;La usaremos para no alterar mucho el tiempo de la onda cuadrada
		R_ContA
		R_ContB
		ENDC
		#DEFINE	IR	PORTA,3			;Puerto del IR
		#DEFINE	BANCO0	bcf	STATUS,RP0
		#DEFINE BANCO1	bsf	STATUS,RP0
		#DEFINE	PLED	bsf	PORTB,6
		#DEFINE	BOTON	PORTA,2
		ORG 	0x01
		nop
		nop
		goto 	INICIO
		ORG		0x04
		goto	Serv_de_Interr							;Vector de interrupción

;****************El IR 
INICIO	
;		clrf	T2CON				;Detiene el TImer2, con un Prescaler = 1:1, Postscaler=1:1			**
;		clrf	TMR2				;Limpia el registro Timer2											**
;		clrf	INTCON				;Desactiva interrupciones											**
;		bsf		STATUS,RP0			;Banco 1															**
;		clrf	PIE1				;Desactiva las interrupciones perifericas							**
;		bcf		STATUS,RP0			;Banco 0															**
;		clrf	PIR1				;Limpia las banderas perifericas de interrupcion					**
;		movlw	0x72				;PostScaler	=	1:15, Presccaler = 1:16								**
;		movwf	T2CON				;Timer2 esta apagado												**
;		bsf		T2CON,TMR2ON		;Timer2 comienza a incrementar										**


		BANCO1						;Seleccionamos el banco 1		
		movlw	0x06				;Asignamos al PORTA
		movwf	ADCON1				;como digital
		clrf	TRISB				;Marcamos el PORTB como salida
		movlw	0xF0				;Marcamos el PORTC para teclado
		movwf	TRISC				;El nibble alto entrada y otro salida
		movlw	0x3F				;Marcamos PORTA como entrada
		movwf	TRISA
		movlw	0x08				;Desahabilitamos el preescaler del TMR0
		movwf	OPTION_REG			;asignandoselo al WatchDog
		BANCO0						;Cambiamos al banco 0
		clrf	PORTB				;Limpiamos el PORTB
		bsf		PORTB,0
		call	LIMPIARTIEMPOS		;Limpiamos los tiempos
		movlw	0x1F				;Primer registro de tiempo bajo
		movwf	REG_SAVEL			;El primero en que guardara, posteriormente se incrementara tiempo bajo
		movlw	0x9F				;Primer registro de tiempo alto
		movwf	REG_SAVEH			;El primero en que guardara, posteriormente se incrementara tiempo alto
		
SEÑAL	
		bsf		PORTB,0
		btfsc	IR					;Esperamos al que se reciba una señal, el IR trabaja con logica negativa
		goto	SEÑAL				;Sino ha recibidO esperamos nuevamente
		clrf	TMR0				;Limpiamos el timer 0
		goto	ACTIVARTIMER		;Empezamos a guardar la señal
ACTIVARTIMER
		movlw	0xA0				;Activamos las interrupciones
		movwf	INTCON				;en especifico la interrupcion del TMR0
GUARDAR
		call	CAMBIAR_VARIABLE	;Siguiente instruccion de tiempo
CAMBIO1	
		btfss	IR					;Esperamos a que cambie de señal
		goto	CAMBIO1				;Avanzara hasta que cambie a 1
		call	GUARDAR_TIEMPO		;Guardamos el tiempo en el registro actual
		call	CAMBIAR_VARIABLE	;Siguiente instruccion de tiempo
CAMBIO2	
		movf	REG_SAVEH,W
		BANCO1
		movwf	FSR
		btfsc	INDF,7
		goto	SEÑAL_LISTA
		BANCO0
		btfsc	IR					;Esperamos a que cambie de señal
		goto	CAMBIO2				;Avanzara hasta que cambie a 0
		call	GUARDAR_TIEMPO		;Guardamos el tiempo en el registro actual
		goto	GUARDAR				;Repetimos el proceso
;******************************************************
SEÑAL_LISTA
		BANCO0
		clrf	INTCON				;Desactivamos interrupciones
;Todo lo demas que se tenga que hacer**************
		PLED
P_BOTON
		btfss	BOTON
		goto	P_BOTON
		call	Retardo_20ms
		btfss	BOTON
		goto	P_BOTON
REPRODUCIR_SEÑAL
		movlw	0x1F
		movwf	REG_SAVEL
		movlw	0x9F
		movwf	REG_SAVEH
		movlw	0x00
		movwf	T1CON

		call	CAMBIAR_VARIABLE
		bsf		PORTB,3

			call	PONERTMR1

		bcf		PIR1,TMR1IF
		bsf		T1CON,TMR1ON

EMPIEREPRO
		call	CAMBIAR_VARIABLE
ESPERATER

		btfss	PIR1,TMR1IF
		goto	ESPERATER
		bcf		PORTB,3
		bcf		T1CON,TMR1ON
		
			call	PONERTMR1		
		bsf		T1CON,TMR1ON
		bcf		PIR1,TMR1IF

		call	CAMBIAR_VARIABLE

ESPERATER2
		btfss	PIR1,TMR1IF
		goto	ESPERATER2
		bsf		PORTB,3
		bcf		T1CON,TMR1ON
		
			call	PONERTMR1		
		bsf		T1CON,TMR1ON
		bcf		PIR1,TMR1IF

		movf	INDF,F
		btfss	STATUS,Z
		goto	EMPIEREPRO
		movf	REG_SAVEL,W
		movwf	FSR
		movf	INDF,F
		btfss	STATUS,Z
		goto	EMPIEREPRO
		bcf		PORTB,3
		goto	P_BOTON




;********************SUB RUTINAS********************
GUARDAR_TIEMPO
		clrf	INTCON				;Desactivamos interrupciones
		movf	TMR0,W				;Guardamos el tiempo en una variable
		movwf	TIEMPO				;temporalmente
		movlw	0x06				;Inicializamos el timer con el tiempo	
		movwf	TMR0				;6microS, debido a El tiempo de las instrucciones
		movf	REG_SAVEL,W			;Ubicamos el lugar en donde
		movwf	FSR					;guardaremos el tiempo bajo
		movf	TIEMPO,W
		movwf	INDF				;correspondiente
		movlw	0xA0				;Activamos las interrupciones
		movwf	INTCON				;en especifico la interrupcion del TMR0
		return
CAMBIAR_VARIABLE
		incf	REG_SAVEL,F			;Escoge el siguiente registro BAJO
		incf	REG_SAVEH,F			;Escoge el siguiente registro ALTO
		return
PONERTMR1
		movf	REG_SAVEL,W
		movwf	FSR
		movf	INDF,W
		movwf	TMR1L
		movf	REG_SAVEH,W
		BANCO1
		movwf	FSR
		movf	INDF,W
		BANCO0
		movwf	TMR1H
		comf	TMR1L,F
		comf	TMR1H,F
		bcf		STATUS,C
		movlw	0x16
		addwf	TMR1L,F
		btfsc	STATUS,C
		incf	TMR1H,F
		return

Retardo_20ms					; La llamada "call" aporta 2 ciclos máquina.
		movlw	d'20'				; Aporta 1 ciclo máquina. Este es el valor de "M".
		movwf	R_ContB				; Aporta 1 ciclo máquina.
R1ms_BucleExterno
		movlw	d'249'				; Aporta Mx1 ciclos máquina. Este es el valor de "K".
		movwf	R_ContA				; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
		nop							; Aporta KxMx1 ciclos máquina.
		decfsz	R_ContA,F			; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
		goto	R1ms_BucleInterno			; Aporta (K-1)xMx2 ciclos máquina.
		decfsz	R_ContB,F			; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
		goto	R1ms_BucleExterno 		; Aporta (M-1)x2 ciclos máquina.
		return				
;***************************Interrupciones********************************
Serv_de_Interr
;		btfsc	PIE1,TMR1IE			;No utilizo la F, por que puede que haya dos interrupciones a la vez
;		goto	TIMER1_INTER		;se sabe que no es posible, sin embargo cuando se hace una interrupcion
		btfsc	INTCON,TMR0IF		;la otra bandera podria ponerse a 1 y no me haria la interupciion que
		goto	TIMER_INTER			;yo quiero.
		retfie
TIMER_INTER
		btfsc	STATUS,RP0
		goto	P_BANCO1
		movf	REG_SAVEH,W
		BANCO1
		movwf	FSR
		incf	INDF,F
		BANCO0
		bcf		INTCON,TMR0IF
		retfie
P_BANCO1
		BANCO0
		movf	REG_SAVEH,W
		BANCO1
		movwf	FSR
		incf	INDF,F
		bcf		INTCON,TMR0IF
		retfie
LIMPIARTIEMPOS						;Limpiamos todas la variables de tiempo**************
;*****************************************************************************************Hay que modificarlo por el FSR
		clrf	LTIM01
		clrf	LTIM02
		clrf	LTIM03
		clrf	LTIM04
		clrf	LTIM05
		clrf	LTIM06
		clrf	LTIM07
		clrf	LTIM08
		clrf	LTIM09
		clrf	LTIM10
		clrf	LTIM11
		clrf	LTIM12
		clrf	LTIM13
		clrf	LTIM14
		clrf	LTIM15
		clrf	LTIM16
		clrf	LTIM17
		clrf	LTIM18
		clrf	LTIM19
		clrf	LTIM20
		clrf	LTIM21
		clrf	LTIM22
		clrf	LTIM23
		clrf	LTIM24
		clrf	LTIM25
		clrf	LTIM26
		clrf	LTIM27
		clrf	LTIM28
		clrf	LTIM29
		clrf	LTIM30
		clrf	LTIM31
		clrf	LTIM32
		clrf	LTIM33
		clrf	LTIM34
		clrf	LTIM35
		clrf	LTIM36
		clrf	LTIM37
		clrf	LTIM38
		clrf	LTIM39
		clrf	LTIM40
		clrf	LTIM41
		clrf	LTIM42
		clrf	LTIM43
		clrf	LTIM44
		clrf	LTIM45
		clrf	LTIM46
		clrf	LTIM47
		clrf	LTIM48
		clrf	LTIM49
		clrf	LTIM50
		BANCO1
		clrf	HTIM01
		clrf	HTIM02
		clrf	HTIM03
		clrf	HTIM04
		clrf	HTIM05
		clrf	HTIM06
		clrf	HTIM07
		clrf	HTIM08
		clrf	HTIM09
		clrf	HTIM10
		clrf	HTIM11
		clrf	HTIM12
		clrf	HTIM13
		clrf	HTIM14
		clrf	HTIM15
		clrf	HTIM16
		clrf	HTIM17
		clrf	HTIM18
		clrf	HTIM19
		clrf	HTIM20
		clrf	HTIM21
		clrf	HTIM22
		clrf	HTIM23
		clrf	HTIM24
		clrf	HTIM25
		clrf	HTIM26
		clrf	HTIM27
		clrf	HTIM28
		clrf	HTIM29
		clrf	HTIM30
		clrf	HTIM31
		clrf	HTIM32
		clrf	HTIM33
		clrf	HTIM34
		clrf	HTIM35
		clrf	HTIM36
		clrf	HTIM37
		clrf	HTIM38
		clrf	HTIM39
		clrf	HTIM40
		clrf	HTIM41
		clrf	HTIM42
		clrf	HTIM43
		clrf	HTIM44
		clrf	HTIM45
		clrf	HTIM46
		clrf	HTIM47
		clrf	HTIM48
		clrf	HTIM49
		clrf	HTIM50
		BANCO0
		return
 
Última edición por un moderador:
Es que pensé que eso me afectaría en algo la frecuencia.

no en la frecuencia no te afecta, a menos que a la frecuencia que emitas sea mas rapida que lo que el transistor pueda manejar, pero no creo que sea tu caso.

por lo del codigo no tengo ni la mas minima idea, yo solo manejo C y Basic :D



ya habia apagado mi compu pero me quede pensando.

debes explicar un poco mas en que consiste tu proyecto, porque yo adivinando, supondria que quieres hacer una especie de repetidor o un clonador de controles remoto de TV.

en esos tu recibes un 1 pero ese 1 se emite con una portadora de 38KHz y quizas por eso no te funciona.
pero solo estoy adivinando :D
 
Última edición:
Si es eso, pero creo que alli la frecuencia no me afecta, ya que copio el tiempo que estan en uno y luego el tiempo que esta en 0, por lo que ese mismo tiempo es que yo quiero que este en uno y luego e siguiente tiempo estara en 0.
 
pues ahi esta tu error, ese receptor ya te da un 1 sin la portadora de 38kHz

deberias de modificar tu codigo o utilizar un fototransistor de IR.

bpv11f_t.jpg


estas mezclando peras con manzanas :D
 
Última edición:
Si ya se que me da 1 al empezar, es por ello que si te fijas en los comentarios estoy trabando con lógica negativa.

De hecho lo compre pero no lo he utilizado. Probaré a ver si funciona.
 
no es que te de un 1 al empezar, sino que te lo manda de esta manera el control remoto:
trace_zoom.png


pero el receptor que estas usando te manda solo un 1 logico que es lo que tu mandas por el led infrarrojo pero el receptor del TV lo necesita con la portadora de 38khz
 
Solo una duda. Tengo entendido que cada control envía un pulso de unos cuantos milisegundos antes de enviar loa datos.
Mi duda es con respecto a si ese pulso igual esta a 38kHz o si ese es un pulso constante (no varia, siempre se mantiene en 1).
 
Atrás
Arriba