Remote Controlled Eight-Relay Board
PART II
- Using the RF12 Board by Jeelabs
I
am making a remote control device. It allows me to independently switch
eight relays and control various items. When I press buttons on a
small keypad, instructions will be decoded and transmitted via a
microwave RF packet transceiver (@868 MHz). At the other end (up to 100m away!) another transceiver decodes the message and switches the relays ON or OFF.
Q. Why RF and not IR?
Ans. I want to use the RC device through walls and outside, so it's got to be RF - you get about 100m in line of sight, and @869 MHz you get penetration through walls.
Instructions typed on a small keypad will be transmitted via the first RF12 microwave RF packet transceiver. At the other end the second RF12 handles the packet and another Arduino switches the relays on the x8 relay board, ON or OFF.
How I'm knitting it: device visualisation
To avoid some of the pitfalls I fell into, I recommend you following the geekery recipe below.
Geekery Recipe: Using the RF12 board with Arduino Uno
As mentioned above, the RF12 boards are available from
Jeelabs (£
9.33). These
enable data sharing among common network groupings. I am just using them
for RC, although they are capable of much more. I am working at 5v so I need
all the components for the board.
Assembling and connecting RF12
boards.
Useful links before starting:
Jeelabs article
http://jeelabs.org/2011/02/02/meet-the-rfm12b-board/
Jeelabs hardware reference
http://jeelabs.net/projects/hardware/wiki/RFM12B_Board
RF12 datasheet
https://docs.google.com/open?id=0B0rsQRXKNaRMcDgydDNLa1ZLUkU
For a guide on soldering see this link:
http://www.make-digital.com/make/vol01/?pg=166#pg166
1.
Start by soldering on the surface mount module. The way
I found best, was to lightly flux all the parts I'm going to solder (using a flux pen) and tin the SMD mounts on
the module. Then use a small croc-clip to hold the module in place on the board
and reheat the tinned contacts until solder flows. Then pull away the soldering
tip, allowing cooling. Be careful not to overheat the module – proceed slowly
to allow proper cooling.
2. Solder the rest of the components starting
with the smallest or lowest profile first. This order worked for me: small
capacitors, resistors, voltage regulator, electrolytic capacitor, and finally
the header strip.
3.
Note the PCB has the connecting Arduino pins marked on
it.
4. Connect the RF12 boards to the Arduinos according to the above diagram. At
this point I have two RF12 Arduino transceivers all wired up.
Setting Up and Testing the Transceivers
I don’t pretend to
understand how all this code and library works, but it works ok and that’s good
enough for me, at least for now.
2. Open the RF12 demo sketch.
Note I had to change the Baud rate of the serial
connection to get it to work ie
void setup() {
Serial.begin(57600); CHANGE to Serial.begin(9600);
........ others may work too..........
Load the sketches to the Arduinos and refer to this page: http://jeelabs.org/2011/02/02/meet-the-rfm12b-board/.
I got something that looks like this when I opened the serial monitor(s):
...plus some other stuff I didn’t need to worry about.
I set my RF12’s to 868 MHz working in group 10
and each node ID labelled in sequence 1, 2 etc... The RF12 demo stores these
data in memory so the nodes remember what the freq is and their ID’s.
It’s tricky keeping track
of which nodes are on which serial COM and which Arduino. I am uploading to or sending / receiving
serial data from at least two. Obviously the more Arduinos connected the worse it gets, so I
label the Arduino with tape and write the COM number on it.
9. I typed this into the serial monitor for node 1:
8b
10g
1i
and this for node 2:
8b
10g
2i
10. For each node, I tried sending max-size packet with ack [acknowledge]
t
and in return I got in return something like this
for node 1, group 10:
Current
configuration:
A i1 g10 @ 868 MHz
> 0t
test 0
-> 66 b
OK 193
and in return I got in return something like this for node 2, group 10:
B i2 g10 @ 868 MHz
> 0t
test 0
-> 66 b
OK 193
That tells me the nodes are successfully transmitting and receiving data-packets
– huzzah!
It’s not absolutely necessary, but I could go
ahead and test further by playing with the
packetbuf demo (remember to change baud rate
if you get a problem). I am using
packetbuf code in my RC device.
TIPS:
To avoid some of the
pitfalls and frustrations I got into, I recommend steps 2. through to 9. are followed
if you use your Arduino or AVR chips for other things, because the memory may get
overwritten. This happened to me on a few occasions. Also label which Arduino
is using which COM connection. It will save lot’s of grief as the number of
nodes increase, especially if you are loading different sketches to different Arduinos.
Beware of using delay() with RF12 modules. They use interrupts to operate, hence Arduino pin 2 is used, which is one of the external interrupt pins. Arduino delay() plays havoc with interrupts so it can't be used. Use blink-without-delay, which is given as an example with the Arduino IDE. Alternatively, I use delayMicroseconds() which does not interfere with the packet buffer code I am using. I think purists may prefer blink-without-delay, however.