Home > Tutorials > RFM12B Funkmodul direkt am Raspberry Pi betreiben

RFM12B Funkmodul direkt am Raspberry Pi betreiben

Aus meinen Raspberry Pi Pojekt Funksender und Empfänger hatte ich noch ein RFM12B 433Mhz Funkmodul übrig und suchte nach einer Verwendung, da kam mir die Idee das Modul direkt am Raspberry Pi zu betreiben und dem RasPi um mal zu sehen was so um mich herum passiert.

Material & Hardware

Folgende Hardware habe ich für den zusammenbau verwendet

Der Zusammenbau

Um das RFM12B Modul einfach auf meinem Breadboard verwenden zu können habe ich mir zwei Stiftleisten zurecht geschnitten (je 6 Stifte) und diese direkt an den RFM12B angelötet. Hierbei habe ich auf jeder Seite des RFM12B den vierten Pin ausgelassen da ich diesen nicht verwende.

Da ich den RFM12B auch in anderen Setups verwenden möchte habe ich auch an den PIN für die Antenne einen Stift angelötet. Das ist für den Einsatz auf dem Breadboard nicht optimal für mich aber zweckmäßig. Ihr könnt auch einen Stift mit der langen Seite nach oben anlöten und daran direkt eine Antenne anbringen (165mm Klingeldraht).

Das Ergebnis nach dem Anlöten der Stiftleiste sieht wie folgt aus:

RFM12B-3   RFM12B-2

Tipp: Biegt die Stiftleisten mit einer kleinen Zange zurecht und Steckt sie ins Breadboard, dann könnt ihr den RFM12B dazwischen klemmen und ohne Gefummel verlöten.

Die Verkabelung des RFM12B

Die Verkabelung des RFM12B auf dem Breadboard gestalltet sich recht einfach.

rfm12b-pins

Achtet darauf richtig zu verkabeln, sonst lauft ihr Gefahr das Modul zu zerstören.

Auf meinem Raspberry Pi GPIO Breakout mit Breadboard sieht die fertige Verkabelung so aus, rechts habe ich eine etwas verkürztes Stück Klingeldraht als Antenne ins Breadboard gesteckt.

rfm12b_breadboard

RFM12B am RasPi einrichten

Zum Glück stellt uns die Einrichtung des RFM12B direkt am Raspberry Pi dank der JeeLib und der Arbeit von gkaindl nicht vor all zu große Hindernisse, es gibt bereits ein passendes Projekt auf GitHub das es uns ermöglicht direkt mit dem Modul zu kommunizieren.

Vorbereitungen

Wie immer aktualisiere ich als erstes meinen Raspberry Pi und führe einen Reboot durch. Ich verwende übrigens das Raspbian Image 2015-02-16-raspbian-wheezy.img.

SPI aktivieren

Wir aktivieren zu erst unser SPI um eine Kommunikation zwischen RasPi und dem Modul zu ermöglichen. Dazu müssen wir das passende Kernel Modul laden, die Datei /etc/modules bestimmt welche Module beim Systemstart geladen werden. Wir editieren die Datei mit dem Editor Nano

Um die Kernel Modul “spibcm2708″ bei jedem Start automatisch zu laden fügen wir entsprechend der Schnittelle folgende Zeilen am Ende der Datei hinzu:

Gespeichert wird bei Nano mit STRG+X, Y und Enter.

Danach müssen wir noch die Datei /etc/modprobe.d/raspi-blacklist.conf ändern, diese verhindert noch das die Kernel Module bei jedem Start geladen werden.

Ihr könnt die Zeile blacklist spi-bcm2708 aus der Datei löschen oder durch auskommentieren (voranstellen einer # (Raute)) unwirksam machen.

Speichern wieder mit STRG+X, Y und Enter. Das SPI Kernel Modul wird nun nach jedem Neustart automatisch geladen, um dieses zu aktivieren solltet ihr euren RasPi nun booten.

RFM12B Treiber installieren

Es handelt sich um einen Kernel Treiber der uns das RFM12B Modul als Character Device unter /dev/ am Raspberry Pi zur Verfügung stellt, damit können wir dann recht unproblematisch Daten auslesen aber auch schreiben.

Zunächst benötigen wir einige Sourcen um den Treiber kompilieren zu können. Wir setzen erst mal unsere Timezone richtig und holen dann die sourcen via apt. An der stelle verwende ich die Sourcen von Raspbian, das sind zwar nicht exakt die die von der RasPi Foundation im Image verwendet werden, das stört mich aber nicht, eine andere Möglichkeit den Treiber zum laufen zu bekommen habe ich nicht gefunden.

Wir sehen nun unter /bootvmlinuz-3.18.0-trunk-rpi” und  “initrd.img-3.18.0-trunk-rpi” (kann bei euch abweichen) und fügen diese zu unserer /boot/config.txt hinzu um mit diesem Kernel zu booten. Dann führen wir einen Reboot durch. Kontrollieren könnt ihr danach den aktuellen Kernel dann mit sudo uname -r bei mir ist das nun 3.18.0-trunk-rpi

Nun holen wir uns den Treiber von Git-Hub in unser Home, ersetzen in der Konfiguration rfm12b_config.h die Parameter welche bestimmen das wir den Treiber auf einem Raspberry Pi einsetzen. Falls ihr ein anderes Modul oder Konfiguration verwenden wollt könnt ihr die Datei “rfm12b_config.h” auch manuell anpassen.

Das Makefile hat in der aktuellen Version einen Bug, daher müssen wir es mit Nano editieren

Wir fügen vor die Zeilen 25 & 26 jeweils eine Raute ein um diese auszukommentieren, die beiden Zeilen meiner Makefile sehen dann so aus.

Wir speichern die datei mit STRG+X,Y und Enter und starten dann make

Nachdem der Treiber kompiliert wurde kopieren wir diesen in unser aktuelles Modules Verzeichnis und aktivieren das Modul durch hinzufügen des Namens in die Datei /etc/modules. Mit Depmod regenerieren wir die Abhängigkeiten zwischen den Kernelmodulen.

Dann kompilieren wir noch die mitgelieferten Beispiel-Programme, mit diesen testen wir ob die Kommunikation mit dem RFM12B und unserem Raspberry Pi funktioniert. Es ist ein reboot notwendig um den Treiber zu aktivieren.

Nach dem Neustart wechseln wir in das Verzeichnis mit den kompilierten beispiel Programmen und starten dort.

Dort können wir nun das ein beispiel Programm aufrufen, ich verwende das Programm rfm12b_read.

Da ich natürlich wusste das ich hier mehrere 433Mhz Temperatur Sensoren habe die in der Network ID 210 laufen (vor dem kompilieren in der rfm12b_config.h eingestellt) ist die Ausgabe für mich nicht sehr überraschend.

rfm12b-direkt-am-raspi

Meine Sender übertragen drei Integer Werte die, um das Komma zu entfernen, mit 100 multipliziert wurden. Das spart Platz im Gegensatz zu einem String.

Das Umrechnen der Werte hat mir einiges an Kopfzerbrechen bereitet, dabei war es nach etwas Recherche um das Wissen aufzupolieren gar nicht so schwer.

  • Zum Beispiel die Temperatur von 46,35 Grad ist multipliziert mit 100 ein Integer Wert von 4635
  • Der Integer Wert 4635 ist ein Multi-Byte-Wert der zwei Bytes braucht.
  • Der Wert 4635 wird vor dem Übertragen also in zwei Byte Werte so codiert (encoded)
    • 4653 / 256 = 18   (Dividiert durch 256)
    • 4653 % 256 = 27 (Modulo)

In unserem Paket finden wir die beiden Bytes wieder, allerdings umgekehrt da die Atmel Chips der Sender mit einer umgekehrte Byte Reihenfolge arbeiten (Little-Endian)

Die beiden Werte können wir mit einem kleinen Stückchen C Code zurückrechnen. Also erolgt die Dekodierung (decoding) so: Byte A +256 * Byte B = Integer Wert

Wir finden also im hinteren Teil des Pakets  die Werte für Luftfeuchte (65,3H),Volt (4,635V) und Temperatur (4,6C).

Die ersten beiden Bytes sind die Header Informationen aus welchen sich eigentlich die Node ID des Senders ergeben sollte, wie die genau codiert wird konnte ich nicht herausfinden. In diesem Beispiel ist es die Node ID 21.

Wenn etwas mehr Zeit ist werde ich euch das RFM12B mit direktem Anschluss an den Raspberry Pi noch etwas näher bringen.

Viel Spaß beim Basteln.

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (1 votes, durchschnittlich: 5,00 von 5)
Loading...

Über raspberry.tips

15 Kommentare

  1. Hallo,

    da ich noch Anfänger bin, habe ich mich sehr über dieses Tutorial gefreut.

    Ich verwende einen RasPi 2B, nach dem Update habe ich  3.18.11

    Allerdings bootet der RasPi nicht mehr nach den Zeilen, das Bild bleibt schwarz:

    echo e “kernel=vmlinuz-3.18.0-trunk-rpi” | sudo tee a /boot/config.txt
    echo e “initramfs initrd.img-3.10-3-rpi followkernel” | sudo tee a /boot/config.txt
    sudo reboot

    Der Befehl davor:

    sudo aptget y install linuximagerpirpfv linuxheadersrpirpfv

    liefert am Ende:

    ln: Harte Verknüpfung „/boot/initrd.img-3.18.0-trunk-rpi.dpkg-bak“ => „/boot/initrd.img-3.18.0-trunk-rpi“ konnte nicht angelegt werden: Die Operation ist nicht erlaubt

    update-initramfs: Generating /boot/initrd.img-3.18.0-trunk-rpi

    Auch ein zweiter Versuch mit einem sauberen Image brachte den gleichen Erfolg?!

    Was mache ich nur falsch?
    Gruß und Dank
    Christian

  2. Leider komme ich bei der Anleitung an meine Grenzen, da ich versuche den RFM12BP mit deiner ANleitung zu betreiben doch wenn ich den adapter am RPI anschließe geht der RPI einfach aus und startet auch nicht. Vielleicht hast du zum betreiben eines RFM12BP eine Lösung für mich oder eine kleine Abwandlung der Anleitung.

    MfG

    Patrick

    • Hallo Leute

      es ist auch klar warum es nicht funktioniert. Es muss statt

      echo -e “kernel=vmlinuz-3.18.0-trunk-rpi” | sudo tee -a /boot/config.txt
      echo -e “initramfs initrd.img-3.10-3-rpi followkernel” | sudo tee -a /boot/config.txt

      richtig heissen:

      echo -e “kernel=vmlinuz-3.18.0-trunk-rpi” | sudo tee -a /boot/config.txt
      echo -e “initramfs initrd.img-3.18.0-trunk-rpi followkernel” | sudo tee -a /boot/config.txt

      wobei es nicht verkehrt ist zuerst zu verfizieren, ob die Filenamen noch up2date sind. D.h.

      ls /boot/vmlinuz-3.18.0-trunk-rpi /boot/initrd.img-3.18.0-trunk-rpi

      muessen im obigen Beispiel vorhanden sein. Ansonsten im config.txt entsprechend anpassen.

      Danke fuer die super Anleitung!

  3. Wie sieht es mit dem Raspberry Pi 2 Model B aus? Wenn ich da den Kernel 3.18.0 in /boot/config.txt eintrage, fährt er nicht mehr hoch.

  4. Hallo!

    Verwendest du selbstgebaute Senoren oder fertig gekaufte Senosren.

    Bin auf der Suche nach fertigen Sensoren die ich über RFM12B auslesen könnte.

    LG & danke,
    Christian

  5. Das Auslesen hast du in deiner Anleitung super erklärt aber wie sendet man?

  6. Ich habe alles so gemacht wie es da steht, jetzt schon zum 2. mal aber bei mir kommt am ende wenn ich sudo ./rfm12b_read eingebe immer: failed to open /dev/rfm12b.0.1: No such file or directory.

    Was mache ich falsch?

    Den Kernel habe ich so hinzugefügt:
    echo -e “kernel=vmlinuz-3.18.0-trunk-rpi\ninitramfs initrd.img-3.18.0-trunk-rpi followkernel” | sudo tee -a /boot/config.txt

    • ich habe diese Problem auch. I habe neu gestartet, aber es ist gleich. Was mache ich falsch?

    • Ich hatte das Problem auch. Das kommt von denn Device Tree:

      “The January 2015 Raspbian release, with Pi 2 support, switches to a new kernel (3.18), and includes a configuration change to enable Device Tree support by default. This has caused some previously working things to mysteriously stop working, but with a few configuration changes normal service should be resumed.”

      Nach der deaktivierung und reboot, ist rfm12b.0.1 jetzt endlich unter /dev aufgetaucht.

      Device Tree deaktivieren:
      sudo raspi-config -> Advanced Options -> Device Tree

      Wahrscheinlich kann man diese durch andere Workarounds aktiviert lassen aber das war schneller :)

  7. Ich habe ein RFM12S Modul ReV:3.0 mal vor Jahren bei Pollen bestellt. Leider funktionieren die irgendwie nicht mit der konfiguration. Da steht auch 434 MHz drauf?!
    Funktionieren die überhaupt am PI? Wie bekomm ich die zum laufen?

  8. Hallo
    eine Frage kann man das wohl auch nutzen um die Sensoren der Wetterstation WMR 200 zu empfangen?
    Man müsste nur zum Auswerten eine Übermittlung an weewx http://www.weewx.com/ hinbekommen.
    Normal bekommt die Software die Werte per USB.

    Das heißt ich möchte die eigentliche Wetterstation dadurch ersetzen und nur noch die Sensoren benutzen.

Schreibe einen Kommentar

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