RFM12 Funkmodule mit Arduino ansprechen

Der Kistenschieber  Elektronikversender Pollin bietet RFM12 Module für gerade mal 5€ an.

Ein Schnäppchen, verglichen mit Xbee oder Bluetooth Modulen. Dummerweise sind die Dinger nicht mehr so ganz taufrisch und die meiste Hilfe im Internet bezieht sich auf den Nachfolger RFM12B.

Die alten RFM12-Module zum Laufen zu bringen ist kein Kunststück – die Schwierigkeit für mich bestand damals eher darin, mich durch die vielen Tutorials und Beispielprogramme zu wühlen. Die meisten sind in normalem C, ich wollte aber etwas, was schön gekapselt in einer Library steckt und sich einfach benutzen lässt.

Die Lösung stellte Jean-Claude Wippler zur Verfügung, ein passionierter Programmierer und Blogger, dessen Daily Weblog jeelabs.org ich euch sehr ans Herz legen möchte. Als ich es gefunden hatte, habe ich begonnen, jeden einzelnen Post zu lesen – jetzt, wo ich damit fertig bin, hat er das Bloggen eingestellt 😥

Sein RF12-driver ist in der Bibliothek JeeLib zu finden, die es hier auf Github herunterzuladen gibt (Ganz rechts findet man den Button ‘Download ZIP’). Alles ist gut dokumentiert und erlaubt einen sehr energiesparenden Betrieb (Bei ihm zuhause läuft ein Mikrocontrollerboard, das seit 3 Jahren mit einer einzigen Akkuladung läuft und jede Minute über das RFM12B-Modul einen Zählerstand ausgibt). Um das alte RFM12-Modul zu verwenden, muss man Folgendes beachten:

  • Das letzte Argument in der Funktion rf12_initialize muss 212 sein
  • Das RFM12 ist explizit 5V-tolerant. Man braucht keine Pegelwandler.

Was für beide Versionen des Funkmoduls gültig ist:

  • Vor dem Senden mittels rf12_sendStart müssen eventuelle Empfangsvorgänge abgeschlossen werden (rf12_recvDone aufrufen) und abgefragt werden, ob das Senden auch begonnen werden kann (rf12_canSend gibt 1 zurück). Bereits der Aufruf von rf12_canSend leitet das Senden ein. Wenn rf12_canSend 1 zurückliefert, muss man auch direkt danach rf12_sendStart aufrufen, ansonsten passiert Blödsinn.
  • Das zweite Argument von rf12_sendStart ist ein Zeiger auf die zu übertragenden Daten. Wenn du eine einzelne Variable übertragen willst, dann schreibe ein & vor ihren Namen; wenn du ein Array versenden willst, reicht dessen Name. Das dritte Argument ist die Länge der Daten in Byte. Bis zu 66 Byte passen in ein Paket.
  • Zum Empfangen sollte möglichst häufig die Funktion rf12_recvDone aufgerufen werden. Wenn diese etwas anderes zurückliefert als 0, so ist gerade ein Paket empfangen worden. Dieses wurde in das Array rf12_data gespeichert und sollte von dort möglichst schnell ausgelesen werden, damit die Daten nicht beim Empfang des nächsten Pakets überschrieben werden.

Beispielprogramme zum Senden und Empfangen sind auf GitHub zu finden. Ich habe hier im Wesentlichen die Programme von oppes kopiert. Man braucht zwei Arduinos und zwei RFM12 Module. Der eine sendet einen konstant ansteigenden Zähler aus. Der andere gibt die empfangenen Daten auf der seriellen Konsole aus. Voilá! – Deine erste Funkstrecke!

Der Anschluss funktioniert folgendermaßen (Macht bitte parallel diese Seite zur Referenz auf):Steckleisten_RFM12

  • SDO an Pin 12 (MISO)
  • nIRQ an Pin 2 (INT0)
  • FSK über einen 10 Kiloohm Widerstand mit der Versorgungsspannung verbinden
  • nSEL an Pin 10 (SS)
  • SCK an Pin 13 (SCK)
  • SDI an Pin 11 (MOSI)
  • GND an Masse
  • VDD an die Versorgungsspannung
  • an ANT ein Stück Draht anlöten, etwa 173mm bei der 433MHz-Version

Bei Instabilitäten noch die Kontakte nRES und nIRQ mit 10K Widerständen hochziehen. Ich habe zurechtgebogene Stiftleisten zur Breadboardmontage angelötet – absolut schrecklich! Schöner gehts mit diesem Adapter oder einer selbstdesignten Platine.

Alles in allem eine sehr schöne Möglichkeit, um geringe Datenmengen zu übertragen. Vielen Dank an JCW für den fantastischen Treiber!

 

 

 

Advertisements

6 thoughts on “RFM12 Funkmodule mit Arduino ansprechen

    • Hi! Danke für die tolle beschreibung. Ich verstehe bloss nicht, wie ich die Epfangenen Daten auslesen kann. Welche Funktion schreibt die Daten in die “counter” Variable?

  1. Hallo.
    Versuche gerade für die technikerschule ein Funkprojekt zu realisieren. Hoffe bekomme das mit eurem Blog hin. Freu mich auf den e Bastelarbeit

  2. Hallo erstmal!
    Gute Tipps, keine Frage, aber der Sourcecode “RF12_driver_JeeLib_RX.ino” ist absolut sinnfrei und auch noch fehlerhaft!
    Erstens passiert mit der counter-Variable keinerlei Aktion und auch der Empfangspuffer wird überhaupt nicht ausgelesen. Man kann zwar durch die Ausgabe feststellen, dass die beiden if-Statements wahr sind, aber was passiert und was übertragen wurde bleibt ein Geheimnis!
    Gerade für Anfänger sollte so ein Beispielcode die wichtigsten Funktionen umfassen. Also bitte um die paar Zeilen erweitern.
    Ansonsten hat mir der Beitrag bei meinem Funkstreckenprojekt in die richtige Richtung geholfen. THX

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s