Arduino: comunicazione senza fili con i moduli RF 433Mhz

In questo articolo presentiamo una semplice connessione RF 433 mhz tramite l’ausilio di due modulini tra Arduino ed unATmega328p o se vogliamo un Arduino standalone su breadboard.

L’uso di questi modulini può essere applicato in svariati progetti, laddove non fosse possibile l’impiego di cavetti o fili, ad esempio potremmo pensare ad un Arduino predisposto come web server e a tutti i svariati client magari distribuiti per la casa, dove non fosse possibile raggiungerli tramite i fili.

Ecco come si presentano i modulini RF 433 mhz

arduino_moduli_rf_433_mhz

 

Per poter farli comunicare tra di loro è necessaria una libreria, in questo articolo userò quella sviluppata da Mike McCauley cioèVirtualWire che possiamo scaricare da internet.

I collegamenti:

arduino_collegamenti_moduli_rf (1)

arduino_collegamenti_moduli_rf

N.B.
Come potete notare dalle foto, ho saldato un filo da 15cm 17,3cm come antenna sia sulla ricevente che sulla trasmittente.

Colleghiamo Vcc e Gnd di Arduino sulla breadboard, e poi colleghiamo successivamente Vcc e Gnd di tutti i i componenti alla breadboard.
Adesso colleghiamo uno solo dei due pin DATA della ricevente al pin 11 di Arduino ed il pin DATA della trasmittente al pin 12 dell’ATmega328p

Passiamo agli sketch

N.B.
Gli sketch sono presi direttamente dagli esempi della libreria.

Questo è lo sketch da caricare su Arduino che funge da ricevente:

#include <VirtualWire.h>


const int led_pin = 13;
const int transmit_pin = 12;
const int receive_pin = 11;
const int transmit_en_pin = 3;

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

  // Initialise the IO and ISR
  vw_set_tx_pin(transmit_pin);
  vw_set_rx_pin(receive_pin);
  vw_set_ptt_pin(transmit_en_pin);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);  // Bits per sec
  vw_rx_start();       // Start the receiver PLL running

  pinMode(led_pin, OUTPUT);
}


void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  
  if (vw_get_message(buf, &buflen)) {
    int i;
    digitalWrite(led_pin, HIGH); // 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(led_pin, LOW);
  }
}

Questo è lo sketch da caricare sull’ATmega328p che funge da trasmittente:

#include <VirtualWire.h>

const int led_pin = 11;
const int transmit_pin = 12;
const int receive_pin = 2;
const int transmit_en_pin = 3;
byte count = 1;

void setup()
{
  // Initialise the IO and ISR
  vw_set_tx_pin(transmit_pin);
  vw_set_rx_pin(receive_pin);
  vw_set_ptt_pin(transmit_en_pin);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);       // Bits per sec

  pinMode(led_pin, OUTPUT);
}

void loop()
{
  char msg[7] = {'h', 'e', 'l', 'l', 'o', ' ', '#'};
  msg[6] = count;

  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting

  vw_send((uint8_t *)msg, 7);
  vw_wait_tx(); // Wait until the whole message is gone

  digitalWrite(led_pin, LOW);
  delay(1000);

  count = count + 1;
}

Adesso siamo pronti per comandare i nostri dispositivi a distanza.

Qui il link all’articolo per realizzare Arduino su breadboard.

  • Share post