Pages: [1] 2   Go Down
Author Topic: Senden von Daten über stabile Funkverbindung (433MHz o.ä.)  (Read 2357 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

für mein Arduino im Haus und Garten-Projekt suche ich eine gute und preiswerte Möglichkeit der Vernetzung per Funk (nur eine Richtung). Es sollen alle X Sekunden Sensor-Daten übertragen werden (~20 Byte pro Sendung). Dabei sind Strecken von ca. 30m incl. einiger Wände zu überbrücken. Ein preiswertes 433 MHz Funkthermometer schafft die Strecke unter besten Bedingungen (neue Baterien in Sender und Empfänger) ab und zu - dabei sendet es alle 1 Minute das Signal 3x - am Empfänger kommt nur gelegentlich was an, nach ein paar Tagen nix mehr bis zum nächsten Batteriewechsel. Mit dem Arduino kann ich das Signal decodieren, aus der Entfernung konnte ich aber bisher kein Signal "einfangen". Auch div. Tests mit l/4 Antennen brachten da nix.

Bei den 433MHz oder 868 MHz Modulen wir von Reichweiten zwischen 30 und 200 Metern geschrieben. Irgendwo wurden mit den passenden Codierungen mehrere Kilometer überbrückt. Da müsste man ja mit ordentlich langen/redundanten Signalen und eingebauter Fehlerkorrektur was hinbekommen - hat das jemand schon Erfahrungen gesammelt?

Gibt es sinnvolle (und nicht zu teure) Alternativen?

Ich hab eine ganze Weile im Forum gesucht - Vernetzungsprojekte gibt es einige. Allerdings habe ich keine Threads mit Ergebnissen, die sich auf die erzielten Reichweiten und die Stabilität der Verbindung beziehen, gefunden.


Vielen Dank im vorraus für Eure Antworten,
Michael.
« Last Edit: January 30, 2013, 03:46:55 pm by mwyraz » Logged

Chemnitz/Saxony/Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 107
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Gibt es sinnvolle (und nicht zu teure) Alternativen?

Google mal nach NRF24L01, die gibts als Fertigmodule für kleine Geld, alternativ auch mit "richtigen" Antennen. Die kommen im Netz gut weg. Selbst testen konnte ich die noch nicht, meine schippern gerade noch nach Europa.

Alternativen wären RFM12.

Durch wie viele Wände sowas geht hängt natürlich nicht nur von deren Anzahl, sondern eher von der Beschaffenheit ab. Ne gute alte Ziegelwand dämpft da deutlich weniger als ne Stahlbeton-Wand mit reichlich Armierung.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Derzeit habe ich für die Thermometer und Funksteckdosen diese da im Einsatz:

http://www.watterott.com/de/RF-Link-Sender-434MHz
http://www.watterott.com/de/RF-Link-2400bps-Empfaenger-434MHz

Der Sender schafft es, alle Steckdosen im und außer Haus zu erreichen. Der Empfäger empfängt vom Funkthermometer kaum was, sobald es etwas weiter weg ist (weniger als das original Thermometer). Ich muss mal testen, ob das an der Hardware oder der Modulation liegt.

Hab mal nach dem NRF24L01 geschaut, der liegt bei Watterot bei ~17€ + Antenne. Wäre sicher noch im Rahmen, ist aber vielleicht ein wenig überdimmensioniert für den Einsatzzweck?

Einen RFM12 könnte ich ja mal mit bestellen. Wie bekommt man sowas auf ein Breadboard? Wie sind da die zu erwartenden Reichweiten?
Logged

Chemnitz/Saxony/Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 107
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab mal nach dem NRF24L01 geschaut, der liegt bei Watterot bei ~17€ + Antenne. Wäre sicher noch im Rahmen, ist aber vielleicht ein wenig überdimmensioniert für den Einsatzzweck?

Guck mal in der eBucht beim freundlichen Chinamann, 2 Stück mit Print-Antenne 4 Dollar incl. Versand. Optional im Zehnerpack für 10 Euro. Ok, dauert dann halt 3 Wochen...

Bei nem deutschen eBay-Händler gibts den Doppelpack immerhin für fünf fuffzich incl. Porto.

Einen RFM12 könnte ich ja mal mit bestellen. Wie bekommt man sowas auf ein Breadboard? Wie sind da die zu erwartenden Reichweiten?

http://blog.sui.li/2011/06/28/rfm01-rfm12-aufs-breadboard/

Alternativ hat JeeLabs fertige Adapterboards.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe heute meinen 2. Arduino bekommen und mal mit den einfachen 433MHz Modulen von Watterott getestet. Als Lib habe ich VirtualWire genommen, dort gibt es eine Fehlererkennung und die Baud-Rate lässt sich einstellen.
Den einen Arduino habe ich im Schuppen platziert, dieser sendet alle eingehenden 1-Wire-Messwerte raus mit 1200 Baud.

Den anderen habe ich im Haus aufgebaut, der empfängt die Date und sendet sie via UDP-Broadcast ins Netz.

Trotz geringer Entfernung (~10m) und nur 2 Wänden (1x Holz, 1x Stein) kommt recht wenig an. Könnte es an meinem Empfänger liegen (kaputt, schlecht eingestellt)? Ich habe an Sender und Empfänger passende Drähte (ich glaube 13 oder 17 cm, hatte ich mal nachgelesen) als Antenne.
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Im Zweifelsfall immer erst die Antenne optimieren. Und zwar auf beiden Seiten, also Empfänger und Sender. http://www.antenna-theory.com/antennas/main.php

Im Moment benutzt Du l/4 Antennen. Was spricht gegen l/2 Antennen order l Antennen? Wenn das fest montiert wird ist die Antennengröße doch nicht so schlimm, oder?

Ansonsten: RIchtantennen sind immer gut smiley-wink http://forum.electronicwerkstatt.de/phpBB/Funktechnik/richtantenne_fuer_433mhz-t71367f18_bs0.html
Logged

Check out my experiments http://blog.blinkenlight.net

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das habe ich eben noch gefunden: http://www.dj5am.de/ant70cm/70cmant.html. Rothammels Antennenbuch wird immer wieder gerne zitiert: http://www.amazon.de/gp/product/388692033X/ref=as_li_ss_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=388692033X&linkCode=as2&tag=wwwblinkenlig-21.

Wenn Du Geld sparen willst: es gibt nicht nur Amazon, es gibt auch - immer noch - Bibliotheken smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was mich stutzig macht: ich habe mit dem Empfänger schon experimentiert, um die Daten von Funkthermometern einzufangen. Das original (Billig-) Thermometer hatte immer deutlich besseren Empfang, da ist auch nur ein kurzer gewickelter Draht (l/4?) drin.
Meine Tests, an den Empfänger eine L/4 oder L/2 zu hängen, hat den Empfang nicht merklich verbessert.

Da ich nun den eigenen Sender verwende, hat sich erstmal der Sender verbessert, so dass ich im Haus überhaupt Empfang habe. Insofern habe ich sehr den Empfänger im verdacht (dieser hat übrigens von Haus aus schon eine kurze gewickelte Antenne drauf).
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe heute meinen 2. Arduino bekommen und mal mit den einfachen 433MHz Modulen von Watterott getestet. Als Lib habe ich VirtualWire genommen, dort gibt es eine Fehlererkennung und die Baud-Rate lässt sich einstellen.
Den einen Arduino habe ich im Schuppen platziert, dieser sendet alle eingehenden 1-Wire-Messwerte raus mit 1200 Baud.

Den anderen habe ich im Haus aufgebaut, der empfängt die Date und sendet sie via UDP-Broadcast ins Netz.

Trotz geringer Entfernung (~10m) und nur 2 Wänden (1x Holz, 1x Stein) kommt recht wenig an. Könnte es an meinem Empfänger liegen (kaputt, schlecht eingestellt)? Ich habe an Sender und Empfänger passende Drähte (ich glaube 13 oder 17 cm, hatte ich mal nachgelesen) als Antenne.

Die Funkausbreitung unterliegt vielfältigen Faktoren, die sich per Inaugenscheinnahme gar nicht alle beurteilen lassen.

Ich selbst erziele mit billigen 433-MHz Sender/Empfänger Pärchen der 2-Euro-Klasse vom Chinaversender mit der VirtualWire-Library und je einem 17,5cm Draht als Antenne eine stabile Reichweite von 22m durch eine Hauswand (Kalksandstein/Klinker) und eine Zimmerwand (Kalksandstein). Batteriebetrieb des Senders, also Betriebsspannung im Bereich 4,5 V (volle Batterien 3xAA) bis runter zu ca. 3,6 V.

Generell ist es so, dass es schlecht ist, das Signal schon am Ort der Aussendung stark zu dämpfen ("im" Schuppen). Warum den Sender nicht außen mit Regenschutz an der Schuppenwand angebracht?

Weiterhin ist es vorteilhaft, die Antenne des Senders und auch des Empfängers möglichst hoch anzubringen. Bei Aussendung von einem 5-Meter-Mast zum Balkon in 5m Höhe ist die Reichweite größer als beim bodennahen Sender, der ins Erdgeschoss funkt.

Weiterhin ist es vorteilhaft, die ausgesendeten Funkprotokolle kurz zu halten. Wenn die Sendung nur insgesamt 5ms lang dauert ist die Wahrscheinlichkeit, dass die Sendung von einem anderen Sender gestört wird, nur ein Zehntel dessen als wenn die Aussendung 50ms lang dauert.

Kurz werden die Funkprotokolle auf zwei Arten:
1. Höhere Baudraten verwenden (im Rahmen der technischen Möglichkeiten)
2. Datenpakete komprimiert senden

Die Baudrate würde ich an Deiner Stelle mal auf 2000 oder 4000 setzen.

Und was sendest Du in 20 Bytes?
Das reicht ja für das Senden von mindestens 20 Temperaturen auf einmal!
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Naja, wenn man es ganz besonders gut machen will, dann macht man es entsprechend der Theorie.

Schau mal in meinem Artikel http://blog.blinkenlight.net/experiments/dcf77/ im Abschnitt "noise" nach. Die dort angegebenen Bücher nehmen das Problem vollständig auseinander.

Insbesondere das "Digital Signal Processing" Buch. Die Lösung ist eigentlich immer geeignete Faltungscodes zu verwenden. Das reduziert zwar die mögliche Übertragungsrate, man kann damit aber die Störsicherheit praktisch beliebig hoch drehen. Allerdings alles nur solange wie man überhaupt noch einen Träger empfängt. Wenn der Träger nicht mehr durchkommt, dann kannst Du so gut wie alles vergessen.

Die Originalarbeiten von Shannon habe ich hier http://blog.blinkenlight.net/2013/01/01/dcf77-project-part-1-get-ready-for-the-real-thing/ verlinkt. Die sind aber ohne fortgeschrittene Mathematikkenntnisse eher unverständlich.
« Last Edit: February 03, 2013, 04:36:53 am by Udo Klein » Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Und was sendest Du in 20 Bytes?
6 Byte - ein fester String, der angibt, was ich überhaupt sende (ds1820)
1 Byte trennzeichen
4 Byte Sensor-ID
4 Byte Temperatur (float)
3 oder 4 Byte hängt Virtual Wire für Paketlänge und Checksumme dran.

könnte man sicher halbieren...

Derzeit kommen recht regelmäßig Daten an (ich hab einfach mal ein längeres, nicht abgestimmtes Stück draht,was rumlag an den Empfänger gehängt). Trotzdem gehen zwischen 10 und 80% der Signale verloren. Ich sende alle 5 Sekunden, da habe ich zumindest keine Lücken (meiner Software reicht es, wenn alle 5 Minuten eine Temperatur eingeht).

Quote
Die Lösung ist eigentlich immer geeignete Faltungscodes zu verwenden.

Das dürfte in diese Richtung gehen: http://www.mikrocontroller.net/articles/Codierte_%C3%9Cbertragung ?
Leider habe ich dazu keine fertige Arduino-Implementierung gefunden. Am liebsten wäre mir hier etwas, was Codierung, Fehlererkennung und -korrektur vereint und sich ähnlich VirtualWire einbinden lässt - für Tipps dahingehend bin ich sehr dankbar.
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Und was sendest Du in 20 Bytes?
6 Byte - ein fester String, der angibt, was ich überhaupt sende (ds1820)
1 Byte trennzeichen
4 Byte Sensor-ID
4 Byte Temperatur (float)
3 oder 4 Byte hängt Virtual Wire für Paketlänge und Checksumme dran.

könnte man sicher halbieren...

Du sendest ja die reinsten Romane!

Die Bytes, die Virtualwire als Startcode, Länge und Prüfsumme sendet mal aussen vor: Du sendest 15 Bytes und tatsächlich benötigt werden nur 3, d.h. Du sendest das fünffache an Daten wie es notwendig ist!

Tatsächlich notwendig wären:
- ID = 1 Byte
- Temperatur 2 Byte

Und den Rest packst Du als Tabelle/Programmlogik in den Empfänger, der dann Bescheid weiß.

Mit einer Byte-ID kodierst Du 256 verschiedene Werte. Die 8-Bit könntest Du also verwenden, um 256 verschiedene Sensoren eindeutig zu unterscheiden. Oder wenn Du je 4 Bit für die Codierung der Sensorart und 4 Bit für die Sensornummer verwendest, könntest Du Daten von 16 Arten verschiedener Sensoren senden, mit 16 möglichen Sensoren von jeder Art.

Dass der Sensor mit der Funk-ID 47 ein ds1820 ist und welche Chip-ID er hat, das kannst Du doch in einer Tabelle im Empfänger ablegen, das muß doch nicht jedesmal gesendet werden, weil es sich überhaupt niemals ändert?

Und die Temperatur als float? Wird die Temperatur genauer als auf 0.1°C übertragen? Im Normalfall würdest Du Temperaturen als Integer (2 Bytes) in Zehntel-Grad senden, das wären von -200.0°C bis +200.0°C die Werte -2000 bis +2000 als Integer gesendet. Oder wenn es auf hundertstel Grad genau sein soll, dann Werte zwischen -20000 bis +20000. Und der Empfänger weiß, dass es Zehntelgrade oder Hundertstelgrade sind, die er in den zwei Bytes empfängt und verarbeitet die Werte entsprechend weiter.

Ich finde, Dein Funkprotokoll ist viel zu lang.

Wenn Du Befürchtungen hast, dass in der Nähe Deiner Sensoren andere Sensoren senden, die mit der VirtualWire-Library senden, dann ändere die CRC-Berechnung in Virtualwire leicht ab, z.B. per XOR mit einer individuellen Konstante, so dass Dein Empfänger nur Funkpakete mit gepatchten CRC-Prüfsummenberechnung akzeptiert.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie gesagt: das könnte man sicher etwas kürzen :-)

4 Byte ID ist die interne ID der DS1820 Sensoren. Da der Code generisch ist und ich jederzeit beliebige Sensoren hinzufügen will, bleibt's wohl dabei. Könnte ich sicher auf 2 Byte reduzieren, da ist die Wahrscheinlichkeit einer Kollision nicht sehr hoch. Ansonsten würde jeder neue Sensor eine Anpassung im Programm nötig machen.

4 Byte float durch int ersetzen gehe ich mit. Der Sensor misst mit 9 Bit Auflösung. Byte würde also nicht mehr reichen.

Ein Byte als Kennung, um welchen Message-Type es sich handelt, würde ich noch vornean stellen.

Ich käme also auf 5 Byte zu übertragende Nutzdaten.

Die entscheidende Frage ist: Steigt die Fehlerquote linear (oder stärker) mit der Länge der Nachricht?

Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die entscheidende Frage ist: Steigt die Fehlerquote linear (oder stärker) mit der Länge der Nachricht?

Das hängt konkret von den tatsächlichen Störungen auf der Frequenz ab.
Bei starken Störungen auf der Frequenz sind lange Übertragungen mehr von Nachteil.

Rein zur mathematischen Wahrscheinlichkeit bei verschiedenen Störraten auf der Leitung mal zwei Beispiele:

Beispiel 1 (wenig Funkstörungen):
Die Wahrscheinlichkeit, dass ein einzelnes gesendetes Byte während der Übertragung fehlerhaft empfangen wird, sei 0,1%. Das bedeutet, es wird mit 99,9% Wahrscheinlichkeit fehlerfrei übertragen, oder als mathematische Wahrscheinlichkeit 0,999.

Wenn nun 30 Bytes übertragen werden, ist die Wahrscheinlichkeit, dass alle 30 Bytes in Folge fehlerfrei übertragen werden:
W= (0,999)30 = 0,9704 (zu 97% fehlerfreie 30-Byte Übertragungen)
Oder die Wahrscheinlichkeit, dass ein Fehler auftritt 0,03 bzw. 3%.

Bei nur 15 übertragenen Bytes sähe es so aus:
W= (0,999)15 = 0,9851 (zu 98,5% fehlerfreie 30-Byte Übertragungen)
Oder die Wahrscheinlichkeit, dass ein Fehler auftritt 1,5%.

Hier liegt eine Linearität vor, bei halber Übertragungslänge hat man auch nur die halbe Fehlerrate bei Übertragungen.

Beispiel 2 (starke Funkstörungen):
Die Wahrscheinlichkeit, dass ein einzelnes gesendetes Byte während der Übertragung fehlerhaft empfangen wird, sei 10%. Das bedeutet, es wird mit 90% Wahrscheinlichkeit fehlerfrei übertragen, oder als mathematische Wahrscheinlichkeit 0,9.

Wenn nun 30 Bytes übertragen werden, ist die Wahrscheinlichkeit, dass alle 30 Bytes in Folge fehlerfrei übertragen werden:
W= (0,9)30 = 0,0424 (zu 4,2% fehlerfreie 30-Byte Übertragungen)
Oder die Wahrscheinlichkeit, dass ein Fehler in der Übertragung auftritt, liegt bei 95,8%.

Bei nur 15 übertragenen Bytes sähe es so aus:
W= (0,9)15 = 0,2058 (zu 20,6% fehlerfreie 15-Byte Übertragungen)
Oder die Wahrscheinlichkeit, dass ein Fehler in der Übertragung auftritt, liegt bei 79,4%.

Bei stark gestörter Frequenz bekommt man also bei halber Übertragungslänge fast viermal so viele fehlerfreie Datenpakete übermittelt.

Fazit: Je stärker die Funkstörungen sind, desto vorteilhafter ist ein möglichst kurzes Übertragungsprotokoll.
Logged

Augsburg, Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab mal ne Frage zu diesem Thema: hat einer von euch schon mit dem "nRF24L01 2.4GHz Radio/Wireless Transceivers" gearbeitet ? Hat der funktechnisch evtl. bessere Eigenschaften als die hier diskutierten 433MHz Transceiver ?

Hier ist ein Einstieg in dieses Thema zu finden: http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo

Ich suche für ein Projekte gerade Argumente fuer oder gegen eine bestimmte Technik und bin daher auch an Erfahrungen interessiert.

MfG
Jürgen
Logged

Pages: [1] 2   Go Up
Jump to: