RX TX con i moduli economici – Arduino

$_57[1] 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:
fs1000a
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:
fs1000arx

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:

txwaveform

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.