RFM12-Funkbrücke
Aus BraLUG-Wiki
...kommt demnächst...
Inhaltsverzeichnis |
Motivation
Einige der Sensoren zur Aufzeichnung von Wetterdaten sind bei mir etwas ungünstig platziert. Die Sensoren müssten eigentlich an einem Ort angebracht werden, der draussen und nicht der direkten Sonneneinstarhlung ausgesetzt ist. Dieser Ort ist bei meinen örtlichen Gegebenheiten nur schwer mit Kabel erreichbar. Aber wozu gibt es Funkübertragung? Entsprechende Funkmodule sind leicht beschaffbar.
Weiterhin bestand dann gleich mal die Gelegenheit ein paar andere Sensorentypen für Helligkeit, Feuchtigkeit und Temperatur auszuprobieren. Sonst wird es ja langweilig...
Funkbrücke
RFM12-Module
In der hier vorgestellten Funkbrücke kommen zwei RFM12-Module der Firma Hoperf zum Einsatz. Diese Module vereinen Sender und Empfänger in einer Baugruppe. Gesendet wird auf dem ISM-Band mit 433MHz. Die Beschaffung kann über die üblichen Elektronikversender zu einem halbwegs erträglichen Preis erfolgen.
Die Kommunikation mit dem RFM12-Modul erfolgt via SPI. Elektrische Verschaltung und programmtechnische Ansteuerung sind im Datenblatt und in zahlreichen Projekten im Internet ausführlich beschrieben. Als Ausgangsbasis für meine Funk-Experimente war eine längliche Diskussion zu diesem Thema auf mikrocontroller.net. Man muss ja das Rad nicht immer neu erfinden...
Eine nette Eigenschaft des RFM12-Modul vereinfacht die Steuerung des kontinuierlichen Programmablaufes des Senders: das Modul kann per Kommando in Tiefschlaf versetzt werden, aus dem es, nach einer vorkonfigurierbaren Zeit, wieder allein aufwacht. Dieses "Aufwachen" wird auch an einem Ausgang als Impuls ausgegeben. Ist dieser Ausgang mit einem sinnvollen Eingang der, zur Steuerung verwendeten, MCU angeschlossen, ergeben sich ein paar interessante Möglichkeiten. Mein erstes Experiment mit RFM12/MCU war eine "Blinkschaltung", bei der die MCU das RFM12-Modul und danach sich selbst Schlafen geschickt hat. Nach Ablauf der Ruhezeit wachten beide Teile in umgekehrter Reihenfolge auf und das Spiel begann wieder von vorn...
Sender
Das Sendemodul ist mit einem ATmega8 in seiner Standardbeschaltung auf einer Lochrasterplatine aufgebaut. Die MCU wird ist über seinen internen Oszillator mit 8MHz getaktet. An die MCU ist das RFM12-Modul angeschlossen, dessen nIRQ-Ausgang ist mit INT0 des ATmega8 verbunden. Weiterhin sind einige I/O-Pins auf Stiftleisten und einen Wannenstecker herausgeführt, um die diversen Sensoren anschliessen bzw. den Controller programmieren zu können. Einen (gezeichneten) Schaltplan habe ich dazu nicht erstellt, da der Aufbau mehr oder weniger on-the-fly erfolgte. In der Testphase hatte ich eine LED an einem der herausgeführten I/O-Pins angeschlossen, um die Funktionenweise der Firmware überprüfen zu können.
Ablauftechnisch gestaltet sich die Firmware des Sendemoduls recht einfach. Nach der Initialisierung des RFM12-Moduls, des I²C-Bus und weiterer notwendiger I/O-Pins wird in eine Endlosschleife gesprungen. Innerhalb dieser werden die Werte der verschieden Sensoren ermittelt, in einer Struktur-Variablen abgelegt und diese an den Empfänger gesendet:
... // Funkmessage... struct msg_t { // Offset uint16_t counter; // --> 0 uint16_t vcc; // --> 2 uint32_t brightness; // --> 4 uint16_t sht15_humidity; // --> 8 uint16_t sht15_temperature; // --> 10 uint16_t tmp36; // --> 12 } msg; ...
Danach wird das RFM12-Modul für eine eingestellte Zeit (ca. 60s) und die MCU schlafen gelegt. Nach der konfigurierten "Schlafenszeit" wacht zuerst das RFM12-Modul auf und löst einen INT0-Interrupt im ATmega8 aus, der diesen ebenfalls wieder zum Leben erweckt. Das Spiel beginnt wieder von vorn...
Sensoren
Für die Außensensoren der "Wetterstation" sollten ein paar neue Typen verwendet werden. Schließlich geht es bei der ganzen Geschichte um den Spaß und das Experimentieren! Teilweise kommen jetzt qualitativ bessere, genauere und außentauglichere Sensoren (Helligkeit, Luftfeuchtigkeit) zum Einsatz. Man ist ja lernfähig...
TSL45315 (Helligkeit)
Bisher wurden für die Ermittlung der Helligkeit eine alte Solarzelle und ein Fotowiderstand benutzt. Schaut man sich die daraus resultierenden Verläufe an, sieht man recht schön, wann die Sonne scheint, wann es (stark) bewölkt und es Nacht ist. Mehr aber auch nicht wirklich! Irgendwann möchte man "professioneller" werden...
Die Wahl fiel auf einen Lichtsensor vom Typ TSL45315 mit etwas Zusatzbeschaltung, wie ihn z.B. Watterott anbietet. Hierbei handelt es sich um einen Sensor, der via I²C-Bus ansteuerbar ist. Die Zusatzbeschaltung (Pegelwandler) sorgt dafür, dass in einem Spannungsbereich von 3,3V bis 5V gearbeitet werden kann.
Als Messergebnis erhält man vom Sensor die Beleuchtungsstärke in Lux als 16-Bit-Wert. Sieht man sich die umgebungstypischen Lux-Werte an, wird man feststellen, dass zwei Byte für die Darstellung des Messwertes nicht immer ausreichen werden (heller Sonnentag → 100000lx). Aus diesem Grund besitzt der Sensor drei, vor der Messung einzustellende, Empfindlichkeitsbereiche. Ich verwende derzeit immer den mittleren Bereich. Theoretisch wäre es aber auch denkbar, dass man bei einem Überlauf (erkennt am Messwert=0), automatisch in den nächsten unempfindlicheren Bereich schaltet und die Messung wiederholt usw.. Ich habe erst mal darauf verzichtet (vielleicht habe ich irgendwann wieder Langeweile...).
Detailliertere Informationen findet man im Datenblatt zum Sensor.
SHT15 (Temperatur/Luftfeuchtigkeit)
In der ursprünglichen Wetterstation wird ein Feuchtigkeitssensor vom Typ HIH-4030 verwendet. Zwei Nachteile hat dieser Meßwertaufnehmer aus meiner Sicht:
- Der Sensor ist eigentlich nicht außentauglich, denn laut Spezifikation sollte er erst ab 0°C Umgebungstemperatur eingesetzt werden.
- Zur Berechnung der relativen Luftfeuchtigkeit ist es notwendig, dass man die unmittelbare Umgebungstemperatur mit bestimmt. Da der HIH-4030 keinen entsprechenden Temperaturfühler intern verbaut hat, muss man also einen externen Temperatursensor bemühen.
Aus diesem Grund wurde für die Außenstation ein neuer Feuchtigkeitssensor gesucht und der SHT15 der Firma Sensirion gefunden. Dieser Meßwertaufnehmer arbeitet in einem Umgebungstemperaturbereich von -40°C bis 120°C und besitzt auch einen internen Temperaturfühler. Also ideal für den vorgesehen Einsatzzweck. Die Beschaffung kann z.B. über Watterot erfolgen, man bewegt sich dabei in einem etwas höheren Preissegment.
Softwareseitig steuert wird dieser Sensor über eine serielle 2-wire-Schnittstelle angesteuert, die aber leider nichts mit mit I²C zu tun hat. Über diese Schnittstelle kann der Baustein konfiguriert sowie Temperatur und Luftfeuchtigkeit ausgelesen werden. Genauere Informationen dazu können dem Datenblatt entnommen werden.
TMP36 (Temperatur)
Eigentlich benötigt man im vorliegenden Gesamtsystem keinen weiteren Temperaturaufnehmer. In die Basisstation sind bereits mehrere entsprechende Sensoren (zwei DS1820 und ein LM75) integriert und diese im Innen- und Außenbereich verteilt. Weiterhin verfügt die SHT15-Baugruppe der Außenstation ebenfalls intern über einen Temperatursensor. Aber irgendwie traute ich am Anfang dem SHT15 nicht richtig, ich wollte einen Vergleichswert haben (doppelt hält auch besser...).
Um dabei auch wieder mit einen anderen Sensor-Typ experimentieren zu können, verzichtete ich auf die bewährten I²C- und 1-wire-Technologien. Ich wählte den Temperatursensor TMP36 für diesen Einsatzzweck aus. Laut Spezifikation liegt der Einsatzbereich zwischen -40°C und +125°C, es wird eine, zur Temperatur linear proportionale Spannung ausgegen. Deren Auflösung entspricht 10mV pro 1°C.
Der TMP36 ist mit einem ADC-Eingang des ATmega8 des Sendemoduls verbunden. Die Messung der zu ermittelnden Spannung erfolgt gegen die Versorgungsspannung der Gesamtbaugruppe. Da die Höhe der Referenzspannung einen entscheidenen Einfluß auf das Gesamtergebnis hat, wir sprechen von 10mV/°C, wird deren momentaner Wert vor der Berechnung des TMP36-Messergebnisses ebenfalls jedesmal neu ermittelt (siehe dazu auch das entsprechende Kapitel in diesem Wiki-Beitrag).
Weiterführende Informationen zum Temperatursensor sind dem entsprechenden Datenblatt zu entnehmen.
Versorgungsspannung Sender ermitteln
Für die Berechnug diverser Endergebnisse aus den jeweiligen Messungen ist es relativ wichtig zu wissen, wie hoch die Versorgungsspannung der Gesamtbaugruppe ist. Bei der Temperaturmessung mit dem TMP36 wird z.B. als ADC-Referenzspannung die Versorgungsspannung verwendet. Der verbaute ATmega8 bietet die Möglichkeit, den ADC auf die interne Band-Gap-Referenz umzuschalten und deren Wert zu ermitteln. Diese Referenz ist relativ konstant und beträgt laut Datenblatt im Mittel ca. 1,3V. Den genauen Wert sollte man allerdings durch ein paar Experimente selbst ermitteln.
Verwendet man die (angenommene nicht konstante) Versorgungsspannung als ADC-Referenz und ermittelt damit die Höhe der konstanten Band-Gap-Referenz, kann man aus dem ermittelten ADC-Wert die Höhe der Versorgungsspannung berechnen (z.B. Vcc=(Vbg*1024)/ADC). In der Application Note AVR126 von Atmel findet zum Umgang mit der Band-Gap-Referenz einige detailliertere Bemerkungen.
Empfänger
Beim Funkempfänger handelt es sich ebenfalls um eine vollkommen unspektakuläre Standardschaltung eines, mit internen 8Mhz getakteten, ATmega8. Auch hierfür existiert kein gezeichneter Schaltplan, das Modul wurde auf Lochraster aufgebaut. Die Baugruppe ist als I²C-Client (mittels interne TWI-Hardware des ATmega8) ausgeführt. Der Aufwach-Modus des angeschlossenen RFM12-Moduls wird beim Empfänger nicht verwendet, es muss ja kein Strom gespart werden.
Softwareseitig befindet sich die MCU, nach Initialisierung des RFM12-Moduls und I²C-Bus, in einer Endlosscheife. Innerhalb dieser Schleife werden eventuell via Funk empfangene Daten (1:1) in einem internen Speicherbereich abgelegt. Die Reihenfolge der Werte in diesem Puffer entspricht der der gesendeten Daten. Über den I²C-Bus können die Pufferwerte von einem I²C-Master, entsprechend addressiert, abgefragt werden. Wie dies genau funktioniert, kann in einem anderen Grundlagenartikel in diesem Wiki nachgelesen werden.
Hier in der Folge nur die entsprechenden Kommandos/Ausgaben (in einer Linux-Konsole) für das Empfangs-Modul an einem I²C-Bus:
> i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- 12 13 -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- 49 -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- 77
I²C-Adresse 0x28 ist in diesem Fall der hier besprochene Funkempfänger. Die anderen Geräte auf dem Bus sind die restlichen Sensoren der "Wetterstation".
> i2cdump -y 0 0x28 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: af 00 72 13 22 01 00 00 9d 16 05 09 d9 02 00 00 ?.r?"?..??????.. 10: 00 00 00 00 00 af af af af af af af af af af af .....??????????? ...
Mittels des Linux-Tools i2cdump kann man sich die "Registerinhalte", also hier den Inhalt des Empfangspuffers (siehe oben), des adressierten I²C-Clients ausgeben lassen. Die ersten 14 Byte sind unsere Meßwerte...
> tclsh rfm12.tcl Counter...........: 256 Vcc (Sender)......: 4.978V Helligkeit........: 484lux SHT15-Feuchtigkeit: 58.27% SHT15-Temperatur..: 21.99°C TMP36.............: 21.4°C ********************
Hier die Ausgabe des Tcl-Scripts, welches ebenfalls im Softwarearchiv enthalten ist....
Software
In dem hier verlinkten Softwarearchiv ist die Firmware des Senders und Empfängers der Funkbrücke sowie ein kleines Tcl-Script zur Abfrage der empfangenen Daten via I²C-Bus zu finden. Im Tcl-Script muss natürlich die Adresse des entsprechenden I²C-Bus angepasst werden. Der Zugriff auf den I²C-Bus erfolgt über eine selbstgeschriebene Tcl-Erweiterung, deren C-Quelltext ebenfalls im Softwarearchiv zu diesem Projekt enthalten ist und für die eingesetzte Zielplattform übersetzt werden muss.
ToDo
Folgende Dinge müssen noch erledigt werden:
- Einbau der Sendebaugruppe und Sensoren in ein außentaugliches Gehäuse. Dabei muss der Feuchtigkeitssensor aber einen "freien Zugang" zur Umgebung haben und gleichzeitig vor Regenwasser geschützt sein.
- Die endgültige Stromversorgung der Sendebaugruppe muss noch realisiert werden. Die Vorstellungen laufen auf eine netzunabhängige Stromversorgung via Solarzellen und Pufferbatterie hinaus.