Modul RF este format dintr-un emițător și un receptor RF de 433 MHz. Acestea sunt module RF de tip ASK (Amplitude shift keying) sau OOK (Of Hook Keying). În timp ce transmite zero logic, emițătorul suprimă complet frecvența purtătoare și, prin urmare, consumă doar o putere redusă în timpul funcționării cu baterii. Atunci când se transmite unu logic, emițătorul este pornit, iar frecvența purtătoare este completă și, prin urmare, va exista o alimentare mare, care se situează în intervalul de aproximativ 4,5mA cu o sursă de alimentare de 3V.
Emițătorul și receptorul trebuie să fie interfațate cu microcontrolerele pentru transferul de date. Datele sunt trimise în serie de la emițător și sunt recepționate de un receptor acordat. Transmițătorul RF primește datele seriale de la un microcontroler și le transmite receptorului prin intermediul unei antene conectate la pinul 4 al emițătorului. Receptorul primește datele prin intermediul unei antene și transmite datele către microcontrolerul conectat la acesta.
Aceste module RF funcționează la o frecvență specifică de 433MHz. Semnalele RF pot călători între emițător și receptor chiar și atunci când există un obstacol. Aceste module sunt utilizate pentru comunicații simplex cu rază scurtă de acțiune, cu buget redus. Consumul redus de energie le face ideale pentru implementările bazate pe baterii. Este utilizat în diverse domenii, cum ar fi controlul la distanță al iluminatului, RFID cu rază lungă de acțiune, sisteme de alarmă și de securitate fără fir etc. Comunicațiile RF sunt utilizate în comunicațiile mobile și pot avea o rază lungă de comunicare, ceea ce le face potrivite pentru crearea de aplicații bazate pe IoT. Așadar, începem cu un articol introductiv despre modulele RF și despre modul în care modulele RF pot fi utilizate cu Arduino pentru a trimite și a primi date.
Modul emițător RF de 433 MHz
Acest mic modul este un emițător RF. Este foarte simplu. Rezonatorul SAW care este acordat pentru funcționarea la 433,xx MHz este inima modulului. Pe acesta se află un tranzistor de comutare și câteva componente pasive.
Când se dă un nivel logic HIGH ca intrare DATA, oscilatorul este ON și produce o undă purtătoare de ieșire RF constantă la 433,xx MHz, iar când intrarea DATA este logic LOW, oscilatorul este OFF, deci nu se produce nicio purtătoare. Această tehnică se numește Amplitude Shift Keying (ASK).
Specificații
- Tensiune de lucru: 3V – 12V
- Curent de lucru: max Mai puțin de 40mA, și min 9mA
- Mod de rezonanță: (SAW)
- Modul de modulație: ASK
- Frecvență de lucru: 433,92MHz
- Putere de emisie: 25mW
- Eroare de frecvență: +150kHz (max)
- Velocitate: mai mică de 10Kbps
- Distanța de transmisie: 90m (în spațiu deschis)
Modul receptor RF 433 MHz
Acesta este modulul receptor RF. Chiar dacă pare complex, este la fel de simplu ca și modulul emițător. Este alcătuit dintr-un circuit tuner RF, amplificatoare OP și un PLL. Câteva OP-Amps sunt folosite pentru a amplifica unda purtătoare primită de la emițător. Semnalul amplificat este apoi alimentat 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 mai bine decodificată și imunitate la zgomot.
Specificații
- Tensiune de lucru: 5,0VDC +0,5V
- Curent de lucru: ≤5,5mA max
- Modalitate de modulare: OOK/ASK
- Frecvența de lucru: 433.92MHz
- Lățime de bandă: 2MHz
- Sensibilitate: depășește -100dBm (50Ω)
Componente necesare
- Arduino Nano (2)
- Modul emițător RF 433MHz
- Modul receptor RF 433MHz
- Potențiometru
- LED (5)
- Cabluri de conectare
.
Schema circuitului
Schema circuitului pentru emițătorul RF folosind Arduino Nano este prezentată mai jos. Aici este conectat un potențiometru pentru a varia valorile care urmează să fie trimise la receptor folosind transmițătorul RF.
Detalii de mai jos sunt detaliile de conectare a pinilor între transmițătorul RF și Arduino
- Pinul D12 al lui Arduino – Pinul DATA al transmițătorului RF
- VCC al lui Arduino – VCC al transmițătorului RF
- GND al lui Arduino – GND al transmițătorului RF
- GND al Arduino – primul pin al potențiometrului
- A2 pin al Arduino – al doilea pin al potențiometrului
- VCC al Arduino – al treilea pin al potențiometrului
.
Schema de circuit pentru receptorul RF folosind Arduino Nano este prezentată mai jos. Aici avem o serie de LED-uri. LED-urile sunt decalate în funcție de valorile potențiometrului primite de receptor.
Mai jos sunt prezentate detaliile de conectare a pinilor între receptorul RF și Arduino
- Pinul D11 al Arduino – Pinul DATA al receptorului RF.
- VCC al Arduino – VCC al receptorului RF.
- GND al Arduino – GND al receptorului RF.
- Cablurile pozitive ale LED-urilor sunt conectate la pinii digitali D2, D3, D4, D5 și D6
- Cablurile negative ale LED-urilor sunt conectate la masă.
Explicație de codare
Codul Arduino complet atât pentru partea de emițător RF, cât și pentru partea de receptor sunt prezentate la sfârșitul acestui tutorial, aici explicăm programul complet pentru a înțelege funcționarea proiectului. Dar înainte de a începe cu codul, mai întâi trebuie să instalăm o bibliotecă în Arduino IDE.
Aici folosim biblioteca virtual wire. Descărcați biblioteca virtual wire de la link-ul de mai jos
https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip
VirtualWire este o bibliotecă Arduino care oferă caracteristici pentru a trimite mesaje scurte, fără adresare, confirmare sau retransmitere. Mesajele sunt trimise ca un pic ca UDP prin wireless folosind ASK (amplitude shift keying). Această bibliotecă suportă un număr de emițătoare și receptoare radio ieftine.
Pentru a adăuga biblioteca în Arduino IDE mergeți la Sketch>>Include library>>Add .ZIP library apoi încărcați biblioteca pe care ați descărcat-o de la link-ul de mai sus.
După ce ați încărcat programul, deschideți monitorul serial pe ambele părți și veți vedea ieșirile așa cum se arată mai jos.
Seara de la secțiunea emițătorului RF arată valorile potențiometrului.
Și ieșirea de la receptor arată valoarea senzorului recepționat. LED-urile sunt decalate în funcție de intervalul valorilor senzorului. Aici am dat un interval de 200 pentru fiecare LED.
Așa arată cum poate fi folosit Arduino în comunicarea bazată pe RF, verificați mai multe proiecte IoT bazate pe Arduino aici.
Codul pentru secțiunea Transmițător RF
#include <VirtualWire.h>
const int SensorPin = A2; // pinul potențiometrului
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT);
// pentru depanare
Serial.begin(9600);
// VirtualWire setup
vw_setup(2000); // Bits per sec
}
void loop()
{
// Citește și stochează datele senzorului 1
SensorData = analogRead(SensorPin);
// Conversia directă a datelor întregi în matrice Char
itoa(SensorData,SensorCharMsg,10);
// DEBUG
//Serial.print(„Sensor Integer: „);
Serial.print(SensorData); //imprimă datele senzorului
Serial.print(” Sensor CharMsg: „);
Serial.print(SensorCharMsg);
Serial.print(SensorCharMsg); //imprimă matricea de caractere
Serial.println(” „);
delay(100);
// END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); // trimite mesajul
vw_wait_tx(); // așteaptă până când întregul mesaj dispare
delay(200);
}}. // END void loop
Cod pentru secțiunea receptorului RF
#include <VirtualWire.h>
int SensorData; // Senzori
char SensorCharMsg; // Container de transmisie RF
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;
const int led4 = 5;
const int led5 = 6;
void setup()
{
Serial.begin(9600);
pinMode(led1, INPUT);
pinMode(led2, INPUT);
pinMode(led3, INPUT);
pinMode(led4, INPUT);
pinMode(led5, INPUT);
// VirtualWire
// Inițializați IO și ISR
// Necesar pentru DR3100
vw_set_ptt_inverted(true);
// Bits per sec
vw_setup(2000);
// Porniți PLL-ul receptorului în execuție
vw_rx_start();
} // END void setup
void loop()
{
uint8_t buf;
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Non-blocking
if (vw_get_message(buf, &buflen))
{
int i;
// Mesaj cu o sumă de control bună primit, aruncați-l.
for (i = 0; i < buflen; i++)
{
// Umpleți array-ul de caractere SensorCharMsg Char cu caracterele corespunzătoare
// din buffer.
SensorCharMsg = char(buf);
}
// Terminarea nulă a tabloului de caractere
// Acest lucru trebuie făcut în caz contrar vor apărea probleme
// când mesajele primite au mai puține cifre decât cele
// anterioare.
SensorCharMsg = ‘\0’;
// Convert Sensor1CharMsg Char array to integer
SensorData = atoi(SensorCharMsg);
// DEBUG
Serial.print(„Sensor „);
Serial.println(SensorData);
// END DEBUG
}
if (SensorData <= 200)
{
digitalWrite(led1, HIGH);
}
else
digitalWrite(led1, LOW);
if ( SensorData > 200 && SensorData <= 400)
{
digitalWrite(led2, HIGH);
}
else
digitalWrite(led2, LOW);
if ( SensorData > 400 && SensorData <= 600)
{
digitalWrite(led3, HIGH);
}
else
digitalWrite(led3, LOW);
if ( SensorData > 600 && SensorData <= 800)
{
digitalWrite(led4, HIGH);
}
else
digitalWrite(led4, LOW);
if ( SensorData > 800 && SensorData <= 1023)
{
digitalWrite(led5, HIGH);
}
else
digitalWrite(led5, LOW);
}
.