41sQxqCSyRL

GPIO, Projekte

Raspberry Pi mit 433Mhz Funksender fernsteuern

Wer eine Hausautomatisierung o.ä. anstrebt, wird sich früher oder später bestimmt auch Gedanken über eine kabellose Bedienung machen. Dazu bietet sich die 433Mhz Frequenz an, denn es gibt viele günstige Sender und Empfänger sowie eine breite Masse an verfügbaren Bibliotheken und Skripten.

In diesem Tutorial möchte ich zeigen, wie man mittels einem kleinen Handsender und einem Empfänger GPIOs auf dem Pi (de)aktivieren kann.



Zubehör

Um eine kleine Testschaltung zu bauen, habe ich folgende Komponenten benutzt:

Falls du eine Funkfernbedienung hast, kannst du auch diese benutzen, allerdings wird dann wohl das ursprünglich gedachte Objekt auch aktiviert 😉
Bei den Clones sollte man noch beachten, dass sie oftmals (nicht alle Modelle) erst ein Signal kopieren müssen, um eines zu senden.

Aufbau

Die Widerstände vor den Transistor Basen sind 10kΩ groß, jene bei den LEDs 330Ω groß.

Der Aufbau ist für das Raspberry Pi 2 Model B/B+, aber ist auch auf allen anderen Modellen ausführbar (ggf. WiringPi Pinbelegung beachten).433mhz_Steckplatine

 

Software

Als Grundlage habe ich dieses Repository genommen, welches ich bereits in einem vorherigen Tutorial benutzt habe.

Als erstes sollten wir den Code laden:

wget http://tutorials-raspberrypi.de/wp-content/uploads/scripts/433control.zip
unzip 433control.zip
cd 433control

Wir kompilieren nun, um gleich den Code des Empfängers auslesen zu können (falls du einen anderen Pin verwendest, ändere die RFSniffer.cpp Datei und kompiliere danach).

make sniff

 

Um die Codes jetzt auszulesen starten wir die kompilierte Datei

sudo ./sniff

und drücken die Tasten auf der Funkfernbedienung.
Meine Codes sind: 11734380, 12269868, 12365029 und 11854229. Da du andere Codes haben wirst, muss die Datei RFSniffer.cpp bearbeitet werden.

sudo nano RFSniffer.cpp

Ab Zeile 46 findest du die verschiedenen Codes, die durch deine ersetzt. Falls du andere Pins für die LEDs genommen hast, kannst du dies auch hier ändern (Achtung: WiringPi Belegung).

Als nächstes muss die Datei kompiliert werden:

make RFSniffer

Anschließend wird gestartet:

sudo ./RFSniffer

Wenn du anschließend die Tasten auf der Fernbedienung drückst sollten die LEDs angehen. Falls die LEDs flackern, liegt das daran, dass das Signal nicht dauerhaft gesendet wird und sobald keines empfangen wird, die LEDs automatisch ausgeschaltet werden. Du kannst den Code aber natürlich deinen Wünschen nach anpassen.

Denkbar sind hier unterschiedliche Szenarien, wie den Nutzen bei der Heimautomatisierung.



, , , , , , ,


56 Kommentare

  1. Fillip sagt:

    Guten Abend,

    vielen dank für das einfache Tutorial. 🙂 Ich möchte mir einen Funk Tür Alarmkontakt holen und diesen in meinen Briefkasten verbauen. Dieser sendet 433 mhz Signale welche ich dann mit dem Pi abfragen will, kein Problem bis hier. Doch wie kann ich das in der RFSniffer.cpp datei so ändern dass nicht ein GPIO geschaltet wird sondern eine datei (.sh) ausgeführt wird?

    • Felix sagt:

      Du könntest es mit system("pfad/zur/datei.sh -parameterXY") versuchen. Damit führst du ein Kommandozeilenargument aus. Eine Erklärung gibt es hier.

    • Fillip sagt:

      WoW das ging schnell! Wie ist denn die Pin belegung bei dem „B“ ? Bei deinem Schaltbild geht der DATA ja auf PIN 9, welcher in beiden fällen GNG ist, hab ich was übersehen?

    • Felix sagt:

      Meinst du Model B? Da ist der Pin Header einfach kürzer, aber ich habe sowieso keinen der zusätzlichen Pins des B+ genommen.

  2. Fillip sagt:

    Ach und noch ein komisches phänomen… Ich habe den Empfänger gar nicht dran, nur den Sender, wenn ich die ./sniff starte und per „PowerPi“ meine Funksteckdosen schalte wird mir trotzdem „Received xxxcodexxx“ angezeigt, wenn ich die 433 mhz Fernbedienung drücke jedoch nix

    • Felix sagt:

      das klingt merkwürdig. Funktioniert es mit Empfänger denn richtig?

    • Fillip Görbing sagt:

      Nein, der Empfänger du funktioniert gar nicht 🙁 auch wenn ich alles abziehe (Empfänger und Sender) werden mir beim Sendebefehl immernoch Daten beik Empfangen angezeigt… Das kann ja nicht normal sein oder?

    • Felix sagt:

      Ich habe eine kleine Änderung am Schaltplan vorgenommen, schau mal ob es damit bei dir klappt?

    • Fillip Görbing sagt:

      An Pin 11 liegt schon der 433mhz Sender bei mir dran, welcher Pin ist denn bei dem RFSniffer hinterlegt und lässt der sich eventuell ändern?

    • Felix sagt:

      Schau dir mal die RFSniffer.cpp an und ändere dort ggf. die Pins vorm kompilieren. Die Pin Nummern richten sich nach der WiringPi Belegung.

  3. Fillip sagt:

    Das ist wahrscheinlich „int receiverPIN“ oder? Diesen habe ich nun auf „1“ gesetzt, den Empfänger so angeschlossen, leider tut sich nix.

    Auch ein „sudo make sniff“ bringt nut „make: ’sniff‘ is up to date.“

    • Felix sagt:

      Wenn du es an Pin 11 (Pi Header) angeschlossen hast, ist deine Zuweisung im Code nicht richtig. Schau dir nochmal die WiringPi Pinbelegung an: Ganz außen steht die Nummer, die du genommen hast. Pin 1 (WiringPi) entspricht also Pin 12 (Raspberry Pi Header). Pin 0 (WiringPi) wäre Pin 11 (Pi Header).
      http://www.tutorials-raspberrypi.de/gpio/wiringpi-installieren-pinbelegung/

    • Fillip sagt:

      Ich habe jetzt „int receiverPIN = 6;“ stehen, den sender an GPIO06 (Pi Header Pin 22) geklemmt. Jedoch keine änderung zu dem ersten Phänomen…

    • Felix sagt:

      Neu kompiliert hast du? Du könntest noch versuchen den anderen freien Pin auf dem Empfänger Modul zu nehmen (bei mir hat das bei manchen Modulen funktioniert). Ansonsten überprüf die WiringPi Belegung mal mit gpio readall, um wirklich auf Nummer sicher zu gehen (besonders falls du ein Pi 2 benutzt).

    • Fillip sagt:

      Guten Abend Felix,

      es ist egal auf welchen Pin ich das stelle, auch wenn kein Empfänger dran ist NUR ein Sender und ich befehle SENDE (an bsp. meine Funk Steckdosen) wird mir bei „sudo ./sniff“ der Recive Befehl angezeigt den er sendet… Also irgendwo muss der wurm drinn sein…

    • Felix sagt:

      Moment, nur um es richtig zu verstehen: Du hast kein Empfänger-Modul angeschlossen, nur das Sende-Modul und empfängst trotzdem beim Senden den Code (ohne Empfänger)?

    • Fillip sagt:

      Richtig! Nur sende modul dran! :-/

    • Felix sagt:

      Dann darf eigentlich nichts empfangen werden. Du nutzt doch die verlinkten Module, oder etwa andere? Ich kann mir nicht richtig erklären, wie ein Sender auch empfangen soll. Die empfangenen Codes stimmen aber auf jeden Fall?
      Ich würde dir raten noch einmal von Grund auf den Code und die Verkabelung neu zu machen. Es ist leider ein bisschen schwierig ohne Code und Aufbau zu sehen, hilfreiche Tipps zu geben.

    • Fillip Görbing sagt:

      Felix, wollte nur kurz sagen dass es nun klappt mit dem empfangen, habe das ganze neu aufgesetzt… Nur das mit dem Starten des Skriptes klappt nicht. Kannst du mich eventuell wenn du Zeit hast mal per Mail kontaktieren?

    • Felix sagt:

      Immerhin 🙂 Auf der Kontakt Seite steht die Email-Adresse, falls es etwas ausführlicher wird.
      LG Felix

    • Jean sagt:

      Nachdem ihr den PIN in der Datei „RFSniffer.cpp“ geändert habt müsst ihr noch den Befehl „make“ ausführen. Ansonsten werden die Änderungen nicht übernommen.

    • elhoppo sagt:

      Kurze Ergänzung hierzu:
      In der sniff.cpp muss der Pin natürlich auch geändert werden ( int PIN=0 auf entsprechenden Pin ändern). Danach kompilieren und schon läuft die sniff! Hat mir ungefähr eine Stunde lang Kopfzerbrechen bereitet, da die Codes immer nur auf Pin 0 ausgelesen werden konnten 🙂

  4. Tomasz sagt:

    Hallo,
    seit wenigen Tagen habe ich einen Pi und auch Arduinos habe ich zum tüfteln besorgt. Obwohl ich kein Python kenne und C++ ist auch noch ein Fremdwort, habe ich schon so einiges mit denen zwei angestellt. Auch dass der Pi mit Arduino per 433Mhz kommuniziert. Der Pi sendet und Arduino kann es lesen aber nur per Befehlseingabe. Was ich suche ist eine Möglichkeit die Befehle per Python an den Pi senden zu können. Nach Tagelange Suche im Netz habe ich keine Lösung gefunden. Hat jemand von euch eine Idee oder ein Tipp wie ich das hin bekomme?

    • Felix sagt:

      Wenn du ein Shell-Skript auf dem Pi hast, welches deine Befehle ausführt, kannst du das Skript einfach per Python aufrufen. Mehr dazu hier. Wenn du es mit reinen Konsolen Befehlen ausführst, pack alle in ein Skript (falls es mehrere sind) oder ruf ihn direkt per Python auf.
      Auch kannst du C++ Dateien einfach in deinem Python Code einbinden.

  5. Zengal sagt:

    Ich habe eben auch sniff installiert und gestartet. Bisher habe ich am RPI nur einen Sender und schalte mit PowerPi 3 Steckdosen. Sobald ich diese vom Webinterface aus anspreche, empfängt sniff einen Code. Scheint wohl vom WiringPI zu kommen. Schalte ich die Dosen über die Original-FB, dann erscheinen (natürlich) keine Codes.

    Ich werde mir jetzt mal so einen Empfänger zulegen. Ich hoffe, die sind wenigstens genauso empfindlich wie die in den Steckdosen verbauten. Man hört (liest) ja einiges gruseliges darüber…

    • Felix sagt:

      Bei den Funksteckdosen gibt es allerdings zwei Typen: Jene mit generischem Code und jene, bei denen du den Code selbst einstellen kannst. Die Letzteren sind ohne Probleme einsetzbar, bei den generischen Codes haben manche Empfänger Probleme, wie ich feststellen musste. Ich habe gelesen, die „super-heterodyne“ Empfänger sollen damit besser klar kommen.

  6. Zengal sagt:

    Mit dem Empfänger will ich die Signale von 433Mhz Türkontakten (SUNLUXY Wireless o.ä.) empfangen.

    • Felix sagt:

      Dann check am besten mal, ob es feste Codes oder generische sind. Ansonsten kannst du auch mal schauen, ob diese bereits von jemandem verwendet wurden. Eine gute und große Anzahl an 433Mhz Codes findest du z.B. hier: http://www.pilight.org/

    • Fillip Görbing sagt:

      Ich habe mir jetzt Funk Türkontakte gekauft, haben einen Fixierten Code, den kann Sniffer empfangen

  7. thomas42 sagt:

    >Was ich suche ist eine Möglichkeit die Befehle per Python an den Pi senden zu
    >können. Hat
    >jemand von euch eine Idee oder ein Tipp wie ich das hin bekomme?

    Könnte man mit einem Webserver und einem oder mehreren cgi lösen.

  8. Bred sagt:

    Hey,
    ich habe hier jetzt eine Clone Fernbedienung, das bedeutet dass da noch kein Code drauf ist. Wie kann ich ihn jetzt programmieren ? Habe einen Sender und Empfänger am Raspberry pi

    LG

    • Felix sagt:

      Bei den meisten Clones drückt man die beiden oberen Tasten gleichzeitig, bis es blinkt, um zu resetten. Dann auf Empfänger den Knopf drücken, dessen Code geclont werden soll. Gleichzeitig auf dem Clone die gewünschte Taste drücken, auf der der Code sein soll und solange halten, bis es wieder blinkt.

  9. Bred sagt:

    Ich habe diesen Empfänger :

    http://www.amazon.de/gp/product/B00M0XTP4W?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s02

    Der hat keine Tasten…
    Geht das nicht irgendwie mit den Modulen am Raspberry Pi ???
    lg

    • Felix sagt:

      Du hast doch von einem Clone geredet (z.B so einer).
      Ein Empfänger, wie du ihn verlinkt hast, hat keine Tasten. Du kannst einen gesendeten Code auslesen und dann mit dem Sender senden lassen (siehe Tutorial). Du kannst auch versuchen einen beliebigen Code senden zu lassen und mit dem Clone zu kopieren, nur weiß ich nicht ob dieser sofort erkannt wird, da normalerweise viele Wiederholungen hintereinander gesendet werden.

    • Bred sagt:

      Das Problem ist ja dass ich mit dem Empfänger nichts von der Fernbedienung empfange. Ich weiß aber dass der Empfänger funktioniert , da er Signale vom Sendemodul (siehe Link) empfängt.
      Als Fernbedienung nutze ich diese:

      http://www.amazon.de/gp/product/B00V4UJNBC?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00

      Noch was:
      mit dem RFsniffer funktioniert es zwar nicht aber mit pilight kann ich mit pilight-debug Signale empfangen… Was jetzt halt noch fehlt ist , dass ich über pilight ein Script starten kann, was nicht so einfach ist, da man bei Pilight meines Wissens nach nicht einfach so das Script bearbeiten kann.
      lg

    • Felix sagt:

      Was du verlinkt hast ein Clone (also keine Fernbedienung), der hat standardmäßig keinen Code drauf, den er senden kann. Diese Dinger sind eigentlich nur dazu da Signale zu kopieren. Wenn du also eine richtige 433Mhz Fernbedienung hast, kannst du den Code kopieren. Ich weiß nicht in welchem Takt die Fernbedienungen ihren Code wiederholend senden, wenn du diesen aber kennst kannst du mit deinem Sender den Code im selben Takt senden und der Clone solle ihn kopieren können.

    • Bred sagt:

      Selbst wenn ich diesen Takt kennen würde, passiert nichts wenn ich die ersten zwei Knöpfe drücke… Beim gedrückthalten von einem Knopf leuchtet die LED. Wenn ich mehrere gleichzeitig drücke bleibt die LED aus…

    • Felix sagt:

      Mit Takt meine ich den Takt in dem der Pi das Signal senden müsste.
      So wie ich dich verstehe, willst du einen von dir definierten Code vom Pi senden und auf den Clone kopieren, richtig? Dazu musst du den Code x mal in einem Takt senden und gleichzeitig am Clone die Tastenkombination zum kopieren drücken (diese ließt du am besten in der Anleitung oder im Internet nach). Bei meinem Clone sind es wie gesagt die oberen beiden Tasten, die den Clone resetten und zum kopieren bereit machen, wenn man sie gleichzeitig drückt. Das kann aber bei deinem anders sein.

    • Bred sagt:

      In der Anleitung steht dass ich am Empfänger eine LEARN Taste drücken solle und wenn sie anfängt zu blinken die zu programmierenden Tasten am Clone zu drücken…
      In sämtlichen Videos werden einfach die ersten zwei Tasten gleichzeitig gedrückt bis die LED drei mal blinkt…
      Bei meinem Clone passiert einfach gar nichts wenn ich 1+2 gleichzeitig
      für mehr als 20 Sekunden gedrückt halte.
      lg

    • Felix sagt:

      Das ist dann ein spezifisches Problem mit deinem Clone. Bei meinem Clone ist es wie gesagt mit den oberen beiden Tasten gleichzeitig. Für was brauchst du (in Bezug auf den Pi) überhaupt einen Clone?

  10. Bred sagt:

    Ich habe einen Clone gebraucht um mit ihm GPIOs ( bspw. Relais) auf dem Pi schalten zu können.
    Ich habe jetzt meinen Clone zurückgeschickt…
    Kannst du mir einen guten Clone empfehlen der einfach zu programmieren ist ( mit dem Pi) oder sogar einen vorprogrammierten wenn es sowas gibt.
    Bei deinem Clone dauert mir der Versand zu lange…

    • Felix sagt:

      Du kannst dich ja mal hier umsehen, den gibt es von verschiedenen Anbietern.
      Clones haben eigentlich nie einen Code vorprogrammiert, das wurde ja nicht dem Sinn entsprechen. Aber du kannst doch einfach den Code einer anderen 433Mhz (Steckdose, Lampe, Garage, etc.) clonen und verwenden, solange es zu keinen „Überschneideungen“ kommt.

  11. Klaus Werner sagt:

    Hallo, cg
    Spitzentutorial, eines der wenigen die auf Anhieb funktionieren.
    Und ich weiß, wovon ich rede:-)
    Nicht das es wichtig wäre, der sniffer zeigt mir aber andere Werte an als die, mit denen ich die Steckdose schalte.
    Die Steckdose wird „klassisch“ mit
    ./send 11101 2 1
    geschaltet.
    Der Sniffer zeigt mir sowas wie 70345 an.

    Egal, viel Spass weiterhin, ich bin Dir was den Wissensstand anbelangt dicht auf den Fersen. Jetzt geht es bei mir mit Rauchmelder weiter.

    Klaus

  12. Willi sagt:

    Hallo Felix,

    vielen Dank für das Script (jetzt erst gefunden), funktioniert soweit erst einmal.
    Ich kann es aber so nicht gebrauchen und hätte daher noch Fragen:
    Für meinen Bedarf müsste es beim Hochfahrfen des Raspi automatisch starten und im Hintergrund laufen. Könntest du mir bitte aufzeigen, wie ? Desweiteren hätte ich gern gewußt, ob man den Receiver-Pin (jetzt = 0) ändern kann? Das ist nötig, weil der Pin schon belegt ist; eine Pin Änderung ist in dem anderen Progi nur schwer bis gar nicht möglich. Soweit man sieht, ist in der config nur die „blaue“ Led mit einem Ein-und Ausschaltbefehl versehen, rot und grün nicht. Kann man diese auch einfach so „anlegen“ wie die blaue?

    Vielen Dank vorab

    • Felix sagt:

      Hallo Willi,
      zu deiner Frage bzgl. Autostart kannst du dir entweder mal cron ansehen, oder aber dieses Tutorial: Programm im Autostart ausführen.
      Natürlich ist es möglich, einen anderen Pin zu verwenden. Dazu musst du die RFSniffer.cpp Datei bearbeiten (Zeile 23). Wichtig ist hierbei, dass du die WiringPi Pin Nummern benutzt und nicht die üblichen GPIO Nummern.
      Das Beispiel mit den LEDs sollte nur zu Demonstrationszwecken dienen, um eigene Projekte zu realisieren. Mein Sender hatte nur 4 Tasten, weshalb ich nicht alle an/aus schalten hätte können. Wenn du die Dateien anpasst bzw. einen Sender mit mehr Codes hast, ist das aber gar kein Problem.
      Wenn du weitere Fragen hast, kannst du dich ruhig melden 🙂
      LG Felix

  13. Michael sagt:

    Hallo,

    danke für das Tutorial.
    Ist es möglich mit nur einem Empfänger mehrere Sender zu betreiben?
    Falls ja, kann man dann auch zwischen den einzelnen Sendern unterscheiden?

  14. Maik sagt:

    Ich möchte gerne ein Pythonscript einbinden. Dieses sendet per Telegram eine Nachricht an mein Handy (Push). Wie würde der entsprechende Code aussehen in der RFsniffer.cpp ? Wäre prima wenn ich eine Antwort bekäme…

  15. Maik sagt:

    Es funktioniert gar nichts.
    Anscheinend wird das Script gar nicht erst gestartet.
    Wie kann ich sehen was nicht passiert?

  16. Leon sagt:

    Danke für das Tutorial, hat super funktioniert. Ich möchte nun aber eine python Datei ausführen. Dafür breuchte ich den Befehl den man in der RFSniffer.cpp Datei anstelle des digitalWrite Befehls benutzen muss.

  17. Patt sagt:

    Hi, der Artikel ist zwar vielleicht etwas älter, aber ist im ersten Satz nicht ein kleiner Fehler drin? Ich denke du meintest eher schnurlos statt funklos? ^^

Schreibe einen Kommentar

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

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!