You can use this Universal Infrared Receiver (UIR) project to control your
PC:
All at the touch of a button - with your TV remote control in fact!
Baud Rate | 57600 Baud |
Clock | Internal 8Mhz |
Remove Control type | Any (Point any control at it and let the PC software learn its codes). |
Note: Some remote controls need
two key presses (if you press the same key) as they output an inverted key
sequence for a repeated key. If you press a different key then it works as a
normal remote.
|
|
Compiler | Mikrolectronika MikroC Free! |
Target | 16F88 (retargetable to other PICs that have a built in USART). |
Software level | Easy. |
Software notes | No special notes. |
Hardware level | Easy. |
Hardware notes | No special notes. |
Project version | 1.01 |
Project files | Enter your details to get the Download Link and get the microcontroller newsletter: (Note: Your email is safe it will never
be sold or rented). |
This project uses a standard Infrared detector module (one of those 3 pin
devices) as the main input.
It's not worth making your own circuit up as
it will not match the performance of a three pin demodulator module.
I had a go using some circuits I found on the web and but these use a PIN diode
and a high impedance amplifier e.g. LM3140 - but the circuits are actually
light meters and saturate when a light shines on them (even desk lamp) - so
they become insensitive to the IR light - the PIN diode reacts to any light
source. You can get some use out of them up to about six feet but a lot of
engineering has gone into the three pin modules so it really is worth using
them and they are very cheap.
Inside the module is a PIN diode, AGC circuit, band pass filter, control logic
and output detector. The datasheet specifies use from 15m (45ft) up to
possibly 30m (90ft) max!. These are very good detectors that are also
insensitive to sunlight (has a physical filter over the PIN diode and the
electronic bandpass filter).
Both of these are very cheap and useful. You can learn more about usb adaptors in the link.
This project took longer than it should have and I have ended up with a far smaller source code than my initial attempts! First off I used the capture facility in the CCP and the Timer1 timer to accurately measure each period of high and low decoded IR. This turned out to be too accurate!
You don't need accuracy in this project - IR codes are designed not to need accurate measurement and if you attempt it slight variations in the edge positions or measuring accuracy cause the output numbers to change. Since the decoder software in the PC relies on a repeatable data stream (with slight variation) this method does not work.
IR signals are designed so that you can sample them but this requires that you know the code sequence (or encoding e.g. RC5) in advance so that you can time from the start sequence to the exact middle of a bit position.
Since this project allows you to use any remote control unit, the encoding sequence can not be known in advance, so the the solution is to sample the remote control sequence at a high frequency.
The problem is that if you start decoding from the first rising edge then errors accumulate due to slight variations in the remote control output (or the sampling edge occurs at the same time as an input transition) causing a random data stream output which can not reliably be decoded by the PC software.
The solution is to sample the input data starting from each rising and falling edge where a bit measurement period counter (period counter) is reset. At each sample point (here it is about 50us) the period counter is incremented. This gives a number that represents the period of each high or low part of the signal.
The 50us sample period is about ten times the expected signal period (IR codes generally use 500us minimum period) so this gives a good period measurement.
Note that the period counter is 8 bits long so that for long input sequences (high or low) the counter wraps around - this does not matter since the period counter will always produce the same value for the same input sequence and this is what the PC decoder software is looking for.
At every signal transition the period counter value is sent to the RS232
interface so the value represents the number of 50us periods in the previous
frame. The value sent is a raw binary number and you can not view it on a
terminal such as Tera Term as you won't get a readable value.
To stop the sequence from generating RS232 data forever the counter value is
monitored until it goes above 200. If at the same time the value of the input
is zero then output stops and control is returned to waiting for the next
interrupt i.e. the next remote control key press.
Note: The internal USART takes about 30us to
set up and it then goes off and transmits the byte by itself which at 57600
baud takes about 170us so there is plenty of time before the next transmission
(500us IR code period). You could use a lower baud rate e.g 38400 which would
still fit.
If you used a baud rate such as 9600 then a byte would take ~1ms to transmit
which would mean lost period data - it probably works as you would still get an
indication of code periods but may not always work.
The main infrared control program that runs on the PC is WinLIRC which allows control of the
PC via a serial port input (or a USB digital serial port).
I have tested the
infrared receiver and PC Remote Control with the following remotes:
These all worked fine - some you have to press the button twice as the code alternated for the same key. It expect it to work with just about any remote control as these represent a wide range of differing encoding schemes.
The universal infrared receiver uses an IR decoder module (Note that there is no standard pinout and you have to check your version's pinout using its data sheet).
There is nothing difficult about the circuit and it just consists of a PIC micro, an ICSP interface and an RS232 level translator.
The software is contained in two files:
Infrared Receiver Source Files
16F88-infrared-decoder.c
bit.h
bit.h contains compiler independent bit manipulation macros.
Infrared Receiver Project Files
16F88_Infrared_decoder.mcppi
Infrared Receiver Output files:
16F88_Infrared_decoder.hex
For a tutorial on compiling these files click here.
You can recompile the serial Infrared receiver files to examine the operation of the code (using the built in simulator) or change the source code. The hex file is contained within the download.
You can program the PIC in circuit through the ICSP connector.
The only use for main( ) is to initialize the ports and interrupts - it then
enters an infinite loop waiting for an interrupt.
Input pin RB0 is used as an interrupt source and then polled. An interrupt
for RB0 is setup to trigger when a rising edge occurs (probably should be
falling edge as the decoded output is inverted - but it works as is!)
When the interrupt occurs the routine sample_bits is called - Note this is
within the interrupt so sample_bits becomes part of the interrupt routine
itself.
sample_bits() takes control and polls the RB0 input as described previously.
It also returns control to the interrupt routine at an appropriate point;
waiting for the next remote control key press.
Jump from PIC Infrared Receiver to
Best Microcontroller Projects Home Page.
With the ADXL345 acellerometer you can detect up to 16g! You can also find out how to use it for tap detection and more.
HMC5883L - How make a digital compass, Find out the differences between the HMC5883L and the QMC5883L and whether they are compatible.
Easily use an ESP8266 with the Arduino IDE and program your first sketch into the ESP8266
The MCP4725 chip is a 12 bit DAC with memory that outputs voltage that you can use for many dfferent purposes. Find out what they are in this page.
PCF8591: A four input ADC with single DAC. How good is this 8 bit ADC, and should you use it in your next project?
Arduino Nano ISP: How to program an ATmega328P using an Arduino Nano as the ISP programmmer. One common problem: Programming a sketch into the chip without a reset control - solved here.
New! Comments
Have your say about what you just read! Leave me a comment in the box below.