Manchester Code Library for Arduino
by mdeudon in Circuits > Arduino
4039 Views, 1 Favorites, 0 Comments
Manchester Code Library for Arduino
I made wireless motion dectors (see https://www.instructables.com/Wireless-PIR-Sensor... and I spent some time to search for a good library to avoid me to code too much.
I found some, and some have worked but when I opened the code, oh dear i has been flooded with a lot of blabla, multiples functions, Arduino stuff to be compatible with a lot of board...
So I decided to code a library myself, not the best, but the simpliest, readable and understandable.
Supplies
https://github.com/mdeudon/Manchester.git
About the Manchester Code
I won't explain the manchester code in details hereby, there is a lot of publication on internet that will do it better than me.
But just to resume :
A 0 bit is coded with a rising edge.
A 1 bit is coded with a falling edge.
This code is supposed to be more resistant to noise. That is why I've choosen it.
About ASK and RF Modules
No ASK is not a bad word, it means : Amplitude Shift Keying.
And so what ?
It is a complicated acronym for something so simple :
- If I want to transmit 1, I emitt a signal.
- If I want to transmit 0, I stop to emitt the signal.
But before doing this, I need to tell to my receiver : hey it's me, I am about to send you a message !!
To do that, I will send it a suite of 1 0 1 0 1 0 ... the receiver will sense the signal, a regular signal : so it is not a noise but someting is talking to me, and measure the amplitude to make it a reference.
This is the purpose of the send_sync() in manchester_tx.h :
void Sender::send_sync()
/*send 32 HIGH LOW edges to synchronize with the receptor*/
{
/sending a sync signal
for (byte i=0;i<32;i++)
{
digitalWrite(RF_PIN,HIGH);
delayMicroseconds(T);
digitalWrite(RF_PIN,LOW);
delayMicroseconds(T); }
digitalWrite(RF_PIN,HIGH);
}
}
-> 32 is arbitrary, you can try to send less and see if it still works...
From then we can talk ...
Sending a Byte
To make understand the receiver we are sending data and not sync signal as in the previous step, let send a start byte.
Then the receiver will now that the following byte is the data.
void Sender::send_load(byte start[],boolean state)
-> call the function twice, one time to send the start byte and oner time to send the data byte
void Sender::send_byte(byte car)
-> use previous function to send start byte + data byte, this is the one you should use in your skectch
Let Deal With the Receiver
void Receiver::seek_start()
-> loop indefinitly until a start byte is received
This is a blocking function, I may improve it ...
byte Receiver::read_signal()
-> read a byte
This is also a blocking funciton, but there is a timeout, so if the signal is not received within few ms it returns 3
No Blabla, Let Make It Work
I count on you to buy a pair of RF emitter/receiver...
Plug the emitter data pin on pin 9 of an Arduino. The receiver is on pin 11 of a another Arduino.
Install my library and check the examples.