PDA

View Full Version : Can this IR Xmitter/Rcvr be improved?



peterdeco1
- 19th August 2005, 11:52
Hello Everyone. I made a simple IR transmitter & receiver. The receiver uses a low cost 38 KHZ IR receiver module that outputs the demodulated pulses without any external components. It is DIGIKEY P#: PNA4602M-ND. It works perfectly & I'm able to get 3 channels to work. The problem is that it is slow in responding. It uses the count command to determine which channel is being received. Sometimes you have to wait about a full second for the LED to light. It does the count routine 2 times to eliminate false triggering from room light. Can someone improve on this in a SIMPLE way? Possibly send serial data? I never sent serial data before - I don't have a clue on how to do this. Any help would be appreciated. I need about 10 different channels to respond immediately like a TV remote control. Here is the program for the transmitter & receiver:

'INFRARED TRANSMITTER USING PIC12F629
CMCON = 7 'comparators off
trisio = %00000000 'sets ALL PORTS AS OUTPUTS
GPIO = 0 'ALL LOW
DEFINE OSCCAL_1K 1 ' Set OSCCAL for 1K device
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_ON, BOD_ON, PWRT_ON, PROTECT_ON
X VAR BYTE
LET X = 000

START:
High GPIO.4 'MULTIPLE HIGH & LOW COMMANDS SLOW SQUARE WAVE
High GPIO.4 'GETTING 38KHZ WITH THIS SUBROUTINE
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X > 33 Then IROFF 'this limits on time of square wave 100 = 3ms
GoTo START ' works with 3 channels 100=CH1 66=CH2 33=CH3

IROFF:
LET X = 000
Pause 5 'this is actual off time 20=CH1 10=CH2 5=CH3
GoTo START

'INFRARED RECEIVER USING PIC 12F629
CMCON = 7 'comparators off
trisio = %00001000 'GPIO INPUT FROM IR RCVR
DEFINE OSCCAL_1K 1 ' Set OSCCAL for 1K device
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_ON, BOD_ON, PWRT_ON, PROTECT_ON
X VAR BYTE

START:
Low GPIO.0 'LED OFF

MEASURE:
High GPIO.4 'ON RECEIVER
Count GPIO.3, 100, X 'demodulated pulses fed to GPIO.3
IF X >= 003 AND X <= 005 Then MEASURE1
IF X >= 007 AND X <= 009 Then MEASURE2
IF X >= 015 AND X <= 017 Then MEASURE3
GoTo START
'I added a 2nd count routine to eliminate false triggering

MEASURE1:
Pause 50
Count GPIO.3, 100, X
IF X >= 003 AND X <= 005 Then LEDON1
GoTo MEASURE

MEASURE2:
Pause 50
IF X >= 007 AND X <= 009 Then LEDON2
GoTo MEASURE

MEASURE3:
Pause 50
IF X >= 015 AND X <= 017 Then LEDON3
GoTo MEASURE

LEDON1:
LET X= 0
High GPIO.0 'LED ON
Pause 1000 'LED ON 1 SECOND
Low GPIO.0
GoTo START

LEDON2:
LET X= 0
High GPIO.0
Pause 2000 'LED ON 2 SECONDS
Low GPIO.0
GoTo START

LEDON3:
LET X= 0
High GPIO.0
Pause 3000 'LED ON 3 SECONDS
Low GPIO.0
GoTo START

peterdeco1
- 24th August 2005, 11:27
Hello Everyone. I made the improvements needed for multichannel operation and "instant on" I needed for my IR project. I'm posting it here if anyone is interested in IR remote control. I read documentation on how remote controls work and shortened the routine a bit (5 bit code instead of 8 bit). I know the code can be reduced even further by not repeating the commands 5 times for a 5 bit code but the program is still suprisingly short. The transmitter generates code bits which are LOW pulses in the IR receiver module that are either 1 or 2MS long by turning ON for this amount of time. The pulses received are made a 0 or 1. They are put into a variable from right to left. In this code I'm generating the number "23", transmitter pulses in MS are 2,2,2,1,2. Receiver variable will then be 1,0,1,1,1 = 23. Each operation begins with a 3MS start pulse to sync the receiver with the transmitter. The transmitter is running on 3V and the range is longer than my house. Here is the code. So far it works perfectly without any false activations using different "channels" (I call this channel 23). Any suggestions will be appreciated.

********IR Transmitter using 12F629*********
CMCON = 7 'comparators off
trisio = %11111111 'ALL INPUTS - HIGH & LOW COMMANDS CONVERT THEM TO OUTPUTS
DEFINE OSCCAL_1K 1 ' Set OSCCAL for 1K device
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_ON, BOD_ON, PWRT_ON, PROTECT_ON
X VAR BYTE

STARTBIT:
High GPIO.4 'GETTING 38KHZ WITH THIS SUBROUTINE
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X = X + 001
IF X < 99 Then STARTBIT '99 GIVES 3MS START PULSE
GoSub SEPARATETHEBITS

FIRSTCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then FIRSTCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS

SECONDCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then SECONDCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS

THIRDCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then THIRDCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS

FORTHCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 33 Then FORTHCODEBIT '1MS CODEBIT
GoSub SEPARATETHEBITS

FIFTHCODEBIT:
High GPIO.4
High GPIO.4
Low GPIO.4
Low GPIO.4
LET X= X + 001
IF X < 66 Then FIFTHCODEBIT '2MS CODEBIT
GoSub SEPARATETHEBITS
GoTo STARTBIT

SEPARATETHEBITS:
Pause 2
LET X = 0
Return

******************IR RECEIVER USING 12F629***************
CMCON = 7 'comparators off
trisio = %00001000 'RA3 INPUT FROM IR RCVR
GPIO = 0 'ALL OUTPUTS LOW
DEFINE OSCCAL_1K 1 ' Set OSCCAL for 1K device
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_ON, BOD_ON, PWRT_ON, PROTECT_ON
CODELENGTH VAR BYTE 'BYTE VARIABLE OK - LESS THAN 8 PULSES MEASURED
CODE VAR BYTE 'BYTE VARIABLE OK - LESS THAN 8 CODE BITS
X VAR BYTE
Clear 'RESET VARIABLES TO 0
High GPIO.4 'ON IR RECEIVER MODULE ATTACHED TO GP4
Pause 100 'SETTLE DOWN BOTH PIC & IR RECEIVER

STARTPULSE:
PulsIn GPIO.3,0,CODELENGTH 'MEASURE LOW PULSE (IR LED ON TIME)
IF CODELENGTH <200 Then STARTPULSE 'LOOKING FOR 3MS PULSE
IF CODELENGTH >400 Then STARTPULSE

CODEPULSES:
PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit0 = 1 '2MS PULSE IS 1
IF CODELENGTH < 150 Then LET CODE.bit0 = 0 '1MS PULSE IS 0

PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit1 = 1
IF CODELENGTH < 150 Then LET CODE.bit1 = 0

PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit2 = 1
IF CODELENGTH < 150 Then LET CODE.bit2 = 0

PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit3 = 1
IF CODELENGTH < 150 Then LET CODE.bit3 = 0

PulsIn GPIO.3,0,CODELENGTH
IF CODELENGTH > 150 Then LET CODE.bit4 = 1
IF CODELENGTH < 150 Then LET CODE.bit4 = 0

IF CODE = 23 Then LEDON
Clear
GoTo STARTPULSE

LEDON:
High GPIO.0 'LED ON
Pause 500
Low GPIO.0
GoTo STARTPULSE