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!