Come utilizzare questi modulini RX TX molto economici con Arduino? Semplice, grazie all’uso di una apposita libreria.
La libreria in questione:
http://www.airspayce.com/mikem/arduino/RadioHead/classRH__ASK.html
permette di utilizzare tali moduli con semplicità, evitando al programmatore di scrivere il codice di implementazione della trasmissione e della ricezione. In Aruino basterà defnire una nuova istanza della classe RH_ASK ed utilizzarla con un semplice “send” in trasmissione oppure “receive” in ricezione.
Questi modulini economici hanno una portata di svariati metri (anche decine) in campo libero, in casa dobbiamo accontentarci di qualche metro e molto dipende da quanti muri sono frapposti tra il ricevitore ed il trasmettitore.
Ma vediamoli più da vicino. Il trasmettitore:
Il trasmettitore, piccolissimo, delle dimensione di 2x2cm può essere alimentato da 3 a 12v ed in base alla tensione di alimentazione fronirà più o meno potenza. Al terminale DATA va connesso il pin di Arduino per la trasmissione dei dati. Il pin può essere scelto, in fase di compilazione dello sketch, durante l’assegnazione della classe. Ad esempio:
RH_ASK tx(2000, 11, 12);
Definisce la velocità a 2000baud, il piedino 11 come RX ed il 12 come TX.
Successivamente dovremo inizializzare la classe con init:
if (!tx.init()) {… // ERRORE INIZIALIZZAZIONE
Ora siamo in grado di trasmettere:
const char *msg = “A00001C00002”;
tx.send((uint8_t *)msg, strlen(msg)); // INVIA msg
tx.waitPacketSent(); // ATTENDE FINO A CHE LA TRASMISSIONE E’ COMPLETA
Semplice vero?
Il ricevitore:
Il modulo va alimentato a 5V mentre il pin DATA andrà sull’ingresso di arduino (pin 11 nel nostro caso, definito come RX).
Per ricevere:
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv((uint8_t *)buf, &buflen)) {… // NON-BLOCKING
Di seguito due listati, uno per il TX e l’altro per l’RX
// LISTATO TX #include "RH_ASK.h" #include "SPI.h" // Non usata ma utilizzata per compilare correttamente RH_ASK tx(2000, 11, 12); // pin 12=TX int led = 13; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); // Debugging if (!tx.init()) Serial.println("Inizializzazione modulo fallita!"); } void loop() { const char *msg = "A00001C00002"; // tx.send((uint8_t *)msg, strlen(msg)); tx.waitPacketSent(); digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } ==================================== // LISTATO RX #include "RH_ASK.h" #include "SPI.h" // Non usata ma utilizzata per compilare correttamente RH_ASK rx(2000, 11, 12); // PIN 11 RX const int led = 13; const byte MAXLEN = 12; // LUNGHEZZA MASSIMA DEL MESSAGGIO const int MODULENUMBER = 1; // NUMERO MODULO IN TRASMISSIONE void setup() { pinMode(led, OUTPUT); Serial.begin(9600); // Debugging if (!rx.init()) Serial.println("Inizializzazione modulo fallita!"); } void loop() { uint8_t buf[MAXLEN]; uint8_t buflen = sizeof(buf); char iAddress; char Address[5]; char iCommand; char Command[5]; if (rx.recv((uint8_t *)buf, &buflen)) // Non-blocking { iAddress=buf[0]; Address[0]=buf[1]; Address[1]=buf[2]; Address[2]=buf[3]; Address[3]=buf[4]; Address[4]=buf[5]; iCommand=buf[6]; Command[0]=buf[7]; Command[1]=buf[8]; Command[2]=buf[9]; Command[3]=buf[10]; Command[4]=buf[11]; int a = atoi(Address); int c = atoi(Command); // Se l'indirizzo del modulo è corretto e siamo in presenza di un comando allora accende il led per 100mS if ((iAddress=='A') && (iCommand=='C') && (a==MODULENUMBER)) { digitalWrite(led, HIGH); // Comando su indirizzo valido ricevuto delay(100); digitalWrite(led, LOW); } } }
Con la libreria il Arduino può essere utilizzato sia per ricevere che per trasmettere, in questo caso dovremo dotarlo sia di un ricevitore che di un trasmettitore. Verngono utili a tale proposito le istruzioni della libreria:
SetModeTX();
SetModeRx();
Burst di trasmissione dell’esempio sopracitato: