Möchten Sie Ihrem nächsten Arduino-Projekt drahtlose Fähigkeiten hinzufügen, und das für weniger als den Preis einer Tasse Kaffee? Dann sind die 433MHz RF-Sender- und Empfängermodule genau das Richtige für Sie! Sie sind oft online für weniger als zwei Dollar pro Paar erhältlich und damit eine der preiswertesten Datenkommunikationsoptionen, die Sie bekommen können. Und das Beste ist, dass diese Module super klein sind, so dass Sie eine drahtlose Schnittstelle in fast jedes Projekt einbauen können.
Hardware-Übersicht
Lassen Sie uns einen genaueren Blick auf die 433MHz RF-Sender- und Empfängermodule werfen.
Dieses kleine Modul ist ein Sender unter zwei. Es ist wirklich so einfach, wie es aussieht. Das Herzstück des Moduls ist der SAW-Resonator, der für den Betrieb auf 433,xx MHz abgestimmt ist. Es gibt einen Schalttransistor und ein paar passive Komponenten, das ist alles.
Wenn ein logisches HIGH an den DATA-Eingang angelegt wird, läuft der Oszillator und erzeugt eine konstante HF-Ausgangsträgerwelle bei 433,xx MHz, und wenn der DATA-Eingang auf logisches LOW gebracht wird, stoppt der Oszillator. Diese Technik ist als Amplitudenumtastung bekannt, die wir in Kürze im Detail besprechen werden.
Dies ist ein Empfängermodul. Obwohl es komplex aussieht, ist es genauso einfach wie das Sendemodul. Es besteht aus einem HF-Abstimmkreis und einigen Operationsverstärkern zur Verstärkung der empfangenen Trägerwelle vom Sender. Das verstärkte Signal wird an eine PLL (Phase Lock Loop) weitergeleitet, die es dem Decoder ermöglicht, sich auf einen Strom digitaler Bits „einzurasten“, was eine bessere dekodierte Ausgabe und Rauschunempfindlichkeit zur Folge hat.
ASK – Amplitude Shift Keying
Wie bereits erwähnt, verwenden diese Module zum Senden digitaler Daten über Funk eine Technik namens Amplitude Shift Keying oder ASK. Bei der Amplitudenumtastung wird die Amplitude (d.h. der Pegel) der Trägerwelle (in unserem Fall ein 433-MHz-Signal) als Reaktion auf das ankommende Datensignal verändert.
Dies ist der analogen Technik der Amplitudenmodulation sehr ähnlich, mit der Sie vielleicht vertraut sind, wenn Sie mit AM-Radio vertraut sind. Es wird manchmal als binäre Amplitudenumtastung bezeichnet, weil es nur zwei Stufen gibt, mit denen wir uns beschäftigen. Man kann es sich wie einen EIN/AUS-Schalter vorstellen.
- Für Digital 1 – Dies treibt den Träger mit voller Stärke an.
- Für Digital 0 – Dies schneidet den Träger vollständig ab.
So sieht die Amplitudenmodulation aus:
Amplitudenumtastung hat den Vorteil, dass sie sehr einfach zu implementieren ist. Es ist recht einfach, die Decoderschaltung zu entwerfen. Außerdem benötigt ASK weniger Bandbreite als andere Modulationsverfahren wie FSK (Frequency Shift Keying). Dies ist einer der Gründe dafür, dass es kostengünstig ist.
Der Nachteil ist jedoch, dass ASK anfällig für Störungen durch andere Funkgeräte und Hintergrundrauschen ist. Aber solange Sie Ihre Datenübertragung auf eine relativ langsame Geschwindigkeit beschränken, kann es in den meisten Umgebungen zuverlässig funktionieren.
433MHz RF Transmitter & Receiver Pinout
Lassen Sie uns einen Blick auf die Pinout von 433MHz RF Transmitter und Receiver Module werfen.
DATA-Pin akzeptiert die zu übertragenden digitalen Daten.
VCC liefert die Stromversorgung für den Sender. Dies kann jede positive Gleichspannung zwischen 3,5V und 12V sein. Beachten Sie, dass der HF-Ausgang proportional zur Versorgungsspannung ist, d.h. je höher die Spannung, desto größer ist die Reichweite.
GND ist ein Erdungsstift.
Antenna ist ein Stift für eine externe Antenne. Wie bereits erwähnt, sollten Sie ein 17,3 cm langes Stück Massivdraht an diesen Pin löten, um die Reichweite zu erhöhen.
VCC liefert die Versorgungsspannung für den Empfänger. Im Gegensatz zum Sender muss die Versorgungsspannung für den Empfänger 5V betragen.
DATA-Pins geben die empfangenen digitalen Daten aus. Die beiden mittleren Pins sind intern miteinander verbunden, so dass Sie einen der beiden Pins für die Datenausgabe verwenden können.
GND ist ein Masse-Pin.
Antenna ist ein Pin für eine externe Antenne, der oft nicht gekennzeichnet ist. Es ist das Pad unten links auf dem Modul, direkt neben der kleinen Spule. Auch hier sollte man ein 17,3 cm langes Stück Massivdraht an diesen Pin löten, um die Reichweite zu erhöhen.
Verkabelung – Anschluss von 433MHz RF-Sender und -Empfänger an Arduino UNO
Nun, da wir alles über die Module wissen, ist es an der Zeit, sie in Betrieb zu nehmen!
Da wir Daten zwischen zwei Arduino-Boards senden werden, brauchen wir natürlich zwei Arduino-Boards, zwei Breadboards und ein paar Überbrückungsdrähte.
Die Verdrahtung für den Sender ist ziemlich einfach. Er hat nur drei Anschlüsse. Verbinden Sie den VCC-Pin mit dem 5V-Pin und GND mit der Masse des Arduino. Der Data-In-Pin sollte mit dem digitalen Pin #12 des Arduino verbunden werden. Du solltest versuchen, Pin 12 zu verwenden, da die Bibliothek, die wir in unserem Sketch verwenden werden, standardmäßig diesen Pin für die Dateneingabe verwendet.
Die folgende Abbildung zeigt die Verdrahtung.
Wenn du den Sender verdrahtet hast, kannst du zum Empfänger übergehen. Die Verdrahtung des Empfängers ist genauso einfach wie die des Senders.
Auch hier gibt es nur drei Anschlüsse zu machen. Verbinden Sie den VCC-Pin mit dem 5V-Pin und GND mit der Masse des Arduino. Einer der beiden mittleren Data-Out-Pins sollte mit dem digitalen Pin #11 am Arduino verbunden werden.
So sollte die Verdrahtung für den Empfänger aussehen.
Nun, da sowohl der Sender als auch der Empfänger verdrahtet sind, müssen wir etwas Code schreiben und ihn an die jeweiligen Arduino-Boards senden. Da du wahrscheinlich nur einen PC hast, fangen wir mit dem Sender an. Sobald der Code dort geladen ist, gehen wir zum Empfänger über. Der Arduino, an den der Sender angeschlossen ist, kann dann über ein Netzteil oder eine Batterie mit Strom versorgt werden.
RadioHead-Bibliothek – ein Schweizer Taschenmesser für drahtlose Module
Bevor wir mit der Programmierung beginnen, müssen wir eine Bibliothek namens RadioHead in unserer Arduino-IDE installieren, die das Schreiben des Codes erheblich vereinfacht.
RadioHead ist eine Bibliothek, die eine einfache Datenübertragung zwischen Arduino-Boards ermöglicht. Sie ist so vielseitig, dass sie zur Ansteuerung aller Arten von Funkkommunikationsgeräten verwendet werden kann, einschließlich unserer 433MHz-Module.
Die RadioHead-Bibliothek nimmt unsere Daten, kapselt sie in ein Datenpaket ein, das einen CRC (Cyclic Redundancy Check) enthält, und sendet es dann mit der notwendigen Präambel und dem Header an einen anderen Arduino. Wenn die Daten korrekt empfangen werden, wird der empfangende Arduino darüber informiert, dass Daten vorhanden sind und fährt fort, sie zu dekodieren und zu verarbeiten.
Das RadioHead-Paket setzt sich wie folgt zusammen: Zu Beginn jeder Übertragung wird ein 36-Bit-Strom von „1“- und „0“-Bitpaaren, die sogenannte „Training Preamble“, gesendet. Diese Bits sind notwendig, damit der Empfänger seine Verstärkung einstellen kann, bevor er die eigentlichen Daten erhält. Danach folgt ein 12-Bit-Startsymbol und dann werden die eigentlichen Daten (Nutzdaten) hinzugefügt.
Am Ende des Pakets wird eine Rahmenprüfsequenz oder CRC hinzugefügt, die von RadioHead am Empfänger neu berechnet wird, und wenn die CRC-Prüfung korrekt ist, wird das empfangende Gerät benachrichtigt. Wenn die CRC-Prüfung fehlschlägt, wird das Paket verworfen.
Das ganze Paket sieht ungefähr so aus:
Sie können die Bibliothek herunterladen, indem Sie die airspayce.com oder klicken Sie einfach auf diese Schaltfläche, um die ZIP-Datei herunterzuladen:
Um sie zu installieren, öffnen Sie die Arduino IDE, gehen Sie zu Sketch > Include Library > Add .ZIP Library, und wählen Sie dann die RadioHead-Datei, die Sie gerade heruntergeladen haben. Wenn du mehr Details über die Installation einer Bibliothek benötigst, besuche das Tutorial Installing an Arduino Library.
Arduino Code – For 433MHz RF Transmitter
In unserem Experiment werden wir nur eine einfache Textnachricht vom Sender zum Empfänger senden. Es wird hilfreich sein, um zu verstehen, wie man die Module verwendet und kann als Grundlage für weitere praktische Experimente und Projekte dienen.
Hier ist der Sketch, den wir für unseren Sender verwenden werden:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init();} void loop(){ const char *msg = "Hello World"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);}
Es ist ein ziemlich kurzer Sketch, aber es ist alles, was man braucht, um ein Signal zu übertragen.
Der Sketch beginnt mit der Einbindung der RadioHead ASK-Bibliothek. Wir müssen auch die Arduino SPI Library einbinden, da die RadioHead Library davon abhängig ist.
#include <RH_ASK.h>#include <SPI.h>
Als nächstes müssen wir ein ASK-Objekt erstellen, um auf spezielle Funktionen zuzugreifen, die mit der RadioHead ASK Library zusammenhängen.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
In der Setup-Funktion müssen wir das ASK-Objekt initialisieren.
// Initialize ASK Objectrf_driver.init();
In der Loop-Funktion beginnen wir mit der Vorbereitung einer Nachricht. Es handelt sich um eine einfache Textzeichenfolge, die in einem Zeichenzeiger namens msg gespeichert wird. Denken Sie daran, dass Ihre Nachricht beliebig lang sein kann, aber für eine bessere Leistung nicht länger als 27 Zeichen sein sollte. Und achten Sie darauf, die Anzahl der Zeichen zu zählen, da Sie diese Anzahl im Empfängercode benötigen. In unserem Fall haben wir 11 Zeichen.
// Preparing a messageconst char *msg = "Hello World";
Die Nachricht wird dann mit einer send()
-Funktion übertragen. Sie hat zwei Parameter: der erste ist das Datenfeld und der zweite die Anzahl der zu sendenden Bytes (Länge der Daten). Auf die Funktion send()
folgt in der Regel die Funktion waitPacketSent()
, die wartet, bis ein vorheriges Sendepaket fertig übertragen wurde. Danach wartet der Sketch eine Sekunde, um unserem Empfänger Zeit zu geben, alles aufzunehmen.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Arduino Code – Für 433MHz RF Empfänger
Schließe den Empfänger Arduino an den Computer an und lade den folgenden Code:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init(); // Setup Serial Monitor Serial.begin(9600);} void loop(){ // Set buffer to size of expected message uint8_t buf; uint8_t buflen = sizeof(buf); // Check if received packet is correct size if (rf_driver.recv(buf, &buflen)) { // Message received with valid checksum Serial.print("Message Received: "); Serial.println((char*)buf); }}
Gleich wie der Sender Code, beginnt der Empfänger Code mit dem Laden der RadioHead und SPI Bibliotheken und dem Erstellen eines ASK Objekts.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
In der Setup-Funktion: wir initialisieren das ASK-Objekt und richten auch den seriellen Monitor ein, da wir so unsere empfangene Nachricht sehen werden.
rf_driver.init();Serial.begin(9600);
In der Schleifenfunktion: wir erstellen einen Puffer mit der gleichen Größe wie die gesendete Nachricht. In unserem Fall ist es 11, erinnern Sie sich? Sie müssen dies an die Länge Ihrer Nachricht anpassen. Achten Sie darauf, alle Leerzeichen und Satzzeichen einzuschließen, da sie alle als Zeichen zählen.
uint8_t buf;uint8_t buflen = sizeof(buf);
Als nächstes rufen wir eine recv()
Funktion auf. Diese schaltet den Empfänger ein, wenn er nicht bereits eingeschaltet ist. Wenn eine gültige Nachricht vorhanden ist, kopiert sie die Nachricht in ihren ersten Parameterpuffer und gibt true zurück, ansonsten false. Wenn die Funktion true zurückgibt, geht der Sketch in die if-Anweisung und druckt die empfangene Nachricht auf dem seriellen Monitor aus.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Dann gehen wir zurück zum Anfang der Schleife und machen alles noch einmal.
Nach dem Laden des Sketches öffnen Sie Ihren seriellen Monitor. Wenn alles in Ordnung ist, sollten Sie Ihre Nachricht sehen.
Verbesserung der Reichweite von 433MHz RF Modulen
Die Antenne, die Sie sowohl für den Sender als auch für den Empfänger verwenden, kann die Reichweite, die Sie mit diesen RF Modulen erzielen können, stark beeinflussen. Ohne Antenne können Sie froh sein, wenn Sie über eine Entfernung von mehr als einem Meter kommunizieren können.
Mit einem geeigneten Antennendesign können Sie über eine Entfernung von 50 Metern kommunizieren. Das ist natürlich im Freien in einem offenen Raum. Die Reichweite in Innenräumen, insbesondere durch Wände hindurch, wird etwas geringer sein.
Die Antenne muss nicht kompliziert sein. Ein einfaches Stück einadriger Draht kann eine ausgezeichnete Antenne für den Sender und den Empfänger darstellen. Der Antennendurchmesser hat kaum Bedeutung, solange die Länge der Antenne beibehalten wird.
Die effektivste Antenne hat die gleiche Länge wie die Länge der Welle, für die sie verwendet wird. Für praktische Zwecke reicht die Hälfte oder ein Viertel dieser Länge aus.
Die Wellenlänge einer Frequenz wird berechnet als:
Wellenlänge der Frequenz = | Übertragungsgeschwindigkeit (v) |
Übertragungsfrequenz (f) |
In Luft ist die Übertragungsgeschwindigkeit gleich der Lichtgeschwindigkeit, die genau 299.792.458 m/s beträgt. Für das 433-MHz-Band beträgt die Wellenlänge also:
Wellenlänge der Frequenz = | 299.792.458 m/s |
433.000.000 Hz | |
= | 0.6924 Meter |
= | 69,24 cm |
Da die Vollwellenantenne mit 69,24 cm eine ziemlich lange Antenne ist, ist sie nicht sehr praktisch zu verwenden. Deshalb werden wir uns für eine Viertelwellenantenne entscheiden, die etwa 17,3 cm lang ist.
Nur für den Fall, dass du mit anderen Funksendern experimentierst, die andere Frequenzen verwenden, kannst du die gleiche Formel verwenden, um die erforderliche Antennenlänge zu berechnen. Ziemlich einfach, oder?
Auch eine 17,3 cm lange Antenne kann in deinem winzigen Arduino-Projekt unbequem erscheinen. Lassen Sie sich aber NICHT dazu verleiten, die Antenne zu wickeln, um sie kompakter zu machen, da dies die Reichweite stark beeinträchtigt. Eine gerade Antenne ist immer am besten!