Arduino Mikrocontroller Tutorials - Module

433 MHz Sender und Empfänger (Bsp. FS1000A und XY-MK-05V)

Bild 433MHz Sender und Empfänger

Die einfachen 433Mhz Module bestehen aus einem Sender (TX) und einem Empfänger (RX). Bei diesen Modulen ist die Kommunikation in eine Richtung, also nur von TX zum RX möglich. Die Reichweite der Module kann zwischen 20 und 200 Metern betragen. Abhängig der örtlichen Gegebenheiten, der Antennen und der Spannungsversorgung des Senders.

Sender FS1000A

Der Sender kann mit 3,5 bis 12 V betrieben werden. Mit höherer Versorgungsspannung erhöht sich auch die Sendeleistung auf bis zu 200m. Neben der Versorgungsspannung hat der Sender nur einen Pin (DataIn).

Sobald der Sender mit Spannung versorgt wird erzeugt er ein 433 Mhz Signal, welches aber noch nicht zur Antenne weitergeleitet wird. Erst wenn auf dem DataIn Pin ein HIGH Pegel anliegt wird das 433Mhz Signal über die Antenne ausgestrahlt. Sobald kein HIGH Pegel mehr am Datenpin anliegt endet das Senden. Durch ein gezieltes Ansteuern des Datenpins und einem vereinbarten Übertragungsprotokoll können so binäre Informationen übertragen werden. Dieses einfache und kostengünstige Verfahren nennt man Amplitude Shift Keying (ASK).

Amplitude Shift Keying

Empfänger MX-05V

Der Empfänger hat 4 Pins wobei die mittleren beiden zusammengelegt sind. Neben der Versorgungsspannung (ausschließlich 5V!) hat also auch der Empfänger nur einen Datenausgang. Immer wenn der Empfänger eine Trägerfrequenz von 433MHz empfängt wird ein HIGH Pegel ausgegeben. Der HIGH Pegel liegt so lange an wie auch die Frequenz empfangen wird. Durch das Auswerten dieses Pegel am Datenpin können die binär übertragenen Daten wieder entschlüsselt werden.

Der Empfänger hat einen Nachteil: Etwa 100ms nach der letzten Datenübertragung beginnt der Empfänger Hintergrundrauschen (Noise) zu empfangen und dieses am Datenpin ungedämpft auszugeben. Der Ausgangspegel wechselt daher ständig und kann deshalb nicht für einfache Signale (etwa der Schaltzustand eines Tasters) verwendet werden. Es ist vielmehr so, dass man in etwa 10ms Abständen ein Signalmuster (z.b. ein Byte) etwa 6-10 Mal hintereinander sendet. Anhand den 10ms Abständen zwischen den Mustern wird dann eine Übertragung erkannt und ausgewertet. Also zum Beispiel nach einem drei mal erkannten LOW Pegel von 10ms wird die 5 Übertragung dann ausgewertet.

Oszilloskop der Übertragung

Verwenden der RCSwitch.h Bibliothek zur Übertragung

Programmcode Sender #include "RCSwitch.h" // Instanz der Klasse RCSSwitch mit dem Namen Sender erstellen RCSwitch Sender = RCSwitch(); void setup() { Sender.enableTransmit(2); // Als Sender initialisieren und den DatenPin zuweisen } void loop() { Sender.send(234, 8); // sendet die Dezimalzahl 234. 8 ist die Anzahl der Bits (Bitlänge) delay(1000); Sender.send("11001100"); // Sendet die angegebenen 8 Bit delay(1000); Sender.switchOn("00000", "11111"); // Funktion zum Ansteuern einer Funksteckdose. delay(1000); }

Sender.setProtocol(1..3)
Optionale Angabe zum Einstellen des Sendeprotokolls im setup() (In der Grundeinstellung wird mit Protokoll 1 gesendet)
Beim Protokoll 1 ist das Puls/Pausen-Verhältnis 1/4 zu 3/4. Ein 3/4 Puls gefolgt von einer 1/4 Pause ist dabei eine logische '1' und ein 1/4 Puls gefolgt von einer 3/4 Pause eine logische '0'. Als Abschluss erfolgt ein Pulse von 1/4 Länge.
Beim Protokoll 2 ist das Puls-/Pausenverhältnis 1/3 zu 2/3. Ein 2/3 Puls gefolgt von einer 1/3 Pause ist dabei eine logische '1' und ein 1/3 Puls gefolgt von einer 2/3 Pause eine logische '0'. Als Abschluss erfolgt ein Pulse von 1/3 Länge.
Beim Protokoll 3 ist das Puls-/Pausenverhältnis ebenfalls 1/3 zu 2/3. Als Abschluss erfolgt ein HIGH Pulse mit einer 6/3 Länge.

Oszilloskop der Übertragung Oszilloskop der Übertragung Oszilloskop der Übertragung

Sender.setPulseLength(600)
Optionale Angabe im setup() ändert die Pulslänge (Angabe in µs). Beim Protokoll 1 ist eine Pulslänge 1/4 des Pulse/Pausen-Verhältnisses. Beim Protokoll 2 und 3 1/3 der Länge.

Sender.setRepeatTransmit(10);
Optionale Angabe im setup()ändert die Anzahl der hintereinander übertragenen Informationen. Standardmäßig wird die Nachricht 10x wiederholt.

Sender.switchOn("00000", "11111") und Sender.switchOff("00000", "11111")
Mit dieser Funktion können Funksteckdosen oder ander Empfänger, die sich über kleine Schiebeschalter (DIP Switches) konfigurieren lassen direkt angesteuert werden. Die Angaben in den Anführungszeichen sind die Schaltzustände der DIP Schalter. Im Hintergrund wird die Information der Schaltzustände und ob der damit konfigurierte Empfänger ein- oder ausgeschaltet werden soll mit 24 bit und dem Übertragungsprotokoll 1 ausgesendet.

Programmcode Empfänger #include "RCSwitch.h" RCSwitch Empfaenger = RCSwitch(); void setup() { Serial.begin(9600); Empfaenger.enableReceive(0); // Empfaenger ist an Interrupt-Pin 0 (Pin2) } void loop() { if (Empfaenger.available()) { // Wenn ein Code Empfangen wird... Serial.println("--------------------------------"); Serial.print("Empfangen: "); Serial.println(Empfaenger.getReceivedValue()); Serial.print("PulseZeit: "); Serial.println(Empfaenger.getReceivedDelay() ); Serial.print("Bitlänge: "); Serial.println(Empfaenger.getReceivedBitlength()); Serial.print("Protokoll: "); Serial.println(Empfaenger.getReceivedProtocol()); // Mit den folgenden drei Codezeilen werden die Pulse-/Pausenzeiten in µs ausgegeben unsigned int* pulsePausenPaare = Empfaenger.getReceivedRawdata(); for (int i=0; i<= Empfaenger.getReceivedBitlength()*2; i++) { Serial.print(pulsePausenPaare[i] + String("|")); } Serial.println(); Empfaenger.resetAvailable(); // Hier wird der Empfaenger resetted } }

Anhand den angezeigten Pulse/Pausenverhältnisse in Mikrosekunden lässt sich die Übertragung nachvollziehen. Der erste Wert ist die Zeitdauer des LOW Pegel zwischen zwei Übertragungen. Die Übertragung eines Bit dauert abhängig des Protokolls 3 oder 4 mal der PulseZeit.