RFM12-Funkbrücke
Aus BraLUG-Wiki
(→Empfänger) |
|||
Zeile 112: | Zeile 112: | ||
</pre> | </pre> | ||
− | Hier die Ausgabe des Tcl-Scripts, welches ebenfalls im [[ | + | Hier die Ausgabe des Tcl-Scripts, welches ebenfalls im [[RFM12-Funkbr%C3%BCcke#Software|Softwarearchiv]] enthalten ist.... |
==Software== | ==Software== |
Version vom 5. Juni 2013, 07:13 Uhr
...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)
TMP36 (Temperatur)
Versorgungsspannung Sender ermitteln
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.