433 MHz Funk mit dem Arduino

Kabellose Datenübertragung gehört für mich zu den spannendsten Gebieten in der Welt der Microcontroller. Im Wesentlichen gibt es die folgenden Techniken:

  • Bluetooth
  • W-Lan
  • Infrarot
  • Funk (433 MHz, 868 MHz, 2.4 GHz)

Genau genommen sind Bluetooth und W-Lan natürlich auch Funktechniken. Diese genießen aber eine Sonderstellung aufgrund ihrer speziellen Übertragungsprotokolle. In diesem Beitrag geht es um die 433 MHz Funktechnik. Dabei werde ich mich auf die „One-Way“ Technik beschränken, also einfache Transmitter / Receiver Systeme. Im Einzelnen wird behandelt:

  •  die benötigten Module
  •  Antennen
  •  die Einrichtung einer geeigneten Bibliothek 
  •  ein Minimal Setup 
  •  Erfahrung mit verschiedenen Receivermodulen 

Gängige Module

Was braucht man für den 433 MHz Funk mit dem Arduino? Zunächst einmal geeignete Funkmodule. Wer z.B. bei Amazon danach sucht, wird vor allem auf die folgende Kombination von Receiver und Transmitter treffen. Sie wird ohne nähere Typenbezeichnung in vielen Shops angeboten: 

Diese Teile sind ausgesprochen günstig und meiner (neueren) Erfahrung nach besser als ihr Ruf. Ich hatte auch mal welche gekauft bei denen die Receivermodule kaum einsetzbar waren. Maximal zwei Meter Übertragung. Danach waren die Dinger für mich erst einmal gestorben. Inzwischen habe ich zweimal wieder welche gekauft um die Transmitter davon zu verwenden. Und siehe da: nun funktionierten auch die Receivermodule wunderbar. Viele negative Kommentare findet aber auch man von Leuten die keine Antenne verwendet haben, aber dazu gleich noch mehr.  

In der Haustechnik gibt es eine Reihe weiterer Transmitter und Receiver auf 433 MHz Basis, wie z.B. Fenstersensoren und Funksteckdosen. Auf Letztere werde ich in einem späteren Beitrag eingehen.  

Antenne

Ohne Antenne geht (fast) nichts. Kauft man ein Transmitter – Receiver Duo wie oben abgebildet und setzt es ohne Antenne ein, dann wird man sehr enttäuscht sein. Man bekommt gerade so Funkstrecken quer über den Schreibtisch hin. Darüber hinaus ist Schluss. Es müssen also Antennen angebastelt werden. Meiner Erfahrung nach vor allem am Transmittermodul, aber besser noch an beiden Modulen.

Die Länge der Antenne sollte ein Viertel der Wellenlänge betragen. Die Wellenlänge ist Lichtgeschwindigkeit durch Frequenz. Das Ergebnis noch  durch 4, macht 17,3 cm. Es gibt lauter Anleitungen im Netz zum Selbstbau guter Antennen, z.B. hier. Nach meiner Erfahrung kommt man aber auch schon dann auf gute Reichweiten, wenn man einen einfachen Draht anlötet. Man muss also keine Wissenschaft daraus machen. Etwas anderes ist es wenn man wirklich an die Reichweitegrenzen stößt.  

Es werden auch kleine Spiralantennen angeboten bzw. Module, die diese schon angelötet haben. Dazu kann ich nur bedingt raten. Die Übertragung ist besser als ohne, aber ein langer Draht ist einfach besser. Wenn man solche Spiralantennen verwendet und Probleme mit der Reichweite hat, kann man sie auch auseinanderziehen und damit nach meiner Erfahrung ein besseres Ergebnis erzielen. Hier also ein paar – zugegebenermaßen nicht schöne – aber pragmatische und funktionierende Lösungen:

Die Ansteuerung

Es gibt eine Reihe von Bibliotheken zur Ansteuerung von Funkmodulen mittels Arduino. Ich hatte lange Zeit die VirtualWire Bibliothek benutzt, aber anscheinend ist das ein Auslaufmodell, das nicht mehr gepflegt wird. Empfehlen möchte ich die Bibliothek RadioHead von Paul Stoffregen, da sie mit vielen verschiedenen Funkmodulen kompatibel ist. Wie man sein eigenes Funkprotokoll strickt, werde ich in einem anderen Beitrag erklären.

Installation der RadioHead Bibliothek

Für die weniger Erfahrenen: Dem o. a. Link folgen, auf „Clone oder Download“ gehen, „Download ZIP“ wählen und die Zip Datei im Verzeichnis „Arduino\libraries“ entpacken. Es sollte dann ein Ordner „RadioHead-master“ vorhanden sein. Die Zip Datei kann man nun löschen. Ein Blick in das „RadioHead-master“ Verzeichnis zeigt, dass es sich um eine ganze Sammlung von Bibliotheken handelt.

Anpassung der Beispielsketche

Für die hier verwendeten, einfachen Funkmodule ist die „RH_Ask“ Bibliothek geeignet. Am einfachsten startet man, indem man die mitgelieferten Beispielsketche nimmt und ggf. modifiziert. Für den Transmitter ist das die Datei „RadioHead-master\examples\ask\ask_transmitter\ask_transmitter.pde“, die man direkt über die Arduino IDE aufruft, ggf. bearbeitet und bei seinen Sketchen speichert. Für den Receiver wählt man das Beispiel „ask_receiver.de“.

Hier meine Anpassung des Transmittersketches:

Die Beispielsketche sind eigentlich selbsterklärend, nur fehlte im Original ein Hinweis auf die Bedeutung der Parameter bei der Objektinitialisierung:

  •  speed: Datenübertragung in bits/s
  •  rxPin: Datenpin für den Receiver
  •  txPin: Datenpin für den Transmitter 
  •  pttPin: „Enable“ Pin für den Transmitter (brauchen wir für unsere schlichten Module nicht) 
  •  pttInverted: optionaler Parameter für die pttPin Logik, Standard: false

In meiner Anpassung des Transmittersketches habe ich also den txPin auf 8 festgelegt. rxPin und pttPin sind hier bedeutungslos, speed bleibt unverändert. Im Receiversketch legt man entsprechend den rxPin fest. 

Die Verkabelung

Anschlüsse

Der Transmitter kann mit 3.3 bis 12 V betrieben werden, der Reveiver braucht 5 V. In meinem Versuchsaufbau betreibe ich beide mit 5V. Auf der Transmitterseite habe ich einen Arduino Nano (ProMini nehme ich alternativ auch gerne) eingesetzt, auf der Receiverseite einen Arduino UNO. Stellvertretend ist hier nur die Transmitterseite abgebildet:

Die Transmitterseite

Entsprechend verfährt man auf der Receiverseite. Und dann kann es losgehen. Wenn alles geklappt hat sollte man nun auf der Receiverseite mittels seriellem Monitor seine Nachricht lesen können. Man kann eigentlich nicht viel verkehrt machen, deswegen spare ich mir hier einen Troubleshooting Abschnitt. 

Erfahrung mit alternativen Receivermodulen

Zum Schluss noch ein Erfahrungsbericht zu verschiedenen Receivermodulen. Ich habe die unten abgebildeten Receivermodule mit der Bezeichnung „RXB6“, „RXB8“ und „RXB12“ gegen das Modul aus dem Kombipack antreten lassen. Auch diese Module sind für wenige Euro zu haben. 

Von links nach rechts: RXB12, RXB8 und RXB6

Der Versuch

Zunächst habe ich allen Receivermodulen die gleiche Antenne verpasst. Die Spiralantenne am RXB12 habe ich dazu entfernt. Das zu testende Receivermodul habe ich mit dem Arduino UNO am PC gehabt. Das Transmittermodul (aus dem Kombipack) hatte ich am Arduino Nano auf dem Breadboard (Akkubetrieb). Dann habe ich den Transmitter an unterschiedlichen Orten im Haus platziert und geprüft ob am Receiver etwas ankommt. 

Das Ergebnis

  •  Im selben Raum (ca. 6m) kein Problem für alle Module 
  • Im Nachbarzimmer (geschlossene Tür, massive Wand) hatten der RXB6 und RXB12 an einigen Stellen schon Probleme. 
  • Das Modul aus dem Kombipack und der RXB8 hatten quer durchs Haus durch mehrere Wände und über ein Stockwerk hinweg eine gute Verbindung. Für meinen Router brauche ich schon auf einem kürzeren Stück einen Repeater.
  • Die große Überraschung war, dass der RXB8 das auch ohne Antenne packte(!).

Auf einer Skala von 0 bis 10 würde ich folgende Bewertung geben: 

  •  RXB12: 2
  •  RXB6: 3
  •  Kompipackmodul: 7
  •  RXB8: 10+

Da der RXB8 einen so guten Empfang ohne Antenne hat, kann man ihn besonders gut in kleine Gehäuse einbauen.

Und wie ist Eure Erfahrung mit verschiedenen Modulen? Über Kommentare würde ich mich freuen. 

8 thoughts on “433 MHz Funk mit dem Arduino

  1. Erstaunlich finde dich das das RX8B bei mir auch wunderbar mit 3.3V an einem ESP läuft.
    Obwohl doch dick 5V drauf steht !
    Ulli

    1. Hi Ulli,
      was die Logik Level angeht, ist es nicht so überraschend, da bei 5V TTL Technik alles über 2.7 Volt als HIGH erkannt wird. Aber dass 3.3V ausreichen um die Teile überhaupt zu betreiben, ist schon interessant. Macht in der ESP Welt die Dinge einfacher. Danke für den Hinweis. Vielleicht gibt es Einbußen in der Reichweite (?).
      Wolfgang

  2. Einen sehr schönen Blog hast du… 🙂

    Ich habe auch die Erfahrung gemacht, dass die XY-MK-5V Empfänger die im Bundle mit den XY-FST (FS1000A) Sendern vertrieben werden, absolut nichts taugen (auch mit Antenne nicht). Ich habe einen Empfänger für ein Wettersensormodul gebraucht. Nach einem Wechsel auf einen RXB6 klappt der Empfang aus dem Garten auch durch Hauswände hindurch einwandfrei (mit Antenne).
    Das Empfänermodul habe ich, wie auf dieser Seite (http://www.rflink.nl/blog2/wiring) beschrieben, mit drei Kondensatoren versehen.
    Die FS100A Sender funktionieren aber gut.

    Gruß Kai

  3. Hallo Wolfgang,

    ein sehr guter Artikel. Ich hatte mir darauf hin ein Empfänger Modul RX8B gekauft und meine Empfangsprobleme waren vorbei.

    Ich betreibe ein Sendemodul mit 3.3V und schalte einen Digital Ausgang des ATMEGA328 für den Sendezeitraum auf HIGH um das 433 Mhz Sendemodul mit Strom zu versorgen. Nach dem senden wird der Ausgang wieder LOW geschaltet und das Modul stromlos. Der Strombedarf beim Senden ist sehr gering ( > 5mA) und der ATMEGA328 scheint damit keine Probleme zu haben. Allerdings war die Reichweite mit 3.3V trotz Antenne deutlich geringer als bei einer 5 V Versorgungsspannung. Dank dem besseren Empfänger klappt in meinem Setup nun alles.

    In den Sendepausen (Sleepmode) werden lediglich 0.02 mA Strom verbraucht. Versorgt wird das über ein 0.50 Euro Step Up Booster und zwei AA Zellen in Reihe. Ich bin gespannt wie lange die Batterien halten. Theoretisch sollten die 3.3V so lange vorhanden sein bis jede Zelle weniger als 0.4V Spannung liefert. Dann wären diese schon sehr leer und der ATMEGA328 schaltet vorher nicht wegen zu geringer Spannung ab.

    Eine Frage habe ich an Dich. Ist Dir zu dem Thema Kollisionen etwas aufgefallen? Wenn also mehrere 433 Mhz Module zeitgleich senden. Ich möchte gerne 4-5 gleichzeitig betreiben.

    Gruß Christian

    1. Hallo Christian,

      bei den Funkmodulen stellt sich in der Tat die Frage, wie man dem Empfänger, der gemeint ist mitteilt, dass er gemeint ist bzw. den anderen, dass sie nicht gemeint sind. Dieselbe Frage stellt sich bei mehreren Sendern und einem Empfänger. Ich würde dazu individuelle Kennungen vergeben, diese mitsenden und auf der Empfängerseite prüfen, ob die Nachricht die richtige Kennung enthält bzw. von welchem Sender die Nachricht stammt. Was passiert, wenn zwei Sender genau gleichzeitig senden oder ein 433MHz Störsender dazwischen funkt, kann ich sagen. Aber wahrscheinlich wird die empfangene Nachricht keinen Sinn ergeben. Dazu würde ich irgendeine Art von Plausibilitätscheck einbauen. Das Vorhandensein der Kennung ist ja schon mal ein Anfang. Man könnte die Kennung am Ende der Nachricht nochmal schicken. Oder so etwas wie eine Checksumme (z.B. Anzahl Zeichen). Oder grundsätzlich zweimal senden und auf Identität prüfen. Viel Erfolg!

      VG, Wolfgang

      1. Hallo Wolfgang,

        vielen Dank für Deine Antwort. So wie Du es beschreibst halte ich das auch für sinnvoll. Eine ID beim Sender und eine Art Check ob das Paket sinnvoll ist. Wie soll es anders sein gibt es so etwas schon. Eine kleine/schlanke Bibliothek mit Sender ID und CRC Check. Ich werde damit mal „spielen“ und Erfahrung sammeln.

        Falls es klappt super und falls nicht kann man diese Bibliothek als Starthilfe nehmen und davon lernen.

        Diese Bibliotheken sind auf GitHub zu finden:

        https://github.com/zeitgeist87/RFReceiver
        https://github.com/zeitgeist87/RFTransmitter

        Liebe Grüße
        Christian

        1. Hallo Christian, diese Bibliotheken muss ich mir auch mal anschauen. Vielen Dank für die Links. VG, Wolfgang

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.