Funkübertragung von Messwerten mit dem RF Link Modul

Das RF Link Modul (Receiver und Transmitter) aus der RWS-371-Serie ist ein ziemlich günstiger Weg, Signale kabellos über kurze Distanzen zu übertragen. Dieses Beispiel zeigt, wie man es verwendet. Als Transmitter kannst Du die Module TLP 434, 434-A oder 916-A, als Receiver die Module RLP 434, 434-A, 916-A oder 916-F verwenden.

Die Funktionsweise der Module ist sehr einfach. Wenn der Daten-Pin des Sendemoduls getriggert wird, sendet es ein Signal. Der Empfänger empfängt es und schickt ein Signal an einen Pin des Mikrocontrollers.

Damit man mit dieser Funktion etwas Sinnvolles anstellen kann, werden wir die VirtualWire Bibliothek von Mike McCauley verwenden, die es uns ermöglicht, komplexe Daten zu übertragen.

Die Bibliothek kannst Du Dir von dieser Seite herunterladen. Sie muss in den libraries Ordner im Arduino-Benutzerordner kopiert werden. Danach musst Du die Arduino IDE erneut starten.

Ich schlage vor, dass Du die Schaltung einfach nachbaust und die Programme auf die beiden Microcontroller überträgst. Der Code ist ziemlich selbsterklärend: Sechs Analoge Inputs des Sendenden Mikrocontrollers werden ausgelesen und mittels RF Link Modul verschickt. Der empfangende Mikrocontroller sendet die empfangenen Daten dann an die serielle Schnittstelle. Mit dem Seriellen Monitor der Arduino-Software kann man sich die Daten ansehen.

Circuits using Arduino UNO

RF Link Modul mit Arduino

Circuits using the Teensy 3.1

RF Link Modul mit Teensy

Code für den Sender

Code für den Empfänger

Arduino

RF Link Modul mit Arduino

Teensy

RF Link Modul mit Teensy

Montage auf Breadboard. Für den Versuchsaufbau teilen sich beide Controller eine Stromquelle. Das ist natürlich nicht nötig.

16 Comments

  1. Stefan Hermann

    Hi Clemens,

    schön, dass Du vorbei schaust. Wow! Die Library ja echt nach einer sauberen Lösung aus. Muss ich mir mal bei Gelegenheit genauer ansehen. Vielen Dank für die Info.

    Liebe Grüße

    Stefan“

  2. Julian

    Muss ich am anderen Ende auch ein Arduino haben auch wenn ich keine Messwerte übertragen will, sondern lediglich ein Relais schalten? Oder gibt es dafür sogar einen einfacheren Weg?

  3. Hallo Julian,

    für die beschriebene Lösung brauchst Du wirklich ein Arduino pro Seite. Es gibt unzählige andere Ansätze, aber ich habe noch kein Tutorium dafür geschrieben. Wenn Du magst, google mal nach XBee. Damit geht das zum Beispiel.

    Liebe Grüße

    Stefan“

  4. Christian

    Hi

    Ich habe ein paar Fragen zu deinem Code:

    char Sensor1CharMsg[21];
    Warum erstellst du einen Array mit 21 Felder, wenn du nur 6 Sensordaten übertragen möchtest

    sprintf(Sensor1CharMsg, „%d,%d,%d,%d,%d,%d“,…
    Was genau macht diese Funktion, bzw für was stehen die ganzen %d, ?

    vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg));
    Welche Zeichen/Zahlen werden damit genau übertragen bzw was kommt dann beim Empfänger an?

    Danke schon mal im voraus :)

    Christian

  5. Wolfgang

    Kann hier ein Pufferüberlauf entstehen?


    // Maximum number of bytes in a message, counting the byte count and FCS
    #define VW_MAX_MESSAGE_LEN 30

    In der Bibliothek VirtualWire.h wird u.a. auch der Wert für VW_MAX_MESSAGE_LEN definiert (hier mit dem Wert 30).
    Im Programm „Receiver“ wird nun die Zeichenvariable „StringReceived“ in der Länge von 22 Zeichen erzeugt:

    char StringReceived[22];

    Weiter unten wird nun diese Variable mit Inhalt gefüllt:

    for (i = 0; i < buflen; i++) {
    StringReceived[i] = char(buf[i]); // data to array

    Kann dies nicht zu einem Buffer Overflow führen, da ja 30 Zeichen übertragen werden, das Empfangsfeld aber nur 22 Stellen groß ist?
    Wäre es nicht besser, in der Definition folgendes zu schreiben:

    char StringReceived[VW_MAX_MESSAGE_LEN];

    Dann ist immer garantiert, dass das Empfangsfeld genauso groß wie das Sendefeld ist.

  6. Wolfgang

    sprintf: diese Funktion dient dazu, Zahlen, die im Programm in einer binären – also für Menschen schlecht lesbaren Form – vorliegen, mit Hilfe der Umsetzungsmaske
    (hier „%d,%d,%d,%d,%d,%d“) in druckbare und somit gut lesbare Zeichen umzuwandeln (siehe http://www.cplusplus.com/reference/cstdio/sprintf/).
    Genau passiert hier also folgendes:
    die sechs Signale an den Sensorpinnen A0-A5 (siehe http://arduino.cc/en/pmwiki.php?n=Reference/AnalogRead) werden hier durch Kommata getrennt in die Zahlen 0-1023
    je nach am Sensor angelegter Spannung übersetzt und in der Variablen „Sensor1CharMsg“ abgelegt. Somit könnte z.B. in dieser Variable folgendes stehen:
    „12, 254, 1000, 500, 24, 125“.

    vw_send: diese Funktion ist in der Bibliothek beschrieben. Sie überträgt die mit sprintf (s.o.) erzeugte Zeichenkette an den Funksender.
    Dabei wird hier im ersten Parameter „(uint8_t *)Sensor1CharMsg“ nur ein Zeigen auf den Beginn dieser Zeichenkette übergeben. Damit die Funktion nun
    weiß, wieviele Zeichen sie denn übertragen muss, wird die Länge im zweiten Parameter „strlen(Sensor1CharMsg)“ übergeben. Die Funtion „strlen“ ermittelt die Länge
    des angegebenen Parameters.

    Hoffentlich habe ich das jetzt so verständlich beschrieben.

  7. Wolfgang

    Habe gerade feststellen müssen, dass hier die Zeichen „kleiner“ < und „größer“ > als Steuerzeichen interpretiert werden. In meinen beiden Kommentaren sollte ein Hinweis auf die Bibliothek <VirtualWire.h> stehen. Deshalb dieser Nachtrag. Ich hoffe, dass das jetzt richtig umgesetzt wird.

  8. Da ich es auf deinem Bild gerade sehe. Was ist eigentlich der Unterschied zwischen einem grünen und einem blauen Arduino Uno?
    Michael

  9. Rafic with the NANO and after playing with it for a while i got it to trnismat but never had success receiving using the nano Having 2 nano setups side by side on 2 computers, I have to type something in the Serial Monitor on the receive one before it will receive. It appears after reset, something isn’t set up correctly until you send it a character or two on the serial. Haven’t checked yet if it’s the serial chip on the nano, or code side not working until a char comes in.

  10. Marius

    Hallo,
    Ich bin Anfänger im Umgang mit Arduinos und Programmierung.
    Mein Ziel war es die (eine) Achsenposition eines Joysticks zu senden.
    Dabei nutze ich zwei Arduino UNO und die folgenden Radiofrequenzmodule:
    http://www.ebay.de/itm/like/401028290486?lpid=106&chn=ps&ul_noapp=true
    Ich den Code auf die Arduinos geladen und die Module wie auf den Bilder gezeigt angeschlossen. Nun zeigt der Serielle Monitor des Empfängers für alle Sensoren 0 an.
    Wo könnte das Problem liegen?
    Funktioniert der Code nicht mit den genannten Sender und Empfänger?
    Gruß Marius

  11. Micha

    Hallo zusammen,

    Ich nutze diesen Codes zur Übertragung von Temperaturen und in einem Menü vorgegebenen Werten.

    Ich habe jetzt zwei Probleme und hoffe das mir jemand helfen kann……

    Ich versende die analogen Eingänge der Temperaturfühler (NTC mit 1 MOhm bei 25 °C)

    Nehme diese werte und lasse sie mit der gleichen Formel umrechnen wie am Sender. Zum einem weichen die Daten m.e. zu sehr ab und es würde mich interessieren wie diese Abweichungen glätten kann….

    Das andere Problem ist:

    Ich gebe die werte an ein TFT-Display und an einen Warmsummer.

    Gedanke War, wenn die Temperatur zu sehr abweicht soll der Summer ansprechen und das Display auch eine Aktion ausführen. Aber die werte bleiben einfach stehen und es passiert nichts weiter. Würde man dem TFT vetrauen könnte man denken das sich die Temperatur nicht verändert. Ich will aber das wenn nichts mehr empfangen wird ich das aufnehme und umsetzten kann…

    HILFE !!!!!!! :-)

  12. Marc

    hi…
    ich hab ne allgemeine frage zur drahtlosen übertragung von daten/funktionen…

    ist es möglich die funkverbindung irgendwie fix zu koppeln?
    also das ich sobald ich die schaltung anschalte nur ein bestimmter funkempfänger angesprochen wird…

    ich habe vor mehrere empfänger mit unterschiedlichen sendern zu steuern…

    gruss marc

Schreibe einen Kommentar

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