Click for larger image
I was trying to build a set of wireless sensors using cheap 434Mhz AM transmitter and receiver modules. The AM transmit modules (keyfob style transmitters)
are reasonable quaility but the receivers tend to be a little poor. The receivers use a free running oscillator formed around a tunable inductor. This
is a reasonable strategy for short range reception but at a distance the difference beteen the transmitter and receiver local oscillator frequencies
causes poor or inconsitant results.
After i'd drawn a few paper designs for a better receiver I realised that a TV tuner had most of what I needed. TV tuners are good sensitive receivers, modern
tuner heads contain a phase lock loop IC and VCO combination, sometimes a microcontroller as well. thanks to digital TV switchover analogue
TV tuners are floating around everywhere. A quick ebay search revealed lots of them.
Better still a large number of the Philips TV tuner modules even cover the frequency I was after. I ordered a few PCI TV cards with philips modules and
set to work trying to program them.
I tried to program the tuner using the datasheet and some pic-C code on an 8 pin PIC. I did not have a lot of luck, the PLL would not lock. Reading the Linux
driver source for TV card was hard work, decided it was simpler to get a card working and see what it sent. I turned on I2C debugging for the bttv module and managed
to get the exact sequence the driver sends to the card, plugged these values into a PIC - it worked nicely. For anyone trying to make sense of the Philips tuner documentaion
be warned at least two of the 5 example I2C write sequnces don't seem to work. The "long" sequence with 4 bytes always works and is the only sequence the Linux
driver uses so I copied the same form.
After knocking up a quick verostrip prototype I decided to make a PCB. Rather than unsolder the tuner module I left it on the small PCI card it was installed on.
This way I get a free phono socket to connect a 5inch B+W monitor so I can see whats going on.
The circuit uses 3 8 pin PICs - but only 2 are actually required, or one larger one if you like. I picked this layout and form as it matched a few other projects
I have in mind for the TV tuner.
The PIC named "tuner" on the schematic simply sends an I2C sequence to the tuner (F11246 MK2/PH). This sequence tells the tuner to use its "mid" set of frequencies as well as
setting the correct channel 434Mhz. The software then polls the I2C tuner every second or so and assuming the tuner reports a PLL lock it reflects this by turning
on a green LED.
My transmitters are sending 300 baud serial data. Assuming all is working ok then a monitor plugged into the tuner will show a nice analogue picture of snow.
A transmitter when keyed should cause the received signal to be black (zero volts ish) . So data is the difference between "snow" and "black" and will show
on a connected monitor as a series of black and white bars.
I started with a diode and a NPN transitor to recover this data back to serial, this worked - but I figured I could better with yet another PIC. I started with a PIC12F629
using the analogue comparitor it has, the reference voltage (0.5v) is the potential divider marked as "optional" on the schematic. This again worked OK, but I thought
a bit of extra filtering would maybe improve things more. I swapped over to using a 12F675 as this has an A/D converter. After much playing with code all the PIC is doing
is reading the A/D and acting a comparitor - taking an external line high or low depending on the voltage present. One useful thing about using a PIC this way is that
the limited sample speed and resolution of the A/D acts as a low pass filter ignoring the higher frequency components completely. With careful level setting its possible to detect
the white noise of static and the 0v of the mark with great reliablity.
For power i'm using a 9vDC 1Amp external PSU. The tuner takes a good 200ma+ of current, so dont try and use a small 5v regulator.
The 1Amp regulator bolted to the copper board gets gently warm as does the tuner module itself.
The PCB looks a little odd. Its a double sided copper board. The bottom side has been covered with strips of insulating tape before placing in the etch. This provides a solid
sheet of copper on one side that I use as a ground. When ground is needed on the top side simply drill a small hole with the PCB drill and solder a wire on both sides. The 8 pin
leaf spring sockets have had the legs bent out sideways, construction is surface mount style but with large components. I can do the entire board in 0805 and surface mount PICS with
in circuit programing headers but I simply used the bits I had to hand - seems pointless making the PCB small if the tuner sitting on it is large!
Im using the receiver with a set of temperature transmitters. Each transmitter is sending ASCII data in the form [CR][LF]T[Sensor number]=[Temp in C][TAB][TAB][Single Byte Chechsum as Hex][CR][LF]
The code is a bit hacky but functional.
The code uses the CCS C compiler. Tuner-test allows you to select from low/med/high frequency block, to tune up and down and to read/report the tuner
PLL status, its just for expermentation. Fixed-freq.c just loads the correct frequency for 433.8Mhz data transmitters. Filter.c just takes 300 baud data recovered by the AM demodulator
and presents it to the PC and 9600 baud.
If using just a wire as an arial the receiver works much better with the antenna connector DC shorted and a wire connected to the center, this has surprisingly little attenuation.
The diodes in the serial lines are much larger than required.
This is a about as good its going to get for AM data (100% modulated AM, carrier=mark/no carrier=space). FSK would be better but would also require NRZ or manchester encoding