RF Remote Switching 5V Relay Bank

Hi all,

I have just got my hands on a little receiver module, 8 bank of 5v relays and a 12 channel rf remote.

I aim on mounting all of this onto a quadcopter with lights, etc and triggering from the remote down on the ground.

I can get the remote and rx talking to each other and receiving the codes for each button pressed on the remote.

But I can't work out how to write a sketch which turns a relay on when a designated button is pressed, then toggling it back off once the button is pressed again.

I can imagine that this code is actually going to be quite simple. It's just I am not sure how to approach it and all?

ANY HELP is MUCH appreciated, thanks all!

I am using the rcswitch library to get the codes, etc.

Maybe you can have a look at this tutorial.

The thing you need is detection off a rising edge. you shall need to change some parts off the give code in this tutorial.

Best regards
Timothy.B

I don't think that code is going to work.

I just need to be able to make the arduino read a code from the rf remote and when it gets say code A it turns Relay one on, then when it receives code A again it turns the relay off.

Simply just need to toggle a bank of relays on and off by themselves via the buttons on the rf remote control

Hang on Timothy...

My lack of understanding I think is what is the main problem here.

apparantley these rf signals/codes are basically a series of on/off transmissions grouped together in a cluster to make up a code?

So therefore a simple press of the button which gives a certain code, is effectively a set pwm signal unique to that code.

So what you are saying IS putting me in the right direction and I need to measure the codes to work out what pwm signal it is receiving and nominate the pattern to a relay switching pin?

http://playground.arduino.cc/Code/ReadReceiver

Will that help me?

Thank you!

I am trying to use this code but the serial monitor just says ²9¥ the moment I open the Serial Monitor.

/*
Copyright 2011 Lex Talionis (Lex.V.Talionis at gmail)
This program is free software: you can redistribute it 
and/or modify it under the terms of the GNU General Public 
License as published by the Free Software Foundation, 
either version 3 of the License, or (at your option) any 
later version.

This code uses pin change interrupts and timer 1 to mesure the 
time between the rise and fall of 3 channels of PPM 
(Though often called PWM, see http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1253149521/all)
on a typical RC car reciver.  It could be extended to as
many channels as you like.  It uses the PinChangeInt library
to notice when the signal pin goes high and low, and the 
Timer1 library to record the time between.


*/
#include <PinChangeInt.h>    // http://playground.arduino.cc/Main/PinChangeInt
#include <PinChangeIntConfig.h>
#include <TimerOne.h>        // http://playground.arduino.cc/Code/Timer1

#define NO_PORTB_PINCHANGES //PinChangeInt setup
#define NO_PORTC_PINCHANGES    //only port D pinchanges (see: http://playground.arduino.cc/Learning/Pins)
#define PIN_COUNT 1    //number of channels attached to the reciver
#define MAX_PIN_CHANGE_PINS PIN_COUNT

#define REMOTE 2   //arduino pins attached to the reciever
byte pin[] = {REMOTE};    //for maximum efficency thise pins should be attached
unsigned int time[] = {0};                // to the reciver's channels in the order listed here

byte state=0;
byte burp=0;    // a counter to see how many times the int has executed
byte cmd=0;     // a place to put our serial data
byte i=0;       // global counter for tracking what pin we are on

void setup() {
    Serial.begin(115200);
    Serial.print("PinChangeInt ReciverReading test");
    Serial.println();            //warm up the serial port

    Timer1.initialize(2200);    //longest pulse in PPM is usally 2.1 milliseconds,
                                //pick a period that gives you a little headroom.
    Timer1.stop();                //stop the counter
    Timer1.restart();            //set the clock to zero

    for (byte i=0; i<3; i++)
    {
        pinMode(pin[i], INPUT);     //set the pin to input
        digitalWrite(pin[i], HIGH); //use the internal pullup resistor
    }
    PCintPort::attachInterrupt(pin[i], rise,RISING); // attach a PinChange Interrupt to our first pin
}

void loop() {
    cmd=Serial.read();        //while you got some time gimme a systems report
    if (cmd=='p')
    {
        Serial.print("time:\t");
        for (byte i=0; i<PIN_COUNT;i++)
        {
            Serial.print(i,DEC);
            Serial.print(":");
            Serial.print(time[i],DEC);
            Serial.print("\t");
        }
        Serial.print(burp, DEC);
        Serial.println();
/*      Serial.print("\t");
        Serial.print(clockCyclesToMicroseconds(Timer1.pwmPeriod), DEC);
        Serial.print("\t");
        Serial.print(Timer1.clockSelectBits, BIN);
        Serial.print("\t");
        Serial.println(ICR1, DEC);*/
    }
    cmd=0;
    switch (state)
    {
        case RISING: //we have just seen a rising edge
            PCintPort::detachInterrupt(pin[i]);
            PCintPort::attachInterrupt(pin[i], fall, FALLING); //attach the falling end
            state=255;
            break;
        case FALLING: //we just saw a falling edge
            PCintPort::detachInterrupt(pin[i]);
            i++;                //move to the next pin
            i = i % PIN_COUNT;  //i ranges from 0 to PIN_COUNT
            PCintPort::attachInterrupt(pin[i], rise,RISING);
            state=255;
            break;
        /*default:
            //do nothing
            break;*/
    }
}

void rise()        //on the rising edge of the currently intresting pin
{
    Timer1.restart();        //set our stopwatch to 0
    Timer1.start();            //and start it up
    state=RISING;
//  Serial.print('r');
    burp++;
}

void fall()        //on the falling edge of the signal
{
    state=FALLING;
    time[i]=readTimer1();    // read the time since timer1 was restarted
//  time[i]=Timer1.read();    // The function below has been ported into the
                            // the latest TimerOne class, if you have the
                            // new Timer1 lib you can use this line instead
    Timer1.stop();
//  Serial.print('f');
}

unsigned long readTimer1()        //returns the value of the timer in microseconds
{                                    //rember! phase and freq correct mode counts 
                                    //up to ICR1 then down again
    unsigned int tmp=TCNT1;
    char scale=0;
    switch (Timer1.clockSelectBits)
    {
    case 1:// no prescalse
        scale=0;
        break;
    case 2:// x8 prescale
        scale=3;
        break;
    case 3:// x64
        scale=6;
        break;
    case 4:// x256
        scale=8;
        break;
    case 5:// x1024
        scale=10;
        break;
    }
    while (TCNT1==tmp) //if the timer has not ticked yet
    {
        //do nothing -- max delay here is ~1023 cycles
    }
    tmp = (  (TCNT1>tmp) ? (tmp) : (ICR1-TCNT1)+ICR1  );//if we are counting down add the top value
                                                        //to how far we have counted down
    return ((tmp*1000L)/(F_CPU /1000L))<<scale;
}

AutoElecHack:
I am trying to use this code but the serial monitor just says ²9¥ the moment I open the Serial Monitor.

Perhaps the serial port configuration on the client does not match what the Arduino is using?

I understand what you mean but i don't know how to establish is whit the arduino(I'm a beginner myself).
Sorry that I couldn't help.

m.v.g.
Timothy.B

Thanks anyways guys!

Once I get this thing working on my quadcopter, I'll be sure to share a video of somesort! :smiley: