RF-modulen består av en 433 MHz RF-sändare och mottagare. Dessa är RF-moduler av typen ASK (Amplitude shift keying) eller OOK (Of Hook Keying). Vid överföring av logisk nollpunkt undertrycker sändaren bärfrekvensen helt och hållet och förbrukar därför endast låg effekt vid batteridrift. När logik ett sänds är sändaren på, och bärfrekvensen är full, vilket innebär att strömförsörjningen blir hög och ligger i storleksordningen 4,5 mA med en strömförsörjning på 3 V.
Sändaren och mottagaren måste anslutas till mikrokontroller för dataöverföring. Data sänds seriellt från sändaren och tas emot av en avstämd mottagare. RF-sändaren tar emot seriella data från en mikrokontroller och sänder dem till mottagaren via en antenn som är ansluten till sändarens fjärde stift. Mottagaren tar emot data via en antenn och ger data till den mikrokontroller som är ansluten till den.
Dessa RF-moduler arbetar vid en specifik frekvens på 433 MHz. RF-signaler kan färdas mellan sändare och mottagare även när det finns ett hinder. Dessa moduler används för kort räckvidd, låg budget, simplexbaserad kommunikation. Den låga strömförbrukningen gör dem idealiska för batteribaserade tillämpningar. De används inom olika områden, t.ex. fjärrstyrning av belysning, RFID med lång räckvidd, trådlösa larm- och säkerhetssystem osv. RF-kommunikation används för mobil kommunikation och kan ha lång räckvidd, vilket gör dem lämpliga för att bygga IoT-baserade tillämpningar. Så här börjar vi med en inledande artikel om RF-moduler och hur RF-moduler kan användas med Arduino för att skicka och ta emot data.
433 MHz RF-sändarmodul
Denna lilla modul är RF-sändaren. Den är mycket enkel. SAW-resonatorn som är avstämd för 433,xx MHz-drift är modulens hjärta. Det finns en omkopplingstransistor och några passiva komponenter på den.
När en logisk HIGH ges som DATA-ingång är oscillatorn PÅ och producerar en konstant RF-utgångsbärvåg vid 433,xx MHz och när DATA-ingången är logisk LOW är oscillatorn AV, så ingen bärvåg produceras. Denna teknik kallas Amplitude Shift Keying (ASK).
Specifikationer
- Arbetsspänning: 3V – 12V
- Arbetsström: max Mindre än 40mA, och min 9mA
- Resonansläge: (SAW)
- Moduleringsläge: (SAW)
- Moduleringsläge: ASK
- Arbetsfrekvens: 433.92MHz
- Sändningseffekt: 25mW
- Frekvensfel:
- Frekvensfel: +150kHz (max)
- Sändningsområde: 90m (i öppet utrymme)
433 MHz RF-mottagarmodul
Detta är en RF-mottagarmodul. Även om den ser komplex ut är den lika enkel som sändarmodulen. Den består av en RF-tunerkrets, OP-förstärkare och en PLL. Ett par OP-förstärkare används för att förstärka den bärvåg som tas emot från sändaren. Den förstärkta signalen matas sedan till en PLL (Phase Lock Loop) som gör det möjligt för avkodaren att ”låsa” sig på en ström av digitala bitar, vilket ger bättre avkodad utgång och störningsimmunitet.
Specifikationer
- Arbetstidsspänning: 5,0VDC +0,5V
- Arbetsström: ≤5,5mA max
- Modulationsläge: OOK/ASK
- Arbetsfrekvens: 433.92MHz
- Bandbredd: 2MHz
- Känslighet:
Bedömda komponenter
- Arduino Nano (2)
- RF 433MHz sändarmodul
- RF 433MHz mottagarmodul
- RF 433MHz mottagarmodul
- Potentiometer
- LED (5)
- Kopplingskablar
Kretsschema
Kretsschemat för RF-sändare med hjälp av Arduino Nano visas nedan. Här är en potentiometer ansluten för att variera de värden som ska skickas till mottagaren med hjälp av RF-sändaren.
Nedan följer detaljer om stiftförbindelserna mellan RF-sändaren och Arduino
- D12-stiftet i Arduino – DATA-stiftet i RF-sändaren
- VCC i Arduino – VCC i RF-sändaren
- GND i Arduino – GND i RF-sändaren
- GND på Arduino – potentiometerns första stift
- A2-stift på Arduino – potentiometerns andra stift
- VCC på Arduino – potentiometerns tredje stift
.
Kretsdiagrammet för RF-mottagare med hjälp av Arduino Nano visas nedan. Här har vi en serie lysdioder. Lysdioderna förskjuts baserat på de potentiometervärden som mottagaren tar emot.
Nedan följer detaljerna om PIN-anslutningarna mellan RF-mottagaren och Arduino
- D11-stiftet i Arduino – DATA-stiftet i RF-mottagaren.
- VCC i Arduino – VCC i RF-mottagaren.
- GND i Arduino – GND i RF-mottagaren.
- Ljusdiodernas positiva ledningar är anslutna till de digitala stiften D2, D3, D4, D5 och D6
- Ljusdiodernas negativa ledningar är jordade.
Kodningsförklaring
Komplett Arduino-kod för både RF-sändar- och mottagarsidan ges i slutet av denna handledning, här förklarar vi det kompletta programmet för att förstå hur projektet fungerar. Men innan vi börjar med koden måste vi först installera ett bibliotek i Arduino IDE.
Här använder vi biblioteket virtual wire. Ladda ner virtual wire-biblioteket från nedanstående länk
https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip
VirtualWire är ett Arduino-bibliotek som ger funktioner för att skicka korta meddelanden, utan adressering, bekräftelse eller återutsändning. Meddelandena skickas lite som UDP över trådlöst med hjälp av ASK (amplitude shift keying). Biblioteket stöder ett antal billiga radiosändare och -mottagare.
För att lägga till biblioteket i Arduino IDE går du till Sketch>>Include library>>Add .ZIP library och laddar sedan upp biblioteket som du laddat ner från ovanstående länk.
När du har laddat upp programmet öppnar du den seriella monitorn på båda sidor och du kommer att se utgångarna enligt nedan.
Utgången vid RF-sändarsektionen visar potentiometerns värden.
Och utgången vid mottagaren visar det mottagna sensorvärdet. Lysdioderna är förskjutna i enlighet med sensorvärdenas intervall. Här har vi gett ett intervall på 200 för varje LED.
Så detta är hur Arduino kan användas i RF-baserad kommunikation, kolla fler Arduino-baserade IoT-projekt här.
Kod för RF-sändarsektionen
#include <VirtualWire.h>
const int SensorPin = A2; // potentiometerpin
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT);
/// för felsökning
Serial.begin(9600);
// VirtualWire setup
vw_setup(2000); // Bits per sekund
}
void loop()
{
// Läs och lagra data från sensor 1SensorData = analogRead(SensorPin);
// Konvertera heltalsdata till Char array direkt
itoa(SensorData,SensorCharMsg,10);
// DEBUG
Serial.print(”Sensor Integer: ”);
Serial.print(SensorData); // skriver ut sensordata
Serial.print(” Sensor CharMsg: ”);
Serial.print(SensorCharMsg); //skriver ut char array
Serial.println(” ”);
delay(100);
/// END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); // sänder meddelandet
vw_wait_tx(); // väntar tills hela meddelandet är borta
delay(200);
}}. // END void loop
Kod för RF Receiver Section
#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
// Initialisera IO och ISR
// Krävs för DR3100
vw_set_ptt_inverted(true);
// Bits per sekund
vw_setup(2000);
// Starta mottagar-PLL:en
vw_rx_start();
} // END void setup
void loop()
{
uint8_t buf;
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Icke-blockering
if (vw_get_message(buf, &buflen))
{
int i;
/// Meddelande med god kontrollsumma har mottagits, dumpa det.
for (i = 0; i < buflen; i++)
{
// Fyll SensorCharMsg Char array med motsvarande
// tecken från bufferten.
SensorCharMsg = char(buf);
}
// Nollterminera char array
// Detta måste göras annars uppstår problem
// när de inkommande meddelandena har färre siffror än det
// föregående.
SensorCharMsg = ’\0’;
/// Konvertera Sensor1CharMsg Char array till 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);
}