Raspi als Empfänger für 2,4 GHz Funksensoren

  • Diese kleinen Breakout-boards mit integrierter Antenne für 2.4 GHz Funkverbindungen, basierend auf einem nRF24L01 von Nordic Semiconductors sind mittlerweile spottbilig zu bekommen.

    Ich habe jetzt mal das Netz nach braucnbaren Vorlagen, Anleitungen und Libraries durchsucht, die ein solches Modul unterstützen. Besonders wichtig war mir dabei eine Library zu finden, die entweder sowohl auf dem Raspi als auch dem Arduino verwendbar oder leicht von einem auf das andere System zu portieren ist.

    -> Hier <- könnt ihr Euch eine solche Library downloaden.

    Das hier beschriebene Programm ist ein einfacher Empfänger für Daten eines BMP085 Moduls, die von einem Arduino versendet werden. Näheres zum Arduino und der Sender-Software später dann -> hier <- in unserem Mikrocontroller Subforum bzw. in meiner Übersicht.

    Was benötigt ihr?
    Zunächst mal mindestens zwei -> dieser <- nRF24L01 Module,
    mindestens einen Raspberry Pi und eben
    -> diese <- Library.

    Folgt zunächst bitte der Anleitung und installiert die Library auf Euren Raspberry Pi.

    Das Modul wird dann nach der Anleitung auf der Library-Page mit dem Raspi verdrahtet.
    Da das Modul typischerweise mit 3V3 arbeitet, ist kein Levelshifter notwendig.
    Ein zusätzlicher Kondensator zwischen 3V3 und GND des Moduls kann verwendet werden, um Spitzen der Versorgungs-Spannung abzufangen. Ich habe da die unterschiedlichesten Aussagen von 22nF bis 10µF im Netz gefunden. Da ich von einer sauberen 3V3 Versorgung durch den RPi ausgehe, habe ich den kleinsten Wert, also 22nF, verwendet.

    Legt Euch nun auf dem Raspi einen Ordner, z.B. ~/FUNKSENSOR, für Euer Funksensor-Projekt an.
    Ladet das Archiv rf24_v0.tar aus dem Anhang auf Eueren Raspi und entpackt es in dieses Verzeichnis.
    Im Ordner SERVER findet ihr ein einfaches Empfänger-Programm, das Luftdruck- und Temperatur-Daten empfängt, die das Gegenstück, in meinem Fall ein Arduino, aus einem BMP085 Modul ausliest und per Funk alle 10 Sekunden übermittelt.

    Da die Datenpakete die gemeinsame Schnittstelle von Raspi und Arduino darstellen, müssen die Informationen auf beiden Seiten gleich interpretiert werden. Dazu dienen die Include-Dateien im Unterordner COMMON.
    Zur Beschreibung des von mir verwendeten Protokolls gibt es später noch einen eigenen Beitrag.

    An dieser Stelle nur so viel:
    ein Datenpaket mit Daten eines BMP085 hat eine Länge von insgesamt 10 Byte. Für Temperatur und Luftdruck wird jeweis ein eigenes Paket gesendet.
    Das erste Byte jedes Paketes ist ein Identifier (0xaf) gefolgt von der Länge der Nutzdaten, der Id der Sendestation und der Id des Sensors. Anschliessend folgen noch der Sensortyp und die Einheit der übermittelten Daten (°C, cm, ...). Es folgen zwei Byte für die Vorkomma- (-32768 bis 32767) und zwei für die Nachkomma-Stellen (0-65536) des Wertes.
    Vor- und Nachkomma-Stellen werden als Little Endian (Intel-Konvention) übermittelt.

    Im Sourcecode ist zum Betrieb derzeit lediglich eine Zeile wichtig:

    Zitat


    // CE Pin, CSN Pin, SPI Speed

    // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 8Mhz
    RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_8MHZ);

    // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz
    //RF24 radio(RPI_V2_GPIO_P1_15, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ);

    // NEW: Setup for RPi B+
    //RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);

    // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 8Mhz
    //RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);


    passt hier bitte Werte an Eure Verdrahtung an.
    Wenn ihr CS0 verwendet und GPIO22 als CE, dann passt der voreingestellte Wert.

    Sonst gibts zu der Software erst mal nicht viel zu sagen. Alles, was die Funkverbindung betrifft, läuft über die Library. In einer Endlosschleife wird überprüft, ob Funk-Daten vorhanden sind und falls ja, diese ausgelesen und ausgegeben.
    Nach jedem empfangenen Daten-Paket wird ein sleep mit 20 ms eingelegt.

    Das ganze ist derzeit noch ein absoluter Tüftel-Stand, der aber erst einmal sehr sauber und stabil läuft.
    Er ist noch recht einfach umzubauen um ein anderes Datenformat, z.B. Zeichenketten, Kommandos, ... zu übertragen.
    Im Laufe der nächsten Zeit werden zudem sicher noch einige Sensoren und Funk-Module, u.a. das ESP8266, dazu kommen.
    Die erweiterten Versionen kommen aber jeweils in ein eigenes Archiv, das ich als Anhang an diesen Beitrag dann immer wieder aktualisiere.

    Geplant habe ich im Moment die Unterstützung von 433 MHz Funkstrecken, sowohl mit dem "Standard-Receiver-" und "Standard-Transmitter-Modul" als auch dem RFM12B Modul.
    Als vierte Variante habe ich das ESP8266-Modul vorgesehen.
    Als unterstützte Sensoren habe ich derzeit noch
    den Dallas DS18B20,
    den Dallas DS1621,
    den DHT11 und
    den DHT22 vorgesehen.

    Über Wünsche, konstruktive Kritik und Anregungen würde ich mich freuen.
    Bei Fragen und/oder Problemen einfach melden ...

    Viel Erfolg und Spass mit dem Teil,
    -ds-



    History:
    19.12.2014: erster Prototyp


    • Offizieller Beitrag

    Super Tüftelstand mein lieber :)
    Die 2,4ghz Sender/Empfänger sind schon was feines... hab hier auch noch 2 Stück rumfliegen, welche ich für meinen Quadrocopter verbauen wollte... scheiterte allerdings an der Firmware bzw am Protokoll... Mit so einer super Reichweite kann man sicherlich irgendwo auf dem Grundstück irgendwelche Sensoren platzieren :)

    Viel Glück beim tüfteln und schöne Weihnacht ;)

    Turael

    Ich bin ein gefallener Engel namens Turael.

    Einst vor langer Zeit rebelierte ich im Himmel bis Gott mich auf die Erde verbannte.

    Doch meine taten werden kein ende finden....

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!