De RF module bestaat uit een 433 MHz RF zender en ontvanger modules. Dit zijn ASK (Amplitude shift keying) of OOK (Of Hook Keying) type RF modules. Bij het uitzenden van de logische nul onderdrukt de zender de draaggolffrequentie volledig en verbruikt daardoor slechts weinig stroom bij batterijvoeding. Wanneer logica één wordt uitgezonden, staat de zender aan en is de draaggolffrequentie vol, zodat er een hoog stroomverbruik is van ongeveer 4,5 mA bij een voeding van 3 V.
De zender en ontvanger moeten worden gekoppeld aan microcontrollers voor de gegevensoverdracht. De gegevens worden serieel verzonden van de zender en worden ontvangen door een afgestemde ontvanger. De RF-zender ontvangt seriële gegevens van een microcontroller en zendt deze naar de ontvanger via een antenne die is verbonden met de 4e pen van de zender. De ontvanger ontvangt de gegevens via een antenne en geeft de gegevens door aan de microcontroller die erop is aangesloten.
Deze RF-modules werken op een specifieke frequentie van 433MHz. RF-signalen kunnen reizen tussen zender en ontvanger, zelfs wanneer er een obstructie is. Deze modules worden gebruikt voor korte afstand, low- budget, simplex-gebaseerde communicatie. Het lage stroomverbruik maakt ze ideaal voor batterij-gebaseerde implementaties. Het wordt gebruikt op diverse gebieden zoals Afstandsverlichtingscontroles, RFID over lange afstand, draadloze alarm en veiligheidssystemen enz. RF-communicatie wordt gebruikt in mobiele communicatie en kan lange-afstandscommunicatie hebben en dat is wat hen geschikt maakt voor het bouwen van IoT-gebaseerde toepassingen. Dus hier zijn we beginnen met een inleidend artikel over RF-modules en hoe RF-modules kunnen worden gebruikt met Arduino te verzenden en ontvangen van data.
433 MHz RF Zender Module
Deze kleine module is de RF-zender. Het is zeer eenvoudig. De SAW-resonator die is afgestemd op 433,xx MHz werking is het hart van de module. Er is een schakeltransistor en een paar passieve componenten op.
Wanneer een logische HIGH wordt gegeven als de DATA-ingang, staat de oscillator aan en produceert een constante RF draaggolf op 433,xx MHz en wanneer de DATA-ingang logisch LOW is, staat de oscillator uit, zodat er geen draaggolf wordt geproduceerd. Deze techniek wordt Amplitude Shift Keying (ASK) genoemd.
Specificaties
- Werkspanning: 3V – 12V
- Werkstroom: max Minder dan 40mA, en min 9mA
- Resonantie mode: (SAW)
- Modulatiewijze: ASK
- Werkfrequentie: 433.92MHz
- Zendvermogen: 25mW
- Frequentiefout: +150kHz (max)
- Snelheid: minder dan 10Kbps
- Zendbereik: 90m (in open ruimte)
433 MHz RF Ontvangermodule
Dit is de RF-ontvangermodule. Ook al ziet het er complex uit, het is net zo eenvoudig als de zendermodule. Het bestaat uit een RF tuner circuit, OP-versterkers, en een PLL. Een paar OP-versterkers worden gebruikt om de draaggolf te versterken die van de zender wordt ontvangen. Het versterkte signaal wordt vervolgens aan een PLL (Phase Lock Loop) toegevoerd, die de decoder in staat stelt zich te “locken” op een stroom digitale bits, hetgeen een beter gecodeerde uitgang en ruisongevoeligheid oplevert.
Specificaties
- Werkspanning: 5,0VDC +0,5V
- Werkstroom:≤5,5mA max
- Modulatiemodus: OOK/ASK
- Werkfrequentie: 433.92MHz
- Bandbreedte: 2MHz
- Gevoeligheid: meer dan -100dBm (50Ω)
Nodigde componenten
- Arduino Nano (2)
- RF 433MHz Zender Module
- RF 433MHz ontvanger module
- Potentiometer
- LED (5)
- Aansluitdraden
Circuitschema
Het schakelschema voor RF zender met behulp van Arduino Nano is hieronder gegeven. Hier wordt een potentiometer aangesloten om de waarden te variëren die met de RF-zender naar de ontvanger moeten worden gezonden.
Hieronder zijn de details van de Speldverbindingen tussen RF-zender en Arduino
- D12 speld van Arduino – DATA speld van RF-zender
- VCC van Arduino – VCC van RF-zender
- GND van Arduino – GND van RF-zender
- GND van Arduino – eerste pin van de potentiometer
- A2 pin van Arduino – tweede pin van de potentiometer
- VCC van Arduino – derde pin van de potentiometer
Het schakelschema voor RF ontvanger met behulp van Arduino Nano wordt hieronder getoond. Hier hebben we een reeks LED’s. De LEDs worden verschoven gebaseerd op de potentiometerwaarden die door receiver.
Hieronder zijn de details van de Speldverbindingen tussen RF-ontvanger en Arduino
- D11 speld van Arduino – DATA speld van RF-ontvanger.
- VCC van Arduino – VCC van RF-ontvanger.
- GND van Arduino – GND van RF-ontvanger.
- Positieve draden van LEDs zijn verbonden met de digitale spelden D2, D3, D4, D5, en D6
- Negatieve draden van LEDs zijn aan de grond gezet.
Code Uitleg
Complete Arduino code voor zowel RF zender en ontvanger kant worden gegeven aan het einde van deze tutorial, hier zijn we het volledige programma uit te leggen aan de werking van het project te begrijpen. Maar alvorens met de code te beginnen eerst moeten wij één bibliotheek in Arduino IDE.
installeren
Hier gebruiken wij de virtuele draadbibliotheek. Download virtual wire library van de onderstaande link
https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip
VirtualWire is een Arduino bibliotheek die de mogelijkheid biedt om korte berichten te versturen, zonder adressering, bevestiging of opnieuw zenden. De berichten worden verzonden als een beetje zoals UDP over draadloze met behulp van ASK (amplitude shift keying). Deze bibliotheek steunt een aantal goedkope radiozenders en ontvangers.
Om de bibliotheek in Arduino IDE toe te voegen ga naar Sketch>>Includeer bibliotheek>>Voeg .ZIP-bibliotheek toe en upload dan de bibliotheek die u van de bovenstaande link hebt gedownload.
Na het uploaden van het programma opent u de seriële monitor aan beide zijden en ziet u de uitgangen zoals hieronder afgebeeld.
Uitgang op de RF-zender sectie toont de waarden van de potentiometer.
En uitgang op de ontvanger toont de ontvangen sensor waarde. De LEDs worden verschoven overeenkomstig het bereik van de sensorwaarden. Hier hebben we een bereik van 200 gegeven voor elke LED.
Dit is dus hoe Arduino kan worden gebruikt in RF-gebaseerde communicatie, controleer meer Arduino-gebaseerde IoT-projecten hier.
Code voor de RF-zender sectie
#include <VirtualWire.h>
const int SensorPin = A2; // potentiometerpen
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT))
// voor debugging
Serial.begin(9600);
// VirtualWire setup
vw_setup(2000); // Bits per sec
}
void loop()
{
// Gegevens van Sensor 1 lezen en opslaan
SensorData = analogRead(SensorPin);
// Gegevens in gehele getallen direct omzetten in Char-array
itoa(SensorData,SensorCharMsg,10);
/ DEBUG
Serial.print(“Sensor Integer: “);
Serial.print(SensorData); //print de sensorgegevens
Serial.print(” Sensor CharMsg: “);
Serial.print(SensorCharMsg); //print de char-array
Serial.println(” “);
delay(100);
/ END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); //verzend het bericht
vw_wait_tx(); //wacht tot het hele bericht weg is
delay(200);
} // END void loop
Code voor RF-ontvanger Sectie
#include <VirtualWire.h>
int SensorData; // Sensors
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
/ Initialiseren van de IO en ISR
/ Vereist voor DR3100
vw_set_ptt_inverted(true);
/ Bits per sec
vw_setup(2000);
// Starten van de ontvanger PLL
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;
// Bericht met een goede checksum ontvangen, dump het.
for (i = 0; i < buflen; i++)
{
// Vul SensorCharMsg Char array met overeenkomstige
/ tekens uit buffer.
SensorCharMsg = char(buf);
}
// Null beëindigen van de char array
/ Dit moet gebeuren omdat er anders
/ problemen zullen ontstaan wanneer de binnenkomende berichten minder
/ tekens hebben dan de vorige.
SensorCharMsg = ‘\0’;
// Converteer Sensor1CharMsg Char array naar integer
SensorData = atoi(SensorCharMsg);
/ DEBUG
Serial.print(“Sensor “);
Serial.println(SensorData);
// END DEBUG
}
if (SensorData <= 200)
{
digitalWrite(led1, HIGH);
}
else
digitalWrite(led1, LOW);
indien ( 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);
indien ( SensorData > 800 && SensorData <= 1023)
{
digitalWrite(led5, HIGH);
}
else
digitalWrite(led5, LOW);
}