Dumping ground for my attempts to activate a floodlight via arduino.
Hardware:
Arduino Uno R3
TimeGuard Floodlight receiver TLRX150 / TLRX500B
IQ-Group E950N / E951N PIR transmitter (http://www.digiteck.net/productdetail.php?productid=402)
Capturing RF data
Captured the 433mhz RF data sent by the IQ-Group receiver by using the soundcard in my pc, base on these links -
http://rayshobby.net/?p=3381
http://davehouston.net/learn.htm
I used the mic input as my laptop doesn't have a line-in - it worked fine.
hardware :
cheap rf receiver & transmitter from ebay for use with arduino
breadboard
5v power supply
headphone cable
+5v --> VCC of receiver
rf receiver data pin--> 40k Ohm resistor
40k ohm resistor -> tip of headphone jack
GND --> GND or rf receiver
GND --> bottom of headphone jack
GND --> 10K resistor
10K resistor --> middle section of headphone jack
https://sites.google.com/site/euclydqigroup/home/photo.JPG
Recorded the RF signal using Audacity
There appears to be 12 pulses of data starting with three small peaks and ending with the long peak.
I measured the timing of each peak and trough as best I could and replicated it by transmitting highs and lows via an arduino sketch but it did not work. (the magnification of the two images are different, but they did broadly match)
Reading the IQ-Group website revealed that:
Each IQ-group radio transmitter is given a separate ID code or electronic address which employs a four quadric or higher communication protocol. This makes the transmitter protocol more efficient than the traditional binary code format. Once set the ID code does not change even if there is a power supply interruption.
When an IQ-group radio link is triggered it sends a stream of data which includes at least a channel code, and identification code, an original equipment manufacturer code, a product code and a battery status code thus avoiding interference from other manufacturers’ products. This duration of the data stream is 100 milliseconds.
IQ-group radio frequency receivers can accept data from multiple transmitters and can distinguish both the nature of the product and where it is located in the building.
http://iq-group.com/main.php?section=3&article=9&view=
Four quadric or higher communication protocol? Scary.
Then I found the patent.
http://www.google.com/patents/EP1531438B1?cl=en&dq=inassignee:%22IQ+Group+SDN+BHD%22&hl=en&sa=X&ei=hqofUfGPH6GL4ATk1oCwCQ&ved=0CEIQ6AEwBQ
This shows that there's a pre-amble of 4 highs (but I had only 3?) followed by the payload that each 4.5ms bit was broken into 6 segments with a high in one of the first 4 segments.
This gives a total of 9 segments for the preamble and 102 segments for the payload each of 750 microseconds each.
This didn't explain why I only had 3 highs in the preamble instead of 4 - a deviation from the patent maybe? I then read something about RF signals being inverted from IR signal. So I inverted the image.
Aha - 4 highs followed by a double low preamble!
Next was to divide up the signal into 750microsecond sections to figure out where in the bits the highs were appearing. In Audacity I used Analyze>Regular interval labels.
I drafted out a very rough arduino sketch with all the segments listed and tested it - It worked! The TimeGuard Floodlight switched on!
Now to go back and crunch down the sketch into a series of loops.
Arduino sketch 1
int incomingByte = 0; // for incoming serial data
int pin = 10; // pin connected to RF transmitter
boolean v1= HIGH;
boolean v0= LOW;
#define d750 750 //750 microseconds
void setup(){
Serial.begin(9600);
Serial.println("Type \"A\" to switch on");
}
void loop(){
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
if(incomingByte == 65) { //"A"
Serial.println("Switching A on...");
Aon();Aon();Aon();Aon();Aon();Aon();Aon();Aon();Aon();Aon();Aon();Aon(); // toggle the switch on or off here
Serial.println("complete");
}// end if incomingbyte
if(incomingByte == 66) { //"B"
Serial.println("TEST");
// toggle the switch on or off here
digitalWrite(pin, HIGH);
delay(2000);
preamble();
Serial.println("complete");
}// end if incomingbyte
}
}
void preamble(){
digitalWrite(pin, v1);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
delayMicroseconds(d750);
}
void idcode(){
//1
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1); ////////////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//2
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);///////////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//3
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);//////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//4
digitalWrite(pin, v1);////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//5
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);///
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//6
digitalWrite(pin, v1);//////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//7
digitalWrite(pin, v1);///////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//8
digitalWrite(pin, v1);//////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
//9
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);//////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
}
void oem(){
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);//////////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
////
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);///////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
}
void product(){
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);//////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
}
void channel(){
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v1);//////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
}
void battery(){
digitalWrite(pin, v1);///////
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
digitalWrite(pin, v0);
delayMicroseconds(d750);
}
void Aon(){
preamble();
idcode();
oem();
product();
product();
channel();
channel();
battery();
battery();
digitalWrite(pin, v0);
// delayMicroseconds(16500);
delay(165);
}