Vreți să adăugați capabilități wireless la următorul dvs. proiect Arduino, pentru mai puțin decât prețul unei cești de cafea? Ei bine, atunci modulele emițător și receptor RF de 433MHz sunt tocmai pentru tine! Acestea pot fi adesea obținute online pentru mai puțin de doi dolari pentru o pereche, ceea ce le face una dintre cele mai ieftine opțiuni de comunicare de date pe care le puteți obține. Și cel mai bun dintre toate, aceste module sunt super mici, permițându-vă să încorporați o interfață wireless în aproape orice proiect.
Hardware Overview
Să aruncăm o privire mai atentă la modulele 433MHz RF Transmitter and Receiver Modules.
Acest mic modul este un emițător între doi. Este foarte simplu, așa cum pare. Inima modulului este rezonatorul SAW care este reglat pentru funcționarea la 433,xx MHz. Există un tranzistor de comutare și câteva componente pasive, asta este tot.
Când se aplică un nivel logic HIGH la intrarea DATA, oscilatorul funcționează producând o undă purtătoare de ieșire RF constantă la 433,xx MHz și când intrarea DATA este dusă la nivelul logic LOW, oscilatorul se oprește. Această tehnică este cunoscută sub numele de Amplitude Shift Keying, pe care o vom discuta în detaliu în scurt timp.
Acesta este un modul receptor. Deși pare complex, el este la fel de simplu ca și modulul emițător. Acesta este format dintr-un circuit acordat RF și câteva amplificatoare OP pentru a amplifica unda purtătoare primită de la emițător. Semnalul amplificat este alimentat în continuare la un PLL (Phase Lock Loop) care permite decodorului să se „blocheze” pe un flux de biți digitali, ceea ce oferă o ieșire decodată mai bună și imunitate la zgomot.
ASK – Amplitude Shift Keying
După cum s-a discutat mai sus, pentru a trimite date digitale prin radio, aceste module utilizează o tehnică numită Amplitude Shift Keying sau ASK. În Amplitude Shift Keying, amplitudinea (adică nivelul) undei purtătoare (în cazul nostru este un semnal de 433MHz) este modificată ca răspuns la semnalul de date primit.
Acest lucru este foarte asemănător cu tehnica analogică a modulației de amplitudine cu care s-ar putea să fiți familiarizați dacă sunteți familiarizați cu radio AM. Se numește uneori „binary amplitude shift keying” pentru că există doar două niveluri care ne interesează. Vă puteți gândi la ea ca la un comutator ON/OFF.
- Pentru Digital 1 – Aceasta conduce purtătoarea la putere maximă.
- Pentru Digital 0 – Aceasta taie purtătoarea complet.
Aceasta este modularea în amplitudine cum arată:
Modularea prin deplasare în amplitudine are avantajul de a fi foarte simplu de implementat. Este destul de simplu să se proiecteze circuitul de decodare. De asemenea, ASK necesită o lățime de bandă mai mică decât alte tehnici de modulație precum FSK (Frequency Shift Keying). Acesta este unul dintre motivele pentru care este ieftin.
Dezavantajul este însă că ASK este susceptibil la interferențe de la alte dispozitive radio și la zgomot de fond. Dar atâta timp cât mențineți transmisia de date la o viteză relativ mică, poate funcționa în mod fiabil în majoritatea mediilor.
433MHz RF Transmitter & Receiver Pinout
Să aruncăm o privire la pinout-ul modulelor de 433MHz RF Transmitter și Receiver.
Pin-ulDATA acceptă datele digitale care urmează să fie transmise.
VCC furnizează energie pentru emițător. Aceasta poate fi orice tensiune continuă pozitivă între 3,5 V și 12 V. Rețineți că ieșirea RF este proporțională cu tensiunea de alimentare, adică cu cât tensiunea este mai mare, cu atât raza de acțiune va fi mai mare.
GND este un pin de masă.
Antenna este un pin pentru antena externă. După cum s-a discutat mai devreme, veți dori să lipiți o bucată de 17,3 cm de fir solid la acest pin pentru o rază de acțiune îmbunătățită.
VCC furnizează energie pentru receptor. Spre deosebire de emițător, tensiunea de alimentare pentru receptor trebuie să fie de 5 V.
PiniDATA dau la ieșire datele digitale primite. Cei doi pini centrali sunt legați între ei la nivel intern, astfel încât puteți folosi oricare dintre ei pentru ieșirea datelor.
GND este un pin de masă.
Antenna este un pin pentru antena externă care este adesea nemarcat. Este plăcuța din stânga jos a modulului, chiar lângă bobina mică. Din nou, veți dori să lipiți o bucată de 17,3 cm de sârmă solidă la acest pin pentru o rază de acțiune îmbunătățită.
Cablare – Conectarea emițătorului și receptorului RF de 433MHz la Arduino UNO
Acum că știm totul despre module, este timpul să le punem în funcțiune!
Pentru că vom trimite date între două plăci Arduino, vom avea nevoie, bineînțeles, de două plăci Arduino, două breadboard-uri și câteva fire de jumper.
Cablarea pentru emițător este destul de simplă. Acesta are doar trei conexiuni. Conectați pinul VCC la pinul 5V și GND la masă pe Arduino. Pinul Data-In trebuie să fie conectat la pinul digital #12 al Arduino. Ar trebui să încercați să folosiți pinul 12 deoarece, în mod implicit, biblioteca pe care o vom folosi în schița noastră folosește acest pin pentru intrarea de date.
Următoarea ilustrație arată cablarea.
După ce ați cablat emițătorul puteți trece la receptor. Cablarea receptorului este la fel de ușoară ca și cea a emițătorului.
Încă o dată trebuie făcute doar trei conexiuni. Conectați pinul VCC la pinul 5V și GND la masă pe Arduino. Oricare dintre cei doi pini Data-Out din mijloc trebuie conectați la pinul digital #11 de pe Arduino.
Așa ar trebui să arate cablarea pentru receptor.
Acum că atât emițătorul cât și receptorul sunt cablate, va trebui să scriem niște cod și să îl trimitem la plăcile Arduino respective. Deoarece probabil că aveți doar un singur PC, vom începe cu emițătorul. După ce codul a fost încărcat acolo, vom trece la receptor. Arduino la care este conectat emițătorul poate fi apoi alimentat folosind o sursă de alimentare sau o baterie.
RadioHead Library – un cuțit elvețian pentru modulele wireless
Înainte de a începe să codificăm, există o bibliotecă numită RadioHead pe care va trebui să o instalăm în IDE-ul nostru Arduino și care va face scrierea codului mult mai simplă.
RadioHead este o bibliotecă ce permite transferul simplu de date între plăcile Arduino. Este atât de versatilă încât poate fi folosită pentru a conduce tot felul de dispozitive de comunicații radio, inclusiv modulele noastre de 433MHz.
Ce face biblioteca RadioHead este să ia datele noastre, să le încapsuleze într-un pachet de date care include un CRC (Cyclic Redundancy Check) și apoi să le trimită cu preambulul și antetul necesar către un alt Arduino. Dacă datele sunt recepționate corect, Arduino-ul care le primește este informat că există date disponibile și procedează la decodarea și acțiunea acestora.
Pachetul RadioHead este alcătuit după cum urmează: La începutul fiecărei transmisii se trimite un flux de 36 de biți de perechi de biți „1” și „0”, numit „Preambul de instruire”. Acești biți sunt necesari pentru ca receptorul să își ajusteze câștigul înainte de a primi datele efective. Urmează un „Simbol de pornire” de 12 biți și apoi se adaugă datele efective (sarcina utilă).
La sfârșitul pachetului se adaugă o secvență de verificare a cadrului sau CRC (Frame Check Sequence), care este recalculată de RadioHead la capătul receptorului, iar dacă verificarea CRC este corectă, dispozitivul receptor este alertat. Dacă verificarea CRC eșuează, pachetul este respins.
Întregul pachet arată cam așa:
Puteți descărca biblioteca, vizitând site-ul airspayce.com sau, pur și simplu faceți clic pe acest buton pentru a descărca fișierul zip:
Pentru a o instala, deschideți Arduino IDE, mergeți la Sketch > Include Library > Add .ZIP Library, și apoi selectați fișierul RadioHead pe care tocmai l-ați descărcat. Dacă aveți nevoie de mai multe detalii despre instalarea unei biblioteci, vizitați acest tutorial Instalarea unei biblioteci Arduino.
Codul Arduino – Pentru emițătorul RF de 433MHz
În experimentul nostru vom trimite doar un simplu mesaj text de la emițător la receptor. Va fi util pentru a înțelege cum se utilizează modulele și poate servi ca bază pentru experimente și proiecte mai practice.
Iată schița pe care o vom folosi pentru emițătorul nostru:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init();} void loop(){ const char *msg = "Hello World"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);}
Este o schiță destul de scurtă, dar este tot ce aveți nevoie pentru a transmite un semnal.
Schița începe prin includerea bibliotecii RadioHead ASK. De asemenea, trebuie să includem biblioteca Arduino SPI, deoarece biblioteca RadioHead este dependentă de aceasta.
#include <RH_ASK.h>#include <SPI.h>
În continuare, trebuie să creăm un obiect ASK pentru a accesa funcțiile speciale legate de biblioteca RadioHead ASK.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
În funcția de configurare, trebuie să inițializăm obiectul ASK.
// Initialize ASK Objectrf_driver.init();
În funcția de buclă, începem prin a pregăti un mesaj. Acesta este un simplu șir de text și este stocat într-un pointer de caractere numit msg. Rețineți că, mesajul poate fi orice, dar nu trebuie să depășească 27 de caractere pentru o performanță mai bună. Și asigurați-vă că numărați numărul de caractere din el, deoarece veți avea nevoie de acest număr în codul receptorului. În cazul nostru, avem 11 caractere.
// Preparing a messageconst char *msg = "Hello World";
Mesajul este apoi transmis cu ajutorul unei funcții send()
. Aceasta are doi parametri: primul este matricea de date și al doilea este numărul de octeți (lungimea datelor) care urmează să fie transmis. Funcția send()
este urmată, de obicei, de funcția waitPacketSent()
care așteaptă până când orice pachet de transmisie anterior se termină de transmis. După aceea, schița așteaptă o secundă pentru a da timp receptorului nostru să recepționeze totul.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Codul Arduino – Pentru receptorul RF de 433MHz
Conectați Arduino receptor la calculator și încărcați următorul cod:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init(); // Setup Serial Monitor Serial.begin(9600);} void loop(){ // Set buffer to size of expected message uint8_t buf; uint8_t buflen = sizeof(buf); // Check if received packet is correct size if (rf_driver.recv(buf, &buflen)) { // Message received with valid checksum Serial.print("Message Received: "); Serial.println((char*)buf); }}
La fel ca și în cazul emițătorului, codul receptorului începe prin încărcarea bibliotecilor RadioHead și SPI și crearea unui obiect ASK.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
În funcția de configurare: inițializăm obiectul ASK și, de asemenea, configurăm monitorul serial, deoarece acesta este modul în care vom vizualiza mesajul primit.
rf_driver.init();Serial.begin(9600);
În funcția de buclă: creăm un buffer de aceeași dimensiune ca și mesajul transmis. În cazul nostru, este 11, vă amintiți? Va trebui să ajustați acest lucru pentru a se potrivi cu lungimea mesajului dumneavoastră. Asigurați-vă că includeți toate spațiile și semnele de punctuație, deoarece toate acestea contează ca și caractere.
uint8_t buf;uint8_t buflen = sizeof(buf);
În continuare, apelăm o funcție recv()
. Aceasta pornește receptorul, dacă nu este deja pornit. Dacă există un mesaj valid disponibil, copiază mesajul în bufferul primului său parametru și returnează true, altfel returnează false. Dacă funcția returnează true, schița intră în declarația if și tipărește mesajul primit pe monitorul serial.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Apoi ne întoarcem la începutul buclei și o luăm de la capăt.
După încărcarea schiței deschideți monitorul serial. Dacă totul este în regulă, ar trebui să vedeți mesajul.
Îmbunătățirea razei de acțiune a modulelor RF de 433MHz
Antena pe care o folosiți atât pentru emițător cât și pentru receptor poate afecta cu adevărat raza de acțiune pe care o veți putea obține cu aceste module RF. De fapt, fără o antenă, veți fi norocos dacă veți reuși să comunicați pe o distanță mai mare de un metru.
Cu o antenă proiectată corespunzător, veți putea comunica pe o distanță de 50 de metri. Bineînțeles că asta se întâmplă în aer liber, într-un spațiu deschis. Raza dvs. de acțiune în interior, în special prin pereți, va fi ușor slăbită.
Antrena nu trebuie să fie complicată. O simplă bucată de sârmă cu un singur miez poate fi o antenă excelentă atât pentru emițător cât și pentru receptor. Diametrul antenei nu are aproape nici o importanță, atâta timp cât lungimea antenei este menținută.
Cea mai eficientă antenă are aceeași lungime ca și lungimea undei pentru care este folosită. În scopuri practice, jumătate sau un sfert din această lungime va fi suficientă.
Lungimea de undă a unei frecvențe se calculează astfel:
Lungimea de undă a frecvenței = | Viteza de transmisie (v) |
Frecvența de transmisie (f) |
În aer, viteza de transmisie este egală cu viteza luminii, care este de 299.792.458 m/s mai exact. Deci, Pentru banda de 433 MHz lungimea de undă este:
Lungimea de undă a frecvenței = | 299,792,458 m/s |
433,000,000 Hz | |
= | 0.6924 metri |
= | 69,24 cm |
Cum antena de 69,24 cm cu undă completă este o antenă destul de lungă, nu este foarte practic de utilizat. De aceea, vom opta pentru o antenă cu un sfert de undă, care are o lungime de aproximativ 17,3 cm sau 6,8 inci.
Pentru orice eventualitate, dacă experimentați cu alte emițătoare radio care folosesc frecvențe diferite, puteți folosi aceeași formulă pentru a calcula lungimea necesară a antenei. Destul de ușor, nu-i așa?
Chiar și o antenă de 17,3 cm poate părea incomodă în micul dumneavoastră proiect Arduino. Dar NU fiți tentat să înfășurați antena pentru a o face mai compactă, deoarece acest lucru va afecta serios raza de acțiune. O antenă dreaptă este întotdeauna cea mai bună!