There are lots of projects and schematics floating around the web for encoding and decoding IR remote-control pulses. Many MPU-based ones use one of the built-in hardware timers for this, which is understandable since you can’t easily bit-bang your way out of a 13.158 µs time between switching flanks.
But I don’t want to be constrained to a specific pin, nor dedicate a hardware timer to this task.
Instead, I’ve been experimenting with the venerable NE555. Its normal operating voltage is 4.5 .. 16V, but there’s a CMOS version which will easily go down to 3.3V, as preferred by JeeNodes.
So here’s the circuit (from the ICM7555 docs by NXP):
The RESET pin can turn this thing on and off. It’ll also need an extra transistor to drive a bright IR LED.
Had to try it out, of course (the chip I used wants at least 4.5V, hence the USB power):
Great. It works, but at 35.1 kHz the frequency is a bit off.
Here’s a Logic Analyzer screen shot (warning: MDI toolbar madness, flash from the past!):
(FWIW: my USB Scope and Logic Analyzer now both work properly on Mac OS X under Parallels 6 emulation – I no longer need a dedicated Windows setup.)
Let’s do the math for the components used in the above test setup, with RA = 1.2 kΩ, RB = 18 kΩ, C = 1 nF:
f = 37.09 kHz ∂ = 51.6 %
Let’s use the 1 nF capacitor, smaller would make the circuit more sensitive to stray capacitance. Then I get:
RA + 2 RB = 36.315 kΩ
I don’t want to raise RA much, because that would change the duty cycle in the wrong direction: more LED-on time (i.e. higher current draw). I also don’t want to lower it much further, because that would draw more current in the discharge phase (pin 7 pulled low).
Using 1% resistors, RA = 1.5 kΩ and RB = 17.4 kΩ will do:
f = 38.02 kHz ∂ = 52.1 %
The 1 nF capacitor will have to be 1% too, of course.
I think I’ll try this. What remains – as always! – is the software, to send out the proper IR bit patterns and to decode the ones coming in. It’d be nice if that could be done fully interrupt-driven like the RF12 driver, because then the whole real-time aspect of IR communication would be taken out of the loop(), so to speak.