RF-modulet består af en 433 MHz RF-sender og et modtagermodul. Disse er RF-moduler af typen ASK (Amplitude shift keying) eller OOK (Of Hook Keying). Under transmissionen af logisk nul undertrykker senderen fuldt ud bærefrekvensen og har derfor kun et lavt strømforbrug ved batteridrift. Når logisk et sendes, er senderen tændt, og bærefrekvensen er fuld, og der vil derfor være en høj strømforsyning på omkring 4,5 mA med en 3 V strømforsyning.
Senderen og modtageren skal forbindes med mikrocontrollere til dataoverførsel. Dataene sendes serielt fra senderen og modtages af en afstemt modtager. RF-senderen modtager serielle data fra en mikrocontroller og sender dem til modtageren via en antenne, der er forbundet til senderens 4. pin. Modtageren modtager dataene via en antenne og giver dataene videre til den mikrocontroller, der er tilsluttet den.
Disse RF-moduler arbejder ved en bestemt frekvens på 433 MHz. RF-signaler kan bevæge sig mellem sender og modtager, selv når der er en forhindring. Disse moduler anvendes til kort rækkevidde, lavt budget, simplex-baseret kommunikation. Det lave strømforbrug gør dem ideelle til batteribaserede implementeringer. De anvendes inden for forskellige områder som f.eks. fjernbetjening af belysning, RFID med lang rækkevidde, trådløse alarm- og sikkerhedssystemer osv. RF-kommunikation anvendes til mobilkommunikation og kan have lang rækkevidde, og det er det, der gør dem velegnede til at opbygge IoT-baserede applikationer. Så her starter vi med en indledende artikel om RF-moduler, og hvordan RF-moduler kan bruges med Arduino til at sende og modtage data.
433 MHz RF Transmitter Module
Dette lille modul er RF-senderenheden. Det er meget enkelt. SAW-resonatoren, som er afstemt til 433,xx MHz-drift, er modulets hjerte. Der er en skiftetransistor og nogle få passive komponenter på den.
Når der gives et logisk HIGH som DATA-indgang, er oscillatoren ON og producerer en konstant RF-udgangsbølge på 433,xx MHz, og når DATA-indgangen er logisk LOW, er oscillatoren OFF, så der ikke produceres nogen bærer. Denne teknik kaldes Amplitude Shift Keying (ASK).
Specifikationer
- Arbejdsspænding: 3V – 12V
- Arbejdsstrøm: max Mindre end 40mA, og min 9mA
- Resonanstilstand: (SAW)
- Modulationstilstand: (SAW)
- Modulationstilstand: (SAW) ASK
- Arbejdsfrekvens: 433.92MHz
- Sendeeffekt: 25mW
- Frekvensfejl: +150kHz (max)
- Frekvensfejl: +150kHz (max)
- Sendevidde: 90m (i åbent rum)
433 MHz RF-modtagermodul
Dette er RF-modtagermodulet. Selv om det ser komplekst ud, er det lige så enkelt som sendermodulet. Det består af et RF-tunerkredsløb, OP-forstærkere og en PLL. Et par OP-Amps bruges til at forstærke den bærebølge, der modtages fra senderen. Det forstærkede signal føres derefter til en PLL (Phase Lock Loop), som gør det muligt for dekoderen at “låse” sig fast på en strøm af digitale bits, hvilket giver bedre dekodet output og støjimmunitet.
Specifikationer
- Arbejdsspænding: 5,0VDC +0,5V
- Arbejdsstrøm:≤5,5mA max
- Moduleringstilstand: OOK/ASK
- Arbejdsfrekvens: 433.92MHz
- Breddebredde: 2MHz
- Følsomhed: overstiger -100dBm (50Ω)
Nødvendige komponenter
- Arduino Nano (2)
- RF 433MHz-sendemodul
- RF 433MHz-modtagermodul
- RF 433MHz-modtagermodul
- Potentiometer
- LED (5)
- Forbindelseskabler
Kredsløbsdiagram
Kredsløbsdiagrammet for RF-sender ved hjælp af Arduino Nano er angivet nedenfor. Her er der tilsluttet et potentiometer for at variere de værdier, der skal sendes til modtageren ved hjælp af RF-senderen.
Nedenfor vises pin-forbindelserne mellem RF-senderen og Arduino
- D12 pin af Arduino – DATA pin af RF-senderen
- VCC af Arduino – VCC af RF-senderen
- GND af Arduino – GND af RF-senderen
- GND af Arduino – første pin af potentiometeret
- A2 pin af Arduino – anden pin af potentiometeret
- VCC af Arduino – tredje pin af potentiometeret
Kredsløbsdiagrammet for RF-modtager ved hjælp af Arduino Nano er vist nedenfor. Her har vi en række lysdioder. Lysdioderne forskydes baseret på potentiometerværdierne, der modtages af modtageren.
Nedenfor er Pin-forbindelserne detaljer mellem RF-modtager og Arduino
- D11 pin af Arduino – DATA pin af RF-modtager.
- VCC af Arduino – VCC af RF-modtager.
- GND af Arduino – GND af RF-modtager.
- Positive ledninger af lysdioder er forbundet til de digitale stifter D2, D3, D4, D5 og D6
- Negative ledninger af lysdioderne er jordet.
Kodeforklaring
Komplet Arduino-kode for både RF-sender og modtagersiden er givet i slutningen af denne vejledning, her forklarer vi det komplette program for at forstå projektets funktion. Men før vi starter med koden, skal vi først installere et bibliotek i Arduino IDE.
Her bruger vi det virtuelle trådbibliotek. Download virtual wire library fra nedenstående link
https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip
VirtualWire er et Arduino-bibliotek, der giver funktioner til at sende korte meddelelser, uden adressering, kvittering eller retransmission. Meddelelserne sendes som lidt ligesom UDP over trådløst ved hjælp af ASK (amplitude shift keying). Dette bibliotek understøtter en række billige radiosendere og -modtagere.
For at tilføje biblioteket i Arduino IDE skal du gå til Sketch>>Include library>>Add .ZIP library og derefter uploade det bibliotek, som du har downloadet fra ovenstående link.
Når du har uploadet programmet, skal du åbne seriel monitor på begge sider, og du vil se udgangene som vist nedenfor.
Output på RF-sendersektionen viser værdierne for potentiometeret.
Og output på modtageren viser den modtagne sensorværdi. Lysdioderne er forskudt i overensstemmelse med sensorværdiernes område. Her har vi givet et område på 200 for hver LED.
Så dette er hvordan Arduino kan bruges i RF-baseret kommunikation, tjek flere Arduino-baserede IoT-projekter her.
Kode til RF-sendersektionen
#include <VirtualWire.h>
const int SensorPin = A2; // potentiometerpin
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT);
/// til debugging
Serial.begin(9600);
// VirtualWire setup
vw_setup(2000); // Bits per sek
}
void loop()
{
// Læs og gemmer Sensor 1 data
SensorData = analogRead(SensorPin);
// Konverter hele taldata direkte til Char-array
itoa(SensorData,SensorCharMsg,10);
// DEBUG
Serial.print(“Sensor Integer: “);
Serial.print(SensorData); //udskriver sensordata
Serial.print(” Sensor CharMsg: “);
Serial.print(SensorCharMsg); //udskriver char-array
Serial.println(” “);
delay(100);
/// END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); // sender meddelelsen
vw_wait_tx(); // venter, indtil hele meddelelsen er væk
delay(200);
}} // END void loop
Kode til RF-modtagerafsnit
#include <VirtualWire.h>
int SensorData; // Sensorer
char SensorCharMsg; // RF Transmission container
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
// Initialisere IO og ISR
/ Kræves for DR3100
vw_set_ptt_inverted(true);
// Bits per sec
vw_setup(2000);
// Start modtager-PLL’en i gang
vw_rx_start();
} // END void setup
void loop()
{
uint8_t buf;
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Ikke-blokerende
if (vw_get_message(buf, &buflen))
{
int i;
// Meddelelse med en god checksum modtaget, dump den.
for (i = 0; i < buflen; i++)
{
{
// Fyld SensorCharMsg Char array med tilsvarende
// karaktere fra buffer.
SensorCharMsg = char(buf);
}
/// Nul terminere char arrayet
// Dette skal gøres, da der ellers vil opstå problemer
/// når de indkommende meddelelser har færre cifre end den
/// foregående.
SensorCharMsg = ‘\0’;
/// Konverter Sensor1CharMsg Char array til heltal
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);
}