Das RF-Modul besteht aus einem 433-MHz-RF-Sender- und Empfängermodul. Es handelt sich um RF-Module vom Typ ASK (Amplitude Shift Keying) oder OOK (Of Hook Keying). Beim Senden der logischen Null unterdrückt der Sender die Trägerfrequenz vollständig und verbraucht daher im Batteriebetrieb nur wenig Strom. Wenn die logische Eins übertragen wird, ist der Sender eingeschaltet, und die Trägerfrequenz ist voll, so dass ein hoher Stromverbrauch entsteht, der im Bereich von etwa 4,5 mA bei einer 3-V-Stromversorgung liegt.
Sender und Empfänger müssen zur Datenübertragung mit Mikrocontrollern verbunden werden. Die Daten werden seriell vom Sender gesendet und von einem abgestimmten Empfänger empfangen. Der HF-Sender empfängt serielle Daten von einem Mikrocontroller und sendet sie über eine Antenne, die mit dem 4. Pin des Senders verbunden ist, an den Empfänger. Der Empfänger empfängt die Daten über eine Antenne und gibt sie an den angeschlossenen Mikrocontroller weiter.
Diese HF-Module arbeiten mit einer bestimmten Frequenz von 433 MHz. RF-Signale können zwischen Sender und Empfänger übertragen werden, auch wenn es ein Hindernis gibt. Diese Module werden für Simplex-Kommunikation mit kurzer Reichweite und geringem Stromverbrauch verwendet. Der geringe Stromverbrauch macht sie ideal für batteriegestützte Implementierungen. Sie werden in verschiedenen Bereichen eingesetzt, z. B. für die Fernsteuerung von Beleuchtungen, RFID mit großer Reichweite, drahtlose Alarm- und Sicherheitssysteme usw. RF-Kommunikation wird in der mobilen Kommunikation verwendet und kann eine lange Reichweite haben, was sie für den Aufbau von IoT-basierten Anwendungen geeignet macht. Hier beginnen wir also mit einem einführenden Artikel über RF-Module und wie RF-Module mit Arduino verwendet werden können, um Daten zu senden und zu empfangen.
433 MHz RF Transmitter Module
Dieses kleine Modul ist der RF-Sender. Es ist sehr einfach. Der SAW-Resonator, der für den Betrieb bei 433,xx MHz abgestimmt ist, ist das Herzstück des Moduls. Auf ihm befinden sich ein Schalttransistor und einige passive Bauteile.
Wenn ein logisches HIGH als DATA-Eingang gegeben wird, ist der Oszillator AN und erzeugt eine konstante HF-Ausgangsträgerwelle bei 433,xx MHz, und wenn der DATA-Eingang logisch LOW ist, ist der Oszillator AUS, so dass kein Träger erzeugt wird. Diese Technik wird Amplitude Shift Keying (ASK) genannt.
Spezifikationen
- Arbeitsspannung: 3V – 12V
- Arbeitsstrom: max. weniger als 40mA und min. 9mA
- Resonanzmodus: (SAW)
- Modulationsmodus: ASK
- Arbeitsfrequenz: 433.92MHz
- Sendeleistung: 25mW
- Frequenzfehler: +150kHz (max)
- Geschwindigkeit: weniger als 10Kbps
- Sendebereich: 90m (im freien Raum)
433 MHz RF-Empfängermodul
Dies ist das RF-Empfängermodul. Obwohl es komplex aussieht, ist es genauso einfach wie das Sendemodul. Es besteht aus einer HF-Tunerschaltung, OP-Amps und einer PLL. Ein paar OP-Verstärker werden verwendet, um die vom Sender empfangene Trägerwelle zu verstärken. Das verstärkte Signal wird dann in eine PLL (Phase Lock Loop) eingespeist, die es dem Decoder ermöglicht, sich auf einen Strom digitaler Bits zu „verriegeln“, was eine besser dekodierte Ausgabe und Rauschfestigkeit ermöglicht.
Spezifikationen
- Arbeitsspannung: 5.0VDC +0.5V
- Arbeitsstrom:≤5.5mA max
- Modulationsmodus: OOK/ASK
- Arbeitsfrequenz: 433.92MHz
- Bandbreite: 2MHz
- Empfindlichkeit: Überschreitet -100dBm (50Ω)
Benötigte Komponenten
- Arduino Nano (2)
- RF 433MHz Sendemodul
- RF 433MHz Empfangsmodul
- Potentiometer
- LED (5)
- Verbindungsdrähte
Schaltplan
Der Schaltplan für den RF-Sender mit Arduino Nano ist unten angegeben. Hier wird ein Potentiometer angeschlossen, um die Werte zu variieren, die über den RF-Sender an den Empfänger gesendet werden sollen.
Nachfolgend sind die Pin-Verbindungen zwischen RF-Sender und Arduino aufgeführt
- D12 Pin des Arduino – DATA Pin des RF-Senders
- VCC des Arduino – VCC des RF-Senders
- GND des Arduino – GND des RF-Senders
- GND von Arduino – erster Pin des Potentiometers
- A2 Pin von Arduino – zweiter Pin des Potentiometers
- VCC von Arduino – dritter Pin des Potentiometers
Der Schaltplan für den RF-Empfänger mit Arduino Nano ist unten dargestellt. Hier haben wir eine Reihe von LEDs. Die LEDs werden basierend auf den Potentiometerwerten, die der Empfänger empfängt, verschoben.
Unten sind die Pin-Verbindungen zwischen RF-Empfänger und Arduino
- D11 Pin des Arduino – DATA Pin des RF-Empfängers.
- VCC des Arduino – VCC des RF-Empfängers.
- GND des Arduino – GND des RF-Empfängers.
- Positive Leitungen der LEDs sind mit den digitalen Pins D2, D3, D4, D5 und D6 verbunden
- Negative Leitungen der LEDs sind geerdet.
Codierungserläuterung
Der vollständige Arduino-Code für die RF-Sender- und Empfängerseite ist am Ende dieses Tutorials angegeben. Aber bevor wir mit dem Code beginnen, müssen wir zuerst eine Bibliothek in der Arduino IDE installieren.
Hier verwenden wir die virtuelle Drahtbibliothek. Laden Sie die VirtualWire-Bibliothek von dem untenstehenden Link herunter
https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip
VirtualWire ist eine Arduino-Bibliothek, die die Möglichkeit bietet, kurze Nachrichten zu senden, ohne Adressierung, Quittierung oder erneute Übertragung. Die Nachrichten werden ähnlich wie UDP über Funk mit ASK (Amplitude Shift Keying) gesendet. Diese Bibliothek unterstützt eine Reihe von preiswerten Funksendern und -empfängern.
Um die Bibliothek in Arduino IDE hinzuzufügen, gehen Sie zu Sketch>>Bibliothek einbinden>>ZIP-Bibliothek hinzufügen und laden Sie dann die Bibliothek hoch, die Sie über den obigen Link heruntergeladen haben.
Nach dem Hochladen des Programms öffnen Sie den seriellen Monitor auf beiden Seiten und Sie werden die Ausgänge wie unten gezeigt sehen.
Der Ausgang am HF-Senderabschnitt zeigt die Werte des Potentiometers.
Und der Ausgang am Empfänger zeigt den empfangenen Sensorwert. Die LEDs werden entsprechend dem Bereich der Sensorwerte verschoben. Hier haben wir einen Bereich von 200 für jede LED angegeben.
So kann Arduino in der RF-basierten Kommunikation verwendet werden, überprüfen Sie mehr Arduino-basierte IoT-Projekte hier.
Code für den RF-Sender Abschnitt
#include <VirtualWire.h>
const int SensorPin = A2; // Potentiometerpin
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT);
// für Debugging
Serial.begin(9600);
// VirtualWire setup
vw_setup(2000); // Bits pro Sekunde
}
void loop()
{
// Sensor 1 Daten lesen und speichern
SensorData = analogRead(SensorPin);
/// Integer-Daten direkt in Char-Array umwandeln
itoa(SensorData,SensorCharMsg,10);
// DEBUG
Serial.print(„Sensor Integer: „);
Serial.print(SensorData); // Druck der Sensordaten
Serial.print(“ Sensor CharMsg: „);
Serial.print(SensorCharMsg); //Druck des Char-Arrays
Serial.println(“ „);
delay(100);
// END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); // sende die Nachricht
vw_wait_tx(); // warte bis die ganze Nachricht weg ist
delay(200);
} // END void loop
Code für RF Receiver Section
#include <VirtualWire.h>
int SensorData; // Sensoren
char SensorCharMsg; // RF Sendecontainer
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
// IO und ISR initialisieren
// Erforderlich für DR3100
vw_set_ptt_inverted(true);
// Bits pro Sekunde
vw_setup(2000);
// Empfänger PLL starten
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;
// Nachricht mit einer guten Prüfsumme erhalten, dump it.
for (i = 0; i < buflen; i++)
{
/// Fill SensorCharMsg Char array with corresponding
// chars from buffer.
SensorCharMsg = char(buf);
}
/// Null terminate the char array
// This needs to be done otherwise problems will occur
// when the incoming messages has less digits than the
// one before.
SensorCharMsg = ‚\0‘;
/// Konvertiere Sensor1CharMsg Char-Array in 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);
}