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
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:
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.
sarebbere piu corretto 17.3 cm di antenna, cosi rischi molto.
Ciao Alfio,
quanto dici è esatto… λ = c/f …con:
λ = lunghezza d’onda
c = velocità della luce nel vuoto
f = frequenza
Perciò con frequenza uguale a 433MHz la lunghezza giusta per un quarto di onda corrisponderebbe a:
λ/4 = 0,173m = 17,3cm
A questo punto però sarebbe carino che tu spiegassi agli altri lettori del blog cosa intendi per “cosi rischi molto”…
Grazie per aver commento.
Antonio
esattamente, rischi perché potresti facilmente trasmettere frequenze che non sono 433 MHz , cosi facendo puoi avere prima di tutto un range maggiore e una frequenza molto vicina alla 433MHz, ovviamente non avremo un risultato perfetto ma quello che dobbiamo impegnarci a fare è tenerlo perfettamente dritto quando testiamo, molto carino questo tutorial comunnque, è l’unico decente che vedo in giro :), complimentie buona serata.