lunedì 9 settembre 2013

Trasmissione radio digitale a 433 MHz con Arduino

Con pochi euro si possono trovare coppie di trasmettitore e ricevitore radio a 433 MHz per far dialogare due schede Arduino nell'arco di qualche decina di metri
Attenzione : vengono venduti componenti, molto simili nell'aspetto, che lavorano a 315 MHz. Il codice e' identico per le due versioni di frequenza, l'importante e' non mischiare un trasmettitore a 433 MHz ed un ricevitore a 315 MHz

La libreria di riferimento per questo tipo di componenti e' VirtualWire

Le connessioni sono molto semplice perche' sono sufficienti tre fili
Vcc (da 5 a 12 V)
GND
Dati

(il ricevitore ha 4 pin ma i due pin centrali normalmente portano entrambi il segnale dati)
Al momento dell'acquisto conviene comprare componenti provvisti di antenna (nella foto si vede che l'antenna del trasmettitore e' stata aggiunta in un secondo momento mentre il ricevitore ha una antenna spiralata)
Di default il pin di trasmissione e' settato sul D12 mentre il pin di ricezione di default e' sul pin D11 (questi possono essere modificato tramite vw_set_tx_pin(nr_pin) e vw_set_rx_pin(nr_pin);

Nella foto un esempio di trasmissione tra due Arduino Nano


In rosso trasmettitore, in verde ricevitore

Attenzione: i componenti vengono venduti senza antenna. E' necessario aggiungere una antenna di 17 cm per i sensori a 433 MHz e 21 cm per i sensori a 315 MHz

Prove effettuate in campo hanno mostrato che il segnale si segue in spazio aperto fino a oltre 150 m con alimentazione a 5 V e baud rate di 200 bit/s

Trasmettitore
--------------------------------------------------------------
#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);  // Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000); // Bits per sec
}

void loop()
{
    const char *msg = "hello";

    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    delay(200);
}
--------------------------------------------------------------


Ricevitore
--------------------------------------------------------------
#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600); // Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000); // Bits per sec

    vw_rx_start();       // Start the receiver PLL running
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
int i;

        digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
   Serial.print(buf[i], HEX);
   Serial.print(" ");
}
Serial.println("");
        digitalWrite(13, false);
    }
}
--------------------------------------------------------------

6 commenti:

  1. Salve ottimo articolo complimenti. Per quanto riguarda di fare attenzione alla frequenza dei trasmettitori non riesco come fare per capire di quale si tratta. Io ho comprato 10 trasmettitori e 10 ricevitori ed erano già mischiati tra loro.
    Ti faccio questa domanda perchè è da molto tempo che sto cercando di provare la comunicazione con diversi articoli trovati sulla rete ma ancora non vedo nessun risultato. Potresti gentilmente aiutarmi?

    RispondiElimina
  2. Bella domanda, io per svariati motivi (il primo fra tutti e' il prezzo) compro spesso componenttistica Arduino su E-Commerce cinese. Costano poco ma la documentazione e' praticamente inesistente e l'intergrato e' siglato con un identificativo non facilmente riconoscibile. Una volta ho fatto anche io confusione ma avendo solo due coppie di tx/rx con un semplice try and test ne sono venuto a capo. Spiacente di non essere di maggiore aiuto

    RispondiElimina
  3. Riguardando le foto mi sono accorto di una cosa, sul quarzo del trasmettitore (almeno sui miei) e' incisa la frequenza di trasmissione
    Come esempio vedere la differenza tra questo (il primo a 315 ed il secondo a 433)

    http://www.dx.com/p/tdl-9906a-315mhz-wireless-transmitter-module-green-126105#.VJAgmNKG8tE

    e questo

    http://www.dx.com/p/433mhz-wireless-transmitter-module-superregeneration-for-arduino-green-149254#.VJAfltKG8tE

    RispondiElimina
  4. Buongiorno,
    ho provato a ripetere questo progetto. La trasmissione avviene senza problemi ma non ricevo nulla. In realtà ho provato altri progetti utilizzando questi moduli wireless ma da 1 settimana non mi va più la parte della ricezione. Ho comprato altre coppie Tx e Rx per vedere se il problema fosse il loro malfunzionamento, ma con tutti ho questo problema delle ricezione. I codici e gli schemi circuitali sono corretti perchè come detto prima fino a 10 giorni fa andavano. Saprebbe darmi qualche consiglio per risolvere questo problema?
    Grazie e buona giornata.

    RispondiElimina
  5. Buongiorno,
    ho provato a ripetere il suo progetto con i moduli wireless ma ho problemi con la parte del ricevitore. In realtà ho provato altri progetti semplici per testare questi moduli ma ho sempre problemi con il Rx. Un paio di settimane fa le cose invece andavano senza problemi, e all'improvviso ho iniziato ad avere problemi. Pensando fosse causato dal malfunzionamento dei moduli ne ho comprati altri ma ho sempre problemi con la parte di ricezione. Saprebbe darmi gentilmente qualche consiglio per poter risolvere questo problema? La ringrazio e le auguro una buona giornata.

    RispondiElimina
    Risposte
    1. difficile da capire il problema...peraltro non ho capito come ha fatto a determinare che il problema e' nella ricezione e non nella trasmissione (molto banalmente se l'emettitore non manda segnali non ci sara' mai ricezione). Come indicato nel precedente commento ci possono essere problemi ad accoppiare le giuste frequenze e comunque se comprati su mercato cinese ci puo' anche essere il problema di un difetto di origine del modulo (mi capita con una certa frequenza di comprare prodotti cinesi a bassissimo costo ma di altrettanto bassa qualita'/durata)

      Elimina

Dockerizza Flask

Un esempio semplice per inserire in un container Docker una applicazione Flask Partiamo da una semplice applicazione che ha un file app.py ...