Forum: Mikrocontroller und Digitale Elektronik RFM12 Funkmodul: auf Befehl reagieren im Sleepmode


von Jannis (Gast)


Lesenswert?

Hallo,
ich möchte ein Funkmodul (z.B. 
http://www.pollin.de/shop/dt/MDU5OTgxOTk/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html) 
im Sleepmodus betreiben, damit es über Monate oder Jahre von 
AA-Batterien leben kann.

Nur, wenn es Daten empfängt, soll das Funkmodul aufwachen, einen 
Interrupt erzeugen und damit einen angeschlossenen Atmega aufwecken, der 
die Daten verarbeitet, und eine Antwort zurück senden.

Ist es möglich, das Funkmodul so in den Sleepmodus zu versetzen, dass es 
trotzdem noch auf eingehende Daten reagiert? Quasi Tx off, Rx on? Auch 
der Empfangskanal sollte so sparsam wie möglich laufen. Erstmal reicht 
es, auf irgendwelche eintreffenden Signale zu warten, bevor das Modul 
so weit aufwacht, dass es die Signale auch demoduliert. Ich habe dazu im 
Datenblatt nichts gefunden.

Gruß
Jannis

von Jannis (Gast)


Lesenswert?

Noch einmal kurzgefasst:

Kann ich das RFM12-Modul so schlafen schicken, dass es erst dann 
aufwacht, wenn ein anderes RFM-Modul Daten sendet?

Wenn ja, wieviel Strom wird während der Wartezeit gezogen?
Wenn die ersten Daten (wegen noch "Halbschlaf") verloren gehen, ist es 
kein Problem. Der Sender kann seine Anfrage nach kurzer Zeit 
wiederholen.

Gruß
Jannis

von D'oh!!! (Gast)


Lesenswert?

Jannis schrieb:
> Kann ich das RFM12-Modul so schlafen schicken, dass es erst dann
> aufwacht, wenn ein anderes RFM-Modul Daten sendet?

Nein.

von Philip P. (nosuchnick)


Lesenswert?

So weit ich weiß geht das nicht. 10-14 mA werden im Empfang immer 
verbraucht.

Eine einfache Methode um den Verbrauch zu senken, wäre den Aufwand auf 
den Sender zu verschieben.

Der Empfänger wacht jede Minute für etwa eine Sekunde auf. Wenn in der 
Zeit nichts empfangen wird, legt er sich wieder schlafen. Wenn der 
Sender was zu senden hat, sendet er erstmal 1 Minute lang kurze (kürzer 
als 0,5 Sekunden) "Bleib wach" Pakete. Nach jedem Packet wartet er für 
eine halbe Sekunde. Wenn der Empfänger ein "Bleib wach" Packet empfängt, 
antwortet er darauf, und die Kommunikation wird normal fortgeführt.

Dadurch verringert sich der Stromverbrauch von 12 mA auf ((59 * 1µA) + 
12 mA) / 60 = 0,2 mA. Natürlich erhöht sich dafür die Reaktionszeit.

von Conny G. (conny_g)


Lesenswert?

Jannis schrieb:
> Noch einmal kurzgefasst:
>
> Kann ich das RFM12-Modul so schlafen schicken, dass es erst dann
> aufwacht, wenn ein anderes RFM-Modul Daten sendet?
>
> Wenn ja, wieviel Strom wird während der Wartezeit gezogen?
> Wenn die ersten Daten (wegen noch "Halbschlaf") verloren gehen, ist es
> kein Problem. Der Sender kann seine Anfrage nach kurzer Zeit
> wiederholen.
>
> Gruß
> Jannis

Da stecken diverse Problemchen drin.
So ein Funkmodul hört ja ständig auf der Frequenz auf der 
Trägerfrequenz. Um das zu tun, muss ein Schwingkreis diese 
Trägerfrequenz produzieren und eine Filterschaltung Frequenzmodulierte 
Signale darauf auswerten.
Als nächstes muss der Mikroprozessor des RFM12 kucken, ob die Präambel 
in den Daten erkennbar ist und dann ggf. den Fifo füllen und auf der 
INT-Leitung Bescheid geben.

D.h. was m.E. grundsätzlich denkbar ist, dass der Mikroprozessor, der am 
RFM hängt schläft und durch den INT des Fifo aufgeweckt wird.
Allerdings muss der richtig schnell bei der Sache sein, sonst 
Fifo-Überlauf und Daten gehen verloren.

Bei einer Datenrate von 9600 Baud sind das also Zehntel von 
Millisekunden - so ein uC braucht aber mehrere Millisekunden zum 
Aufwachen, ist also höchst kritisch bis unmöglich.

Dann ist die Frage wieviel Strom das RFM zum reinen Empfang braucht, 
sollte es wirklich als einziges Modul in der Schaltung laufen.
Lt. Datenblatt braucht das Modul im RX Modus mindestens 11-13 mA.
Dazu kommt aber noch Strom für einen Spannungsregler oder andere 
Bauteile, sagen wir mal 25mA gesamt.
Dann hält die 3xAA-Batterie (10Ah) theoretisch 400h oder 16 Tage.
Wenn man die Kapazität überhaupt komplett nutzen kann und die nicht auf 
"0V" gerechnet ist, was in der Praxis ja nicht geht, weil unter einer 
bestimmten Spannung man eine Schaltung nicht mehr betreiben kann.

Aber: das Funkmodul wird wegen des ständigen Rauschens im Funk sicher 
häufig meinen jetzt kommt was und dem uC Bescheid geben aufzuwachen, 
dann wird jedesmal 10-20mA zusätzlich verbrutzelt und die Laufzeit 
verkürzt sich nochmal deutlich.

Und wie gesagt ist es fraglich, ob der uC überhaupt schnell genug 
aufwachen kann. Wenn er laufen muss, dann hält die Batterie höchstens 
ein paar Tage.

von Conny G. (conny_g)


Lesenswert?

Philip Peter schrieb:
> So weit ich weiß geht das nicht. 10-14 mA werden im Empfang immer
> verbraucht.
>
> Eine einfache Methode um den Verbrauch zu senken, wäre den Aufwand auf
> den Sender zu verschieben.
>
> Der Empfänger wacht jede Minute für etwa eine Sekunde auf. Wenn in der
> Zeit nichts empfangen wird, legt er sich wieder schlafen. Wenn der
> Sender was zu senden hat, sendet er erstmal 1 Minute lang kurze (kürzer
> als 0,5 Sekunden) "Bleib wach" Pakete. Nach jedem Packet wartet er für
> eine halbe Sekunde. Wenn der Empfänger ein "Bleib wach" Packet empfängt,
> antwortet er darauf, und die Kommunikation wird normal fortgeführt.
>
> Dadurch verringert sich der Stromverbrauch von 12 mA auf ((59 * 1µA) +
> 12 mA) / 60 = 0,2 mA. Natürlich erhöht sich dafür die Reaktionszeit.

Genau, Schaltungen wie Wetterstationsempfänger nutzen meist ein 
bestimmtes Timing-Protokoll, d.h. der Empfänger weiss in welchem 
Zeitraum die Clients funken werden und wacht dann für eine Sekunde auf.
S.h. zB. http://www.dc3yc.privat.t-online.de/protocol.htm

von c-hater (Gast)


Lesenswert?

Jannis schrieb:

> Kann ich das RFM12-Modul so schlafen schicken, dass es erst dann
> aufwacht, wenn ein anderes RFM-Modul Daten sendet?

Nein, das geht prinzipiell nicht. Würde auch keinen großen Sinn machen, 
weil der Energiebedarf des Empfängers ziemlich hoch ist.

> Der Sender kann seine Anfrage nach kurzer Zeit
> wiederholen.

Das ist schon fast der richtige Ansatz. Auch die ganz richtigen setzen 
im Prinzip auf Wiederholungen, wie genau das ablaufen sollte, hängt vor 
allem davon ab, wer Energie sparen muß. Nur der Empfänger, nur der 
Sender oder beide?

Wieviel Energie sich sparen läßt, hängt vor allem davon ab, wie stark 
die HF-Umwelt mit Störungen verseucht ist, wie hoch also die 
Wahrscheinlichkeit ist, daß ein Paket hinreichend fehlerfrei übertragen 
werden kann. Das ist die eine Hälfte, die andere ist, wie hoch die 
Latenz sein darf, mit der eine Nachricht übermittelt werden muß.

In Analogie zu einem µC: Du wünschst hier eigentlich eine 
Interruptsteuerung, die geht hier aber nicht. Der Ausweg ist Polling, 
hier allerdings erschwert dadurch, daß der Poller mit einer gewissen 
Wahrscheinlichkeit nix zum Pollen vorfindet und zusätzlich dadurch, daß 
Sender und Empfänger nicht dieselbe Zeitbasis haben, sondern zwischen 
ihnen eine gewisse Gangabweichung besteht.

Die Herausforderung ist also, sich ein sinnvolles Protokoll für diese 
Sachverhalte auszudenken und dies für die konkreten Werte der beiden 
Hauptparameter Übermittlungswahrscheinlichkeit und zulässige 
Nachrichtenlatenz zu optimieren, natürlich unter Berücksichtigung der 
Parameter des Hilfssystems Polling, also der Zeitbasen der beteiligten 
Systeme.

Übrigens: du bist erstaunlicherweise nicht der erste, der mit einem 
solchen System kämpft. Ein kompetente Google-Recherche liefert innerhalb 
zwei, drei Minuten soviel einschlägiges Lesematerial, daß du dir nix 
mehr selber ausdenken mußt. Als Google-Futter für den Einstieg wäre 
"sensor net protocols" wohl das geeignete, wobei die Suchergebnisse 
meistens den allgemeinen Fall deines kleinen Peer-to-Peer-Problems 
behandeln. Aber wenn man die Ansätze zur Lösung des allgemeinen Falls 
verstanden hat, ist es ja sehr leicht, das auf einen einfachen 
Spezialfall "runterzudenken".

von Sascha W. (sascha-w)


Lesenswert?

Jannis schrieb:
> Noch einmal kurzgefasst:
>
> Kann ich das RFM12-Modul so schlafen schicken, dass es erst dann
> aufwacht, wenn ein anderes RFM-Modul Daten sendet?
jain

Man kann die Betriebsart mit "Low Duty-Cycle Mode" verwenden.
Der Trick dabei ist, das das Modul die meiste Zeit schläft und nur in 
einem einstellbarem Intervall aufweckt und kurz auf Empfang geht. Wenn 
du das Modul also jede Sekunde für 100ms empfangen lässt, dann hast du 
nur noch 10% Energieverbrauch.
Die Zeit die das Modul wach sein muss hängt von der Datenrate/Paketlänge 
ab, die Pause dazwischen vom Sender, denn der muss sein Paket dann so 
lange wiederholen, das in dieser Zeit der Empfänger den notwendigen 
Paketstart erfassen kann.

Hab ich bei einem RFM22B schon in meiner Fernbedienung für die 
Standheizung gemacht. Der Empfänger im Auto verbraucht so bei 12V nur 
ca. 0.8mA.
(Empfänger 1s aus 100ms ein)

Sascha

von Jannis (Gast)


Lesenswert?

Vielen Dank für eure Hinweise. Ich denke, ich werde es lösen, wie einige 
von euch vorgeschlagen haben: der Empfänger schaltet sich in kurzen 
Intervallen (Sekunden ... 1 Minute) ein, um eventuell eingehende Daten 
zu verarbeiten und geht sonst nach einigen Millisekunden wieder 
schlafen. Zusätzlich werde ich versuchen, Sender und Empfänger zu 
synchronisieren, so dass der Sender nicht auf Verdacht senden muss.

Ich werde mich dann mal genauer damit beschäftigen, wie lange es dauert, 
das Modul vom Schlaf- in den RX-Modus und wieder schlafen zu schicken, 
und ob dabei irgendwelche Stromspitzen auftreten, denn davon wird das 
Timing abhängen.

Auch die Sensornetz-Protokolle werde ich studieren. Da es meine ersten 
Schritte in diesem Bereich sind, habe ich erst einmal hier nach 
Erfahrungswerten gefragt, bevor ich tief in eine Thematik einsteige, die 
vielleicht schon durch ein Flag im RFM12-Modul hardwareseitig hätten 
gelöst werden können.

Danke
Jannis

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.