Raspberry Pi’s über 433 MHz Funk kommunizieren lassen

Der ein oder andere wird sich die Frage schon einmal gestellt haben, wie man zwei Raspberry Pi’s ohne Internetverbindung drahtlos miteinander kommunizieren lassen kann. Zu diesem Zwecke sind kleine 433MHz Funk Module, welche bereits für wenige Euro erhältlich sind, ideal.

Daher möchte ich in diesem Tutorial zeigen, wie man zwei (oder mehrere) Pi’s miteinander sprechen lassen kann. Aber keine Sorge, solltest du zur Zeit erst ein Raspberry Pi besitzen, kannst du es auch ausführen.

 

Zubehör

 

Zusammenbau

Das Set besteht aus einem Sender (quadratisch, 3 Pins) und einem Empfänger (4 Pins). Beide sind sehr klein und sind daher auch optimal für andere Zwecke geeignet. Das Empfänger Modul hat in der Mitte zwei Data Pins, wovon wir aber lediglich einen brauchen.

443mhz 433mhz
 

RaspberryPi Sender Empfänger
 Pin 2 (5V)  VCC  VCC
 Pin 6 (GND)  GND  GND
 Pin 11 (GPIO17) – RPi Nr.1  ATAD  —-
 Pin 13 (GPIO27) – RPi Nr.2  —-  DATA (links neben GND)

 

Hast du nur ein Raspberry bzw. möchtest du, dass beide Pis senden und empfangen können, schließe Sender und Empfänger an.

 

Vorbereitung

Bevor wir die eigentliche Software testen, brauchen wir ein paar Bibliotheken. Dies muss auf allen Pi’s installiert werden, die kommunizieren sollen.
Als allererstes wird wiringPi benötigt. Hast du dies bereits vorher installiert, kannst du zur nächsten Installation springen (falls der Befehl gpio -v ein Ergebnis liefert, ist es installiert).

Als erstes aktualisieren wir die Pakete. Dies kann einige Minuten dauern.

sudo apt-get install git-core
sudo apt-get update
sudo apt-get upgrade

Anschließend clonen wir wiringPi (git muss installiert sein) und installieren es.

git clone git://git.drogon.net/wiringPi && cd wiringPi &&./build

Nun sollte gpio readall die Pinbelegung anzeigen.

 

Jetzt brauchen wir noch eine Bibliothek, die es uns einfach ermöglicht unsere Daten über den Sender zu verschicken und über das Empfängermodul zu empfangen.

git clone https://github.com/ninjablocks/433Utils.git --recursive

Diese Bibliothek enthält sowohl für das Arduino, also auch für den Pi entsprechende Skripte. Wir wechseln nun in den Ordner mit den Skripten für das Raspberry Pi und kompilieren diese,

cd 433Utils/RPi_utils
make all

 

Testen

Nun ist es an der Zeit zu testen. Dazu aktivieren wir als erstes den Empfänger. Stelle sicher, dass du im Ordner 433Utils/RPi_utils bist.

sudo ./RFSniffer

Sobald nun ein Code gesendet wird, wird es hier angezeigt.

Als nächstes wollen wir senden. Dazu gehen wir an das andere Raspberry und führen folgendes aus (wenn du nur ein Pi hast, öffne einfach ein zweites Shell Fenster, z.B. mittels Putty, Beschreibung dazu hier).

sudo ./codesend 1234

Die versendete Nummer kannst du dabei selbst eingeben. Durch ASCII Zahlen, lässt sich bspw. so ein Text verschicken.

Viel Spaß beim ausprobieren.

161 Kommentare

  1. Für mich wäre es Interessant zwei Projekte von dir miteinander zu verbinden: Zum einen die Ultraschall Abstandsmessung und das aber über den Funkkanal. Die Anwendung ist simpel: Ich möchte den Füllstande der Zisterne draußen messen, aber nicht unbedingt den Pi da reinhängen.
    Aus deiner Erfahrung: Würden sich die Projekte kombinieren lassen?
    (Also den Ultraschall Sensor mit einem Funkmodul kombinieren)
    Meine Bedenken: Natürlich ist die Laufzeit für das Ping dann um den Übertragungsweg erheblich länger aber der Offset sollte doch releativ konstant sein…?!

    Antworten
    • Möglich ist es, nur ohne Mikrocontroller wird das recht schwer, denke ich (je nachdem wie viel Vorwissen du hast). Die einfachste Lösung ist meiner Meinung nach den Pi als „Hauptstation“ zu verwenden und mit kleinen Arduinos per Funk reden zu lassen. Der Arduino kann dann bspw. alle Daten auslesen und an den Pi schicken. Ich habe so etwas selbst schon mit zwei Arduinos gebaut und will, sobald ich mehr Zeit finde, darüber auch ein Tutorial schreiben.

      Antworten
    • Genau sowas habe ich auch vor.
      Ich habe es mittlerweile geschafft das ich mit einem Arduino über 433 Mhz die Daten eines Temperatursensor DS18B20 versende und sie im RCSniffer im Raspberry Pi angezeigt bekomme.
      Das gleiche will ich auch mit den Ultraschall Sensoren machen um die Füllstande der Zisterne zu überwachen.
      Ich habe jetzt das Problem die angezeigten Daten des RCSniffters zu bekommen, bzw. auszulesen um sie anzupassen und später in einer Datenbank zu speichern.
      Kann mir hier einer weiter helfen? Wie kann ich diese Daten in eine Variable bekommen?

      Antworten
      • ich lasse die Ausgaben in der Shell mit sudo ./RFSniffer >> sniffer.log in die Datei sniffer.log schreiben. Die Datei öffe ich mit Python und hole mir die Werte.

        Im Quellcode RFSniffer.ccp kann man die Ausgabe so ändern, dass ein Zeitstempel mit gesendet
        printf(„Received %in“, mySwitch.getReceivedValue() );
        wird. Ich werde mir das die nächsten Tage ansehen. Dann make und es sollte fertig sein.

        Vielleicht auch nur eine begrenzte Anzahl von Durchläufen …while(1)… müsste dann angepasst werden und dann den Sniffer neu starten und eine neue Logdatei anlegen, damit es nicht so riesige Dateien gibt. Hab lange kein C mehr gemacht, wird etwas dauern.

      • Hat jetzt doch nicht so lange gedauert. Ich habe RCSniffer.ccp so geändert, dass nur noch ein Datenpaket empfangen wird. Dazu RCFSniffer z.B. mit Nano öffnen und unter der Zeile
        int PIN = 2;
        int empfang = 0;
        einfügen. (Bei PIN = kann übrigens der verwendete Interrupt geändert werden, nur so nebenbei) Hier dann die Zeile mit
        while (1)
        in
        while (empfang > daten.dat‘)

        Dein Pythonprogramm sollte im RPi_utils-Ordner gestartet werden. Andernfalls noch den Pfad hinzufügen.
        programmpfad = ‚/home/pi/meinverzeichnis/sudo RSFniffer‘
        datenpfad =‘ > /home/pi/meindatenverzeichnis/daten.dat‘
        befehl = programmpfad+datenpfad
        os.system(befehl)

      • angepasste RFSniffer.cpp

        /*
        RFSniffer

        Usage: ./RFSniffer []
        [] = optional

        Hacked from http://code.google.com/p/rc-switch/
        by @justy to provide a handy RF code sniffer

        Modified by Gerhard 3/ 2019,
        receives only one frame and output it

        }

        */

        #include „../rc-switch/RCSwitch.h“
        #include
        #include
        #include

        RCSwitch mySwitch;

        int main(int argc, char *argv[]) {

        // This pin is not the first pin on the RPi GPIO header!
        // Consult https://projects.drogon.net/raspberry-pi/wiringpi/pins/
        // for more information.

        // Modification
        }
        // Original physical pin 13, which is wiringpi 2
        // This version pin 36, which is wiringpi 27
        // see gpio readall for overview

        int PIN = 27;
        int empfang = 0; //did we have received a frame?

        if(wiringPiSetup() == -1) {
        printf(„wiringPiSetup failed, exiting…“);
        return 0;
        }

        int pulseLength = 0;
        if (argv[1] != NULL) pulseLength = atoi(argv[1]);

        mySwitch = RCSwitch();
        if (pulseLength != 0) mySwitch.setPulseLength(pulseLength);
        mySwitch.enableReceive(PIN);

        while(empfang < 1) { //waiting for frame

        if (mySwitch.available()) {

        int value = mySwitch.getReceivedValue();

        if (value == 0) {
        printf("Unknown encodingn");
        } else {

        printf("receivedonpin_36 %in", mySwitch.getReceivedValue() ); //print reveived frame
        empfang = 1; //frame received
        }

        fflush(stdout);
        mySwitch.resetAvailable();
        }
        usleep(1);

        }

        exit(0);

        }

        }

    • Das klingt äußerst interessant. Gerade im Bereich der Heimautomation wäre es interessant, ob sich z.B. Bewegungsmelder und Temeperatursensor mit dem Pi über den 433mhz Sender verbinden lassen? Kann man da einen Arduino Mini Pro zwischenlöten? Also zwischen Sensor und Sender?

      Antworten
      • Na klar, das ist auch mMn. die sinnvollste Lösung: Du schließt alle Module an einen Arduino an und versendest die Werte über Funk.

  2. Hallo Felix,,
    bei mir läuft so weit alles, vielen Dank an dieser Stelle.
    Mein Problem das Auslesen des Funkverkehrs mit dem Befehl ./RFSniffer
    Starte ich diesen, erhalte ich keine Fehler ab der es kommen keinerlei Meldungen. Der Bildschirm
    ( putty ) bleibt schawarz 🙁
    Wie kann ich überprüfen, dass dieser korrekt arbeitet ?

    GPIO 17 steht bei mir auf
    | 0 | 17 | 11 | GPIO 0 | OUT | Low |

    und GPIO 27 auf
    | 2 | 27 | 13 | GPIO 2 | ALT4 | Low |

    müsste der nicht auf IN stehen und wenn ja, wie kann ich den GPIO dahin gehend setzen ?
    Weißt Du Rat ?
    Gruß Achim

    Antworten
    • Die GPIOs sollten vom kompilierten cpp Programm gesteuert werden. Das hast du vor dem kompilieren nicht geändert oder?
      Hast du Funkfernbedienungen zuhause? Damit könntest du mal testen, ob er evtl. andere Signale erkennt. Ich habe ein paar Empfänger Module ausprobiert und sie empfiengen Signale verschieden gut (generische Signale wurden von einem Modul z.B. gar nicht erkannt).

      Antworten
  3. Hallo,
    Meine Frage ist, ob es nicht so eine Art Chat mit grafischer Oberfläche gibt.
    Bzw. währe es sehr schwer? (Bin zwar technisch fit aber mit Programmieren am Pi bin ich noch nicht sehr vertraut)
    Gruß Franz

    Antworten