Σε αυτό το άρθρο, παρουσιάζουμε μια εργασία πάνω στην πλατφόρμα Arduino, η οποία επιδεικνύει την ασύρματη ψηφιακή μετάδοση δεδομένων, χρησιμοποιώντας απλές τυποποιημένες μονάδες πομπού και δέκτη RF στα 433MHz.
Αυτές οι μονάδες διατίθενται στο διαδίκτυο, με κόστος λιγότερο από δυο δολάρια, καθιστώντας τες μια από τις πιο οικονομικές επιλογές για ασύρματη μετάδοση δεδομένων. Επίσης διαθέτουν το πλεονέκτημα να έχουν πολύ μικρό μέγεθος, τόσο μικρό που μπορούμε να τις ενσωματώσουμε σχεδόν σε κάθε έργο.

Η συχνότητα των 433ΜΗz ανήκει στο φάσμα ραδιοσυχνοτήτων για συσκευές μικρής εμβέλειας, πράγμα που σημαίνει ότι δεν χρειάζεται ειδική άδεια για τη χρήση αυτών των RF μονάδων. Εντυπωσιακό είναι επίσης, ότι αυτές οι μονάδες, μπορούν να μεταδώσουν δεδομένα σε αποστάσεις έως και 50 μέτρα (ανάλογα, φυσικά με τις συνθήκες).
Επισκόπηση υλικού: Ο πομπός (Transmitter)
Πρώτα ας δούμε την μονάδα πομπού 433MHz. Η «καρδιά» αυτής της μονάδας πομπού είναι ένας SAW resonator (Surface Acoustic Wave resonator). Αυτό το ειδικό εξάρτημα, είναι ρυθμισμένο να λειτουργεί και να παράγει σήμα στα 433.xx MHz. Η μονάδα περιλαμβάνει επίσης ένα τρανζίστορ σε λειτουργία διακόπτη και μερικά αναγκαία παθητικά εξαρτήματα.

Όταν στείλουμε ένα σήμα HIGH (λογικό 1) στην είσοδο DATA, ο ταλαντωτής παράγει ένα συνεχές ραδιοκύμα στα 433.xx ΜΗz. Όταν αυτή η είσοδος DATA μπεί σε LOW (λογικό 0), o ταλαντωτής σταματά να λειτουργεί, δημιουργώντας αυτό που λέγεται κύμα διαμορφωμένο στο πλάτος.
Αυτή η μέθοδος μεταβολής της ισχύος του σήματος για να αναπαρασταθούν τα δεδομένα ονομάζεται Διαμόρφωση Μετατόπισης Πλάτους (ASK – Amplitude Shift Keying), την οποία θα εξετάσουμε αναλυτικά αργότερα.
Επισκόπηση υλικού: Ο Δέκτης (Receiver)
Τώρα, ας περάσουμε στη μονάδα δέκτη. Αυτή περιλαμβάνει ένα κύκλωμα συντονισμού RF το οποίο λειτουργεί σαν φίλτρο: αποκλείει ανεπιθύμητα σήματα που δεν βρίσκονται στην περιοχή των 433MHz.

Στην συνέχεια υπάρχει μια ομάδα ενισχυτών, οι οποίοι ενισχύουν το λαμβανόμενο ραδιοσήμα πριν την επεξεργασία του.
Μετά την ενίσχυση, το σήμα περνά μέσα από ένα κύκλωμα PLL (Phase Locked Loop – βρόγχος κλειδώματος φάσης). Το PLL βοηθά τον αποκωδικοποιητή να «κλειδώσει» στη ροή των ψηφιακών bits, προσφέροντας καθαρότερο σήμα εξόδου και καλύτερη αντοχή στο θόρυβο και τις παρεμβολές.
ASK – Διαμόρφωση Μετατόπισης Πλάτους (Amplitude Shift Keying)
Ας εξερευνήσουμε πως οι μονάδες πομπού και δέκτη στους 433MHz μεταδίδουν ψηφιακά δεδομένα χρησιμοποιώντας μια τεχνική που ονομάζεται Amplitude Shift Keying (ASK). Πρόκειται για έναν τύπο ψηφιακής διαμόρφωσης που είναι απλός και αποτελεσματικός για την ασύρματη μετάδοση πληροφοριών.

Πως λειτουργεί: Στη Διαμόρφωση Μετατόπισης Πλάτους χρησιμοποιείται ένα ραδιοκύμα υψηλής συχνότητας (στην περίπτωση μας 433MHz) για την μετάδοση δεδομένων. Αυτό το κύμα φέροντος είναι ένα συνεχές ημιτονικό κύμα σταθερής συχνότητας, το οποίο διαμορφώνεται έτσι ώστε να αντιπροσωπεύει τα δυαδικά δεδομένα 0 και 1.
Όταν θέλουμε να στείλουμε ένα δυαδικό «1» το κύμα φέροντος εκπέμπεται πλήρως (με μέγιστο πλάτος). Όταν θέλουμε να στείλουμε ένα δυαδικό «0» το κύμα δεν εκπέμπεται καθόλου.
Το αποτέλεσμα είναι ένα κύμα στο οποίο το πλάτος μετατοπίζεται ανάλογα με το αν μεταδίδεται «1» ή «0». Επειδή υπάρχουν μόνο δυο επίπεδα πλάτους (on ή off) αυτή η μέθοδος λέγεται και Δυαδική Διαμόρφωση Πλάτους (Binary ASK)
Πλεονεκτήματα: Η τεχνική ASK έχει αρκετά πλεονεκτήματα που την κάνουν ιδανική για απλές ασύρματες εφαρμογές:
1] Απλότητα υλοποίησης: Δεν απαιτεί πολύπλοκο υλικό για την δημιουργία ή ανίχνευση ASK σημάτων. Αυτό σημαίνει χαμηλό κόστος και ευκολία χρήσης σε πολλές εφαρμογές.
2] Μικρότερο απαιτούμενο εύρος ζώνης. Σε σύγκριση με άλλες τεχνικές, όπως το FSK, η ASK χρησιμοποιεί λιγότερο φάσμα συχνοτήτων.
Περιορισμοί: ωστόσο, η ASK έχει και ορισμένους περιορισμούς:
1] Επειδή βασίζεται αποκλειστικά στη μεταβολή του πλάτους, είναι ευαίσθητη σε θόρυβο και παρεμβολές. Έτσι, μπορεί να είναι λιγότερο αξιόπιστη σε περιβάλλοντα με έντονο ηλεκτρομαγνητικό θόρυβο.
2] Η συνεχής εκπομπή σήματος για την αναπαράσταση του «1» την κάνει λιγότερο αποδοτική σε κατανάλωση ισχύος, ειδικά σε μεγαλύτερες αποστάσεις.
Εφαρμογές: Γι’ αυτό οι ASK μονάδες είναι πιο κατάλληλες για συστήματα μικρής εμβέλειας, όπως:
1] τηλεχειριστήρια
2] μετεωρολογικοί σταθμοί
3] απλά συστήματα αυτοματισμού σπιτιού.
Παρά τους περιορισμούς, αν η ταχύτητα μετάδοσης δεδομένων είναι σχετικά χαμηλή, η ASK μπορεί να λειτουργήσει αξιόπιστα σε πολλές περιπτώσεις, και είναι ιδανική επιλογή όταν η απλότητα και το χαμηλό κόστος είναι πιο σημαντικά από την υψηλή ταχύτητα ή την πολύ μεγάλη εμβέλεια.
Διάταξη Πομποδέκτη RF 433MHz (Pinout)
Πομπός (Transmitter)
Για τον πομπό έχουμε τους ακόλουθους ακροδέκτες:

DATA: (Είσοδος δεδομένων) Εδώ δίνουμε το ψηφιακό σήμα που θέλουμε να μεταδοθεί.
VCC: (Τροφοδοσία) Λειτουργεί με 3,5V έως 12V DC (όσο μεγαλύτερη είναι η τάση, τόσο μεγαλύτερη είναι η ισχύς εκπομπής και η εμβέλεια.
GND: Γείωση
ΑΝΤ: (Κεραία) Σύνδεσέ ένα κομμάτι σύρμα μήκους 17,3cm για βέλτιστη απόδοση (το μήκος αυτό αντιστοιχεί στο ¼ του μήκους κύματος στα 433ΜΗz.
Δέκτης (Receiver)
Για τον δέκτη έχουμε τους ακόλουθους ακροδέκτες:

VCC: (Τροφοδοσία) Λειτουργεί με 5V (απαιτεί συγκεκριμένα 5V για σωστή λειτουργία.
DATA: (Έξοδος δεδομένων) Μεταφέρει το σήμα που λαμβάνεται από τον πομπό (οι δυο ακροδέκτες DATA: είναι εσωτερικά συνδεδεμένες, οπότε μπορούμε χρησιμοποιούμε όποια θέλουμε)
GND: Γείωση
ΑΝΤ: (Κεραία) Όπως και στον πομπό, χρησιμοποιούμε σύρμα 17,3cm για καλύτερη λήψη.
Σύνδεση των μονάδων Πομπού και Δέκτη RF με το Arduino
Τώρα που κατανοήσαμε πως λειτουργούν αυτές οι μονάδες, ας τις συνδέσουμε με πλακέτες Arduino. Γι’ αυτό το έργο, θα χρειαστούμε δυο ξεχωριστά σετ Arduino, γιατί θα στέλνουμε δεδομένα από το ένα Arduino στο άλλο.
Σύνδεση του πομπού (Transmitter): η σύνδεση του πομπού είναι πολύ απλή, καθώς έχει μόνο τρεις ακροδέκτες που θα τις συνδέσουμε ως εξής:

1] Συνδέουμε το VCC της μονάδας με το 5V του Arduino.
2] Συνδέουμε το GND με τη γείωση της πλακέτας.
3] Συνδέουμε το DATA-in με το ψηφιακό pin #12 του Arduino.
Συνίσταται η χρήση του pin #12, γιατί η βιβλιοθήκη RadioHead που θα χρησιμοποιήσουμε αργότερα έχει προεπιλεγμένη ρύθμιση για αυτό το pin.
Σύνδεση του Δέκτη (Receiver): Τώρα ας συνδέσουμε την μονάδα του δέκτη στο δεύτερο Arduino. Η διαδικασία είναι σχεδόν ίδια με αυτή του πομπού.

1] Συνδέουμε το VCC με το 5V του Arduino.
2] Συνδέουμε το GND με τη γείωση της πλακέτας.
3] Συνδέουμε μια από τους δυο μεσαίους ακροδέκτες DAT-out στο ψηφιακό pin#11 του Arduino.
Η βιβλιοθήκη RadioHead
Σε αντίθεση με τις πιο προηγμένες μονάδες RF, όπως η nRF24L01, το 433MHz σύστημα είναι αρκετά απλό. Δεν διαθέτει ενσωματωμένο μηχανισμό ελέγχου σφαλμάτων κατά τη μετάδοση. Αυτό σημαίνει ότι, αν τα δεδομένα αλλοιωθούν κατά τη μετάδοση, δεν υπάρχει τρόπος αυτόματης ανίχνευσης ή διόρθωσης. Για να εξασφαλίσουμε σωστή λήψη, χρειάζεται να προσθέσουμε σύστημα ανίχνευσης σφαλμάτων.
Εδώ έρχεται η βιβλιοθήκη RadioHead. Αυτή αναλαμβάνει τη διαχείριση σφαλμάτων χρησιμοποιώντας τον μηχανισμό CRC (Cyclic Redundancy Check). Ένα μεγάλο πλεονέκτημα είναι ότι η βιβλιοθήκη λειτουργεί με σχεδόν οποιαδήποτε RF μονάδα, όχι μόνο με τις 433MHz.

Στην πλευρά του πομπού: Η βιβλιοθήκη παίρνει τα δεδομένα που θέλουμε να στείλουμε και τα τοποθετεί σε ένα δομημένο πακέτο που ονομάζεται RadioHead Packet. Αυτό το πακέτο περιέχει:
1] έναν CRC έλεγχο σφαλμάτων
2] ένα προοίμιο (preamble)
3] μια επικεφαλίδα
Αφού δημιουργηθεί το πακέτο εκπέμπεται ασύρματα προς το δεύτερο Arduino.
Στην πλευρά του δέκτη: Η βιβλιοθήκη «ακούει» συνεχώς για εισερχόμενα πακέτα. Όταν λάβει ένα πακέτο κάνει τα εξής: Υπολογίζει τον CRC για έλεγχο. Αν ο έλεγχος δίνει σωστό αποτέλεσμα τότε ειδοποιεί το Arduino υπάρχουν νέα έγκυρα δεδομένα. Αν ο έλεγχος αποτύχει, το πακέτο απορρίπτεται αυτόματα, ώστε να μην χρησιμοποιηθούν κατεστραμμένα δεδομένα.
Εγκατάσταση της βιβλιοθήκης RadioHead
Για την εγκατάσταση της βιβλιοθήκης RadioHead ακολουθούμε τα ακόλουθα βήματα:

1] Ανοίγουμε το Arduino IDE.
2] Κάνουμε κλικ στο εικονίδιο Library Manager (στην αριστερή μπάρα).
3] Πληκτρολογούμε radiohead στο πεδίο αναζήτησης.
4] Εντοπίζουμε τη βιβλιοθήκη “RadioHead” του Mike McCauley
5] Πατούμε Install για να την εγκαταστήσουμε.
Παράδειγμα κώδικα Arduino
Ας δοκιμάσουμε να στείλουμε ένα σύντομο μήνυμα κειμένου από τον πομπό στον δέκτη, χρησιμοποιώντας τις μονάδες RF 433MHz. Αυτή η βασική άσκηση θα μας βοηθήσει να κατανοήσουμε τη λειτουργία των μονάδων και να αποτελέσει τη βάση για πιο προχωρημένα έργα.
Κώδικας για τον πομπό (Transmitter)
Ακολουθεί το παράδειγμα κώδικα Arduino για τον πομπό.
// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library
#include <SPI.h>
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
void setup()
{
// Initialize ASK Object
rf_driver.init();
}
void loop()
{
const char *msg = "Hello World";
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);
}
Επεξήγηση Κώδικα Πομπού
Αν και το συγκεκριμένο sketch είναι σύντομο, περιέχει όλα όσα χρειάζονται για να στείλουμε ασύρματα ένα μήνυμα.
1] Εισαγωγή βιβλιοθηκών.
#include <RH_ASK.h>
#include <SPI.h>
Το πρόγραμμα ξεκινά με την εισαγωγή των απαραίτητων βιβλιοθηκών. Η βιβλιοθήκη RadioHead ASK είναι υπεύθυνη για τη διαχείριση της διαμόρφωσης πλάτους (ASK). Η βιβλιοθήκη SPI είναι επίσης απαραίτητη, γιατί η RadioHead την χρησιμοποιεί για να επικοινωνεί σωστά με το υλικό (hardware).
2] Δημιουργία αντικειμένου ASK.
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
Έπειτα, δημιουργούμε ένα αντικείμενο της κλάσης ASK, ονόματι rf_driver. Αυτό το αντικείμενο περιέχει όλες τις συναρτήσεις που χρειαζόμαστε για να στέλνουμε δεδομένα ασύρματα.
3] Συνάρτηση setup( )
Στη setup() προετοιμάζουμε τον πομπό RF ώστε να είναι έτοιμος για χρήση.
// Initialize ASK Object
rf_driver.init();
Η συνάρτηση init() ρυθμίζει όλα τα απαραίτητα στοιχεία για τη σωστή λειτουργία του πομπού. Αυτό γίνεται μια φορά όταν το Arduino ενεργοποιείται.
4] Συνάρτηση loop( )
Στην loop() δημιουργούμε το μήνυμα που θέλουμε να στείλουμε. Π.χ. “Hello World” και το αποθηκεύουμε στη μεταβλητή msg. Μπορούμε να αλλάξουμε το μήνυμα όπως θέλουμε, αλλά καλό είναι να μην ξεπερνά τους 27 χαρακτήρες για καλύτερη αξιοπιστία.
// Preparing a message
const char *msg = "Hello World";
Στη συνέχεια, χρησιμοποιούμε την συνάρτηση send() για να στείλουμε το μήνυμα. Η send() χρειάζεται δυο παραμέτρους: το μήνυμα μέσα σε μεταβλητή τύπου δείκτη uint8_t * και το μήκος του μηνύματος που υπολογίζεται με την συνάρτηση strlen(msg).
Αμέσως μετά, καλούμε την συνάρτηση waitPacketSent() η οποία κρατάει το Arduino σε αναμονή μέχρι να ολοκληρωθεί πλήρως η αποστολή. Αυτό είναι σημαντικό, γιατί δεν θέλουμε να ξεκινήσει άλλη λειτουργία πριν τελειώσει η μετάδοση.
Τέλος, η delay(1000) καθυστερεί το πρόγραμμα για ένα δευτερόλεπτο πριν σταλεί το επόμενο μήνυμα. Αυτό δίνει χρόνο στον δέκτη να επεξεργαστεί το μήνυμα και να ετοιμαστεί για το επόμενο.
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);
Το πρόγραμμα επαναλαμβάνεται κάθε δευτερόλεπτο, στέλνοντας συνεχώς μηνύματα “Hello World” σε οποιαδήποτε δέκτη που βρίσκεται στην ίδια συχνότητα.
Κώδικας για τον δέκτη (Receiver)
Ακολουθεί το παράδειγμα κώδικα Arduino για τον δέκτη.
// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library
#include <SPI.h>
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
void setup()
{
// Initialize ASK Object
rf_driver.init();
// Setup Serial Monitor
Serial.begin(9600);
}
void loop()
{
// Set buffer to size of expected message
uint8_t buf[11];
uint8_t buflen = sizeof(buf);
// Check if received packet is correct size
if (rf_driver.recv(buf, &buflen))
{
// Message received with valid checksum
Serial.print("Message Received: ");
Serial.println((char*)buf);
}
}
Αφού φορτώσεις αυτό το sketch στον δέκτη Arduino, άνοιξε το Serial Monitor. Αν όλα έχουν ρυθμιστεί σωστά, θα πρέπει να δεις το μήνυμα “Hello World” να εμφανίζεται εκεί.

Επεξήγηση Κώδικα Δέκτη (Receiver Code Explanation)
1] Εισαγωγή βιβλιοθηκών
Όπως και στον πομπό, το πρόγραμμα στον δέκτη ξεκινά φορτώνοντας τις βιβλιοθήκες RadioHead και SPI και την δημιουργία του αντικειμένου rf_driver, που χειρίζεται τη λήψη δεδομένων.
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK rf_driver;
2] Συνάρτηση setup()
Γίνονται δυο βασικές ενέργειες:
α] Αρχικοποίηση του δέκτη με τη συνάρτηση rf_driver.init() ώστε να ξεκινήσει η «ακρόαση» για εισερχόμενα μηνύματα.
β] Εκκίνηση της σειριακής επικοινωνίας με την συνάρτηση Serial.begin(9600) ώστε το Arduino να μπορεί να εμφανίζει τα ληφθέντα μηνύματα στον υπολογιστή, μέσω του Serial Monitor
rf_driver.init();
Serial.begin(9600);
3] Συνάρτηση loop()
Αρχικά, δημιουργούμε μια ειδική περιοχή που ονομάζεται buffer για να αποθηκεύει το εισερχόμενο μήνυμα. Το μέγεθος ορίζεται σε 11 bytes, επειδή το “Hello World” έχει 11 χαρακτήρες (μαζί με το κενό). Αν το μήνυμα σου έχει διαφορετικό μήκος, πρέπει να αλλάξεις ανάλογα αυτή την τιμή. Έπειτα, δημιουργούμε μια μεταβλητή buflen, η οποία δηλώνει το μέγεθος του buffer. Αυτό βοηθά τον δέκτη να γνωρίζει πόσα δεδομένα να περιμένει.
uint8_t buf[11];
uint8_t buflen = sizeof(buf);
3] Λήψη του μηνύματος
Η σημαντικότερη εντολή είναι η recv( ), η οποία ενεργοποιεί τη μονάδα δέκτη.
Η recv( ) περιμένει ένα εισερχόμενο πακέτο και όταν λάβει ένα έγκυρο μήνυμα αντιγράφει το περιεχόμενο του στο buffer και στη συνέχεια επιστρέφει true για να δείξει ότι ελήφθη μήνυμα.
Η πρόταση if ελέγχει αν το recv( ) επέστρεψε true. Αν ναι, σημαίνει ότι λάβαμε έγκυρο μήνυμα με σωστό CRC έλεγχο (δηλαδή χωρίς αλλοίωση)
if (rf_driver.recv(buf, &buflen))
{
Serial.print("Message Received: ");
Serial.println((char*)buf);
}
4] Επαναληπτική λειτουργία
Αφού εμφανιστεί το μήνυμα, το πρόγραμμα επιστρέφει στην αρχή του loop και περιμένει το επόμενο. Έτσι δημιουργείται ένας συνεχής κύκλος ακρόασης και προβολής των ληφθέντων δεδομένων.
Ο πομπός στέλνει κάθε δευτερόλεπτο το “Hello World”, και ο δέκτης – όταν το λάβει σωστά – το εμφανίζει στο Serial Monitor. Με αυτό τον τρόπο ολοκληρώνεται η ασύρματη επικοινωνία μεταξύ δυο Arduino μέσω των μονάδων RF 433MHz
Βελτίωση της εμβέλειας των μονάδων RF 433MHz με κεραία
Ήξερες ότι η σωστή επιλογή κεραίας μπορεί να κάνει τεράστια διαφορά στο πόσο μακριά μπορούν να «επικοινωνούν» οι RF μονάδες σου;
Είναι αλήθεια! Χωρίς καθόλου κεραία, οι 433ΜΗz μονάδες μπορούν να επικοινωνούν μόνο σε αποστάσεις ενός μέτρου ή λιγότερο, πάνω στο γραφείο.
Αν όμως προσθέσεις τη σωστή κεραία, η εμβέλεια μπορεί να φθάσει από τη μια άκρη του σπιτιού στην άλλη, δηλαδή έως και 50 μέτρα. Σαν κεραία ένα απλό κομμάτι μονόκλωνου σύρματος αρκεί και λειτουργεί άψογα τόσο για τον πομπό όσο και για τον δέκτη.
Η πιο αποδοτική κεραία είναι εκείνη που έχει μήκος ίσο με το μισό ή το ένα τέταρτο του μήκους κύματος της συχνότητας εκπομπής. Στην δικιά μας περίπτωση, μια ευθεία μονόκλωνη κεραία μήκους 17,3cm που αντιστοιχεί στο ¼ του μήκους κύματος, είναι η καλύτερη επιλογή για τις μονάδες RF 433MHz που έχουμε.