Vuoi aggiungere capacità wireless al tuo prossimo progetto Arduino, per meno del prezzo di una tazza di caffè? Bene, allora i moduli trasmettitore e ricevitore RF 433MHz fanno al caso tuo! Spesso possono essere ottenuti online per meno di due dollari per una coppia, rendendoli una delle opzioni di comunicazione dati più economiche che si possono ottenere. E soprattutto, questi moduli sono piccolissimi, permettendoti di incorporare un’interfaccia wireless in quasi tutti i progetti.
Panoramica dell’hardware
Diamo uno sguardo più da vicino ai moduli trasmettitore e ricevitore RF 433MHz.
Questo piccolo modulo è un trasmettitore tra due. È davvero semplice come sembra. Il cuore del modulo è il risonatore SAW che è sintonizzato per il funzionamento a 433.xx MHz. C’è un transistor di commutazione e qualche componente passivo, tutto qui.
Quando un ALTO logico è applicato all’ingresso DATA, l’oscillatore funziona producendo un’onda portante RF costante in uscita a 433,xx MHz e quando l’ingresso DATA è portato a BASSO logico, l’oscillatore si ferma. Questa tecnica è conosciuta come Amplitude Shift Keying, che discuteremo in dettaglio tra poco.
Questo è un modulo ricevitore. Anche se sembra complesso, è semplice come il modulo trasmettitore. Consiste in un circuito sintonizzato RF e un paio di amplificatori OP per amplificare l’onda portante ricevuta dal trasmettitore. Il segnale amplificato è ulteriormente alimentato ad un PLL (Phase Lock Loop) che permette al decoder di “bloccare” un flusso di bit digitali che dà una migliore uscita decodificata e immunità al rumore.
ASK – Amplitude Shift Keying
Come discusso sopra, per inviare i dati digitali via radio, questi moduli usano una tecnica chiamata Amplitude Shift Keying o ASK. In Amplitude Shift Keying l’ampiezza (cioè il livello) dell’onda portante (nel nostro caso è un segnale a 433MHz) viene cambiata in risposta al segnale dati in arrivo.
Questo è molto simile alla tecnica analogica di modulazione d’ampiezza che potresti conoscere se hai familiarità con la radio AM. A volte è chiamata binary amplitude shift keying perché ci sono solo due livelli che ci interessano. Puoi pensarla come un interruttore ON/OFF.
- Per il digitale 1 – Questo pilota la portante alla massima potenza.
- Per il digitale 0 – Questo taglia la portante completamente.
Ecco come appare la modulazione di ampiezza:
La modulazione di ampiezza ha il vantaggio di essere molto semplice da implementare. È abbastanza semplice progettare il circuito di decodifica. Anche ASK ha bisogno di meno larghezza di banda rispetto ad altre tecniche di modulazione come FSK (Frequency Shift Keying). Questa è una delle ragioni per essere poco costoso.
Lo svantaggio però è che ASK è suscettibile alle interferenze di altri dispositivi radio e al rumore di fondo. Ma finché si mantiene la trasmissione dei dati ad una velocità relativamente lenta, può funzionare in modo affidabile nella maggior parte degli ambienti.
Trasmettitore RF a 433MHz &Pinout del ricevitore
Diamo uno sguardo al pinout dei moduli trasmettitore e ricevitore RF a 433MHz.
Il pin DATA accetta i dati digitali da trasmettere. Questo può essere qualsiasi tensione continua positiva tra 3.5V e 12V. Si noti che l’uscita RF è proporzionale alla tensione di alimentazione cioè più alta è la tensione, maggiore sarà la gamma.
GND è un pin di terra.
Antenna è un pin per antenna esterna. Come discusso in precedenza, vorrete saldare un pezzo di filo solido di 17,3 cm a questo pin per una migliore portata.
VCC fornisce alimentazione al ricevitore. A differenza del trasmettitore, la tensione di alimentazione per il ricevitore deve essere di 5V.
I pin DATA emettono i dati digitali ricevuti. I due pin centrali sono internamente legati insieme, quindi è possibile utilizzare uno dei due per i dati in uscita.
GND è un pin di terra.
Antenna è un pin per l’antenna esterna che è spesso non segnato. È il pad in basso a sinistra del modulo, proprio accanto alla piccola bobina. Anche in questo caso, vorrete saldare un pezzo di filo solido da 17,3 cm a questo pin per migliorare la portata.
Cablaggio – Collegamento del trasmettitore e del ricevitore RF 433MHz ad Arduino UNO
Ora che sappiamo tutto sui moduli è il momento di metterli in uso!
Poiché invieremo i dati tra due schede Arduino, avremo ovviamente bisogno di due schede Arduino, due breadboard e un paio di fili di collegamento.
Il cablaggio del trasmettitore è abbastanza semplice. Ha solo tre connessioni. Collegare il pin VCC al pin 5V e GND a terra su Arduino. Il pin Data-In dovrebbe essere collegato al pin digitale #12 di Arduino. Dovresti provare a usare il pin 12 perché per default la libreria che useremo nel nostro sketch usa questo pin per l’ingresso dati.
L’illustrazione seguente mostra il cablaggio.
Una volta che hai il trasmettitore cablato puoi passare al ricevitore. Il cablaggio del ricevitore è facile come quello del trasmettitore.
Ancora una volta ci sono solo tre connessioni da fare. Collegare il pin VCC al pin 5V e GND a terra su Arduino. Uno qualsiasi dei due pin centrali Data-Out dovrebbe essere collegato al pin digitale #11 su Arduino.
Ecco come dovrebbe apparire il cablaggio per il ricevitore.
Ora che sia il trasmettitore che il ricevitore sono cablati dovremo scrivere del codice e inviarlo alle rispettive schede Arduino. Dato che probabilmente avete solo un PC, inizieremo con il trasmettitore. Una volta che il codice è stato caricato lì, passeremo al ricevitore. L’Arduino a cui è collegato il trasmettitore può quindi essere alimentato utilizzando un alimentatore o una batteria.
Libreria RadioHead – un coltellino svizzero per i moduli wireless
Prima di iniziare a codificare, c’è una libreria chiamata RadioHead che avremo bisogno di installare nel nostro IDE Arduino che renderà la scrittura del codice molto più semplice.
RadioHead è una libreria che permette un semplice trasferimento di dati tra schede Arduino. È così versatile che può essere usata per pilotare tutti i tipi di dispositivi di comunicazione radio, compresi i nostri moduli a 433MHz.
Quello che fa la libreria RadioHead è prendere i nostri dati, incapsularli in un pacchetto di dati che include un CRC (Cyclic Redundancy Check) e poi inviarli con il preambolo e l’intestazione necessari a un altro Arduino. Se i dati vengono ricevuti correttamente, l’Arduino ricevente viene informato che ci sono dati disponibili e procede alla decodifica e all’azione.
Il pacchetto RadioHead è composto come segue: Un flusso di 36 bit di coppie di bit “1” e “0”, chiamato “Training Preamble”, viene inviato all’inizio di ogni trasmissione. Questi bit sono necessari al ricevitore per regolare il suo guadagno prima di ricevere i dati effettivi. Segue un “Start Symbol” di 12 bit e poi vengono aggiunti i dati effettivi (carico utile).
A Frame Check Sequence o CRC viene aggiunto alla fine del pacchetto che viene ricalcolato da RadioHead alla fine del ricevitore e se il controllo CRC è corretto, il dispositivo ricevente viene avvisato. Se il controllo CRC fallisce, il pacchetto viene scartato.
L’intero pacchetto assomiglia a questo:
È possibile scaricare la libreria visitando il sito airspayce.com oppure, basta cliccare su questo pulsante per scaricare lo zip:
Per installarla, aprite l’IDE di Arduino, andate su Sketch > Include Library > Add .ZIP Library, e poi selezionate il file RadioHead che avete appena scaricato. Se hai bisogno di maggiori dettagli sull’installazione di una libreria, visita questo tutorial Installing an Arduino Library.
Codice Arduino – Per il trasmettitore RF 433MHz
Nel nostro esperimento invieremo un semplice messaggio di testo dal trasmettitore al ricevitore. Sarà utile per capire come usare i moduli e può servire come base per esperimenti e progetti più pratici.
Ecco lo sketch che useremo per il nostro trasmettitore:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_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);}
E’ uno sketch piuttosto breve ma è tutto ciò che serve per ottenere un segnale trasmesso.
Lo sketch inizia includendo la libreria RadioHead ASK. Abbiamo anche bisogno di includere la libreria Arduino SPI in quanto la libreria RadioHead dipende da essa.
#include <RH_ASK.h>#include <SPI.h>
Poi, abbiamo bisogno di creare un oggetto ASK per accedere alle funzioni speciali relative alla libreria RadioHead ASK.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
Nella funzione setup, abbiamo bisogno di inizializzare l’oggetto ASK.
// Initialize ASK Objectrf_driver.init();
Nella funzione loop, iniziamo a preparare un messaggio. È una semplice stringa di testo e memorizzata in un puntatore di carattere chiamato msg. Tenete a mente che, il vostro messaggio può essere qualsiasi cosa ma non dovrebbe superare i 27 caratteri per una migliore performance. E assicuratevi di contare il numero di caratteri in esso, poiché avrete bisogno di quel conteggio nel codice del ricevitore. Nel nostro caso, abbiamo 11 caratteri.
// Preparing a messageconst char *msg = "Hello World";
Il messaggio viene poi trasmesso utilizzando una funzione send()
. Ha due parametri: il primo è l’array di dati e il secondo è il numero di byte (lunghezza dei dati) da inviare. La funzione send()
è di solito seguita dalla funzione waitPacketSent()
che aspetta che qualsiasi pacchetto di trasmissione precedente abbia finito di essere trasmesso. Dopo di che lo sketch aspetta un secondo per dare al nostro ricevitore il tempo di prendere tutto.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Codice Arduino – Per il ricevitore RF 433MHz
Connetti il ricevitore Arduino al computer e carica il seguente codice:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_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; 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); }}
Proprio come il cade trasmettitore, il codice del ricevitore inizia caricando entrambe le librerie RadioHead e SPI e creando un oggetto ASK.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
Nella funzione setup: inizializziamo l’oggetto ASK e impostiamo anche il monitor seriale perché è così che vedremo il nostro messaggio ricevuto.
rf_driver.init();Serial.begin(9600);
Nella funzione loop: creiamo un buffer della stessa dimensione del messaggio trasmesso. Nel nostro caso, è 11, ricordate? Avrete bisogno di aggiustare questo per adattarlo alla lunghezza del vostro messaggio. Assicuratevi di includere tutti gli spazi e la punteggiatura perché contano come caratteri.
uint8_t buf;uint8_t buflen = sizeof(buf);
Poi, chiamiamo una funzione recv()
. Questo accende il ricevitore se non è già acceso. Se c’è un messaggio valido disponibile, copia il messaggio nel suo primo buffer di parametri e restituisce true, altrimenti restituisce false. Se la funzione ritorna true, lo sketch entra nella dichiarazione if e stampa il messaggio ricevuto sul monitor seriale.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Poi torniamo all’inizio del ciclo e rifacciamo tutto da capo.
Dopo aver caricato lo sketch aprite il vostro monitor seriale. Se tutto è a posto dovresti vedere il tuo messaggio.
Migliorare la portata dei moduli RF a 433MHz
L’antenna che usi sia per il trasmettitore che per il ricevitore può davvero influenzare la portata che potrai ottenere con questi moduli RF. Infatti senza un’antenna saresti fortunato a comunicare su una distanza di più di un metro.
Con un design adeguato dell’antenna, sarai in grado di comunicare su una distanza di 50 metri. Naturalmente questo è all’aperto in uno spazio aperto. La tua portata all’interno, specialmente attraverso i muri, sarà leggermente indebolita.
L’antenna non deve essere complicata. Un semplice pezzo di filo unipolare può essere un’eccellente antenna sia per il trasmettitore che per il ricevitore. Il diametro dell’antenna non ha quasi nessuna importanza, finché la lunghezza dell’antenna è mantenuta.
L’antenna più efficace ha la stessa lunghezza dell’onda per cui è usata. Per scopi pratici, la metà o un quarto di tale lunghezza sarà sufficiente.
La lunghezza d’onda di una frequenza si calcola come:
Lunghezza d’onda della frequenza = | Velocità di trasmissione (v) |
Frequenza di trasmissione (f) |
In aria, la velocità di trasmissione è uguale alla velocità della luce, che è 299.792.458 m/s per la precisione. Quindi, per la banda 433 MHz la lunghezza d’onda è:
Lunghezza d’onda della frequenza = | 299.792.458 m/s |
433.000.000 Hz | |
= | 0.6924 metri |
= | 69,24 cm |
Come antenna a onda piena 69,24 cm è un’antenna piuttosto lunga, non è molto pratica da usare. Ecco perché opteremo per un’antenna a un quarto d’onda che corrisponde a circa 17,3 cm o 6,8 pollici.
Per sicurezza, se stai sperimentando altri trasmettitori radio che usano frequenze diverse, puoi usare la stessa formula per calcolare la lunghezza dell’antenna necessaria. Abbastanza facile, vero?
Anche un’antenna di 17,3 cm può sembrare scomoda nel tuo piccolo progetto Arduino. Ma NON essere tentato di avvolgere l’antenna per renderla più compatta, perché questo avrà un serio impatto sulla portata. Un’antenna dritta è sempre la migliore!
.