Xbee/Serielle Kommunikation absichern

Hallo

Ich wollte eine Xbee Kommunikation zwischen zwei Arduinos (Uno und Mega) aufbauen. Das ganze muss aber abgesichert sein, dass wenn die Verbindung abbricht, der Sketch gestoppt wird.

Nun habe ich die einfachere Idee, dass ich am Ende der Loop ein "Datenpaket" mit allen Werten die ich senden kann, sende - egal, ob sich der Wert ändert oder nicht, es werden die ganze Zeit alle Werte gesendet. Das hat den Vorteil, dass ich relativ einfach am Empfänger überwachen kann, ob die Daten z.B. jede Sekunde empfangen werden oder nicht. Sobald nichts mehr empfangen wird stoppt der Sketch.
Da "stört" mich ein wenig, dass das Xbee Modul immer sendet, ohne Unterbruch. A sind schon genug Geräte konstant am senden und B benötige ich unnötig Energie, die ich anders nutzen könnte.

Nun zur eigentlichen Frage. Gibt es eine Möglichkeit, wenn ich die Daten nur spezifisch (z.B. bei Betätigung des Knopfes X) sende, aber dann nur den veränderten Wert (des Knopfes X) sende, und sobald der Empfänger die Verbindung verliert, den Sketch stoppt? Das Problem, wo ich nicht weiterkomme ist, dass z.B. bei einem Motor der mit einem Regler gesteuert wird, der Wert eine längere Zeit gleich bleiben kann ohne Veränderung. Da funktioniert dann die Idee von oben nicht, dass wenn eine Sekunde keine Daten empfangen werden, der Sketch gestoppt wird. Hat da einer schon mal was gemacht oder eine gute Idee dazu?

Mir würde da auch nur in den Sinn kommen, bei dem Abschnitt des Sketches wo der Regler Werte an den Motor sendet, eine Rückfrage einzufügen, die dann auch jede Sekunde nachfragt, ob der Sender noch in Reichweite ist oder nicht. Bekommt er eine Rückmeldung, sendet er erneut die Anfrage, sonst weiss der Empfänger, dass die Verbindung unterbrochen ist und stoppt den Sketch. Das wäre dann aber wieder wie oben, ein endloses Senden und Empfangen während dessen der Motor in Bewegung ist...

Grüsse

Stef

Hallo,
“Da “stört” mich ein wenig, dass das Xbee Modul immer sendet, ohne Unterbruch”

Mhh, wie kommst Du denn da drauf? Du kannst dem XBee doch über den Arduino (oder XCTU) genau sagen, was er wann
machen soll. Meine XBee´s senden jedenfalls nur- wenn es etwas zu senden gibt.

XBee kann die Verbindung selbst prüfen, fällt ein Fehler auf, dann kann XBee das dem Arduino mitteilen.

“aber dann nur den veränderten Wert (des Knopfes X) sende”

Merke Dir doch den alten Wert, den vergleichst Du mit dem neuem. Wo ist das Problem?

Was nutzt Du für einen XBee? Link dazu?
Gruß und Spaß
Andreas

Hallo Andreas

Ja, wenn ich im Sketch am Ende der Loop alle meine Daten schreibe und sie über Serial sende, dann sendet das Xbee die ganze Zeit. Um einen Abbruch zu erkennen fällt mir nur das ein, denn dann kann ich im Sketch sagen, wenn kein Signal mehr kommt, dann stelle alle Werte auf 0 zurück.

Stimmt schon, ich kann die Werte vergleichen, aber dann kann ich keinen Signalabbruch erkennen, denn dann hat er einfach den alten Wert gespeichert und bekommt ja keinen Neuen um zu vergleichen.
Als Beispiel gebe ich ein ferngesteuertes Auto, das einen Signalabbruch sobald es ausser Reichweite ist erkennen muss und sofort stoppt, resp. alle Werte auf 0 zurück setzt! Ich sehe da momentan keine andere Möglichkeit, da die Werte eben auch nicht regelmässig ändern müssen. Sonst hätte man auch mit der Zeit sagen können, wenn nach z.B. 10sek. kein Signal kommt, dann abbruch.

Verwendet werden Xbee Series 1 Pro (S1 Pro) hier.

Grüsse

Stef

Hallo Steff,
Du sammelst Daten am Arduino. Wenn Du alle zusammen hast, dann sendest Du sie über seriell zum XBee.
Das XBee sendet dann die Daten an ein anderes Xbee- richtig?

Welchen Signalabbruch möchtest Du denn registrieren?
Den zwischen Arduino und XBee, oder den zwischen XBeeSender und XbeeEmpfänger?

Deine Vorgabe:
“Das ganze muss aber abgesichert sein, dass wenn die Verbindung abbricht, der Sketch gestoppt wird.”

Also, die Verbindung Arduino <-> XBee die kannst Du selbst überprüfen.
Wenn das XBee richtig konfiguriert ist, und Du das XBee vor der DatenÜbertragung (Arduino <-> XBee) abfragst,
dann sendet das XBee dem Arduino ein “alles in Ordnung” Nun kannst Du Deine Daten senden und das XBee empfängt diese.
Kommt das “alles in Ordnung” nicht- dann hast Du einen Abbruch und kannst den Fehler abfangen.

Die Verbindung XBee <-> XBee können die XBee selbst überprüfen. Kommt es hier zu einem Fehler, so sendet Dir der
XBeeSender ein bestimmtes Kommando. Dieses empfängt der Arduino und wertet es aus.

Das funktioniert aber nur, wenn Du die XBee richtig konfiguriert hast. Von Haus aus machen die das nicht!
Mit XCTU kannst Du alles an den XBee konfigurieren und einstellen. Auch das senden und Empfangen der Daten
Kannst Du in “echt” probieren.

Du verbindest ein XBee mit Deinem PC, das andere mit dem Arduino. So kannst Du alles senden und prüfen.
Hast Du Dir das https://www.digi.com/resources/documentation/digidocs/PDFs/90000982.pdf überhaupt einmal durchgelesen?

Du kannst mit dem Arduino fast jeden Parameter im XBee abfragen und ändern.
Im AuslieferungsZustand sind die XBee ziemlich blöd- aber die können auch richtig etwas.
Das mußt Du denen aber beibringen.
Gruß und Spaß
Andreas

P.S. wenn Du eine XBeeLib benutzt, dann klobbe die in die Tonne, ohne ist leichter.

Hallo Andreas

Danke Dir für die ausführliche Antwort. Gemeint war natürlich die Verbindung Xbee <=> Xbee, war von meiner Seite her zu wenig genau ausgedrückt, tut mir leid.
Die Xbee Lib brauch ich nicht nein, das hab ich selbst gemerkt, ohne ist man da besser bedient. Ich werde mir dann mal das Handbuch genauer durchlesen, habs nur grob überflogen um die Grundeinstellungen zu machen.
Mir ist noch nicht ganz klar, wie der Xbee Sender dem Xbee Empfänger ein Kommando senden kann, wenn er doch schon ausser Reichweite ist, sprich die Verbindung fehlt. Ist halt auch bisschen schwieriger zu testen, wenn man das ganze irgendwie trotzdem noch kontrollieren muss, während es keine Kontrolle mehr haben soll :smiley:
Aber ich lese mir mal den ganzen Schinken durch.

Danke Dir und Grüsse

Stef

Hallo,
"Mir ist noch nicht ganz klar, wie der Xbee Sender dem Xbee Empfänger ein Kommando senden kann, wenn er doch schon ausser Reichweite ist,"

Das spielt doch keine Rolle...
Der XBee sendet einem anderem XBee etwas, bekommt er keine Antwort- dann Fehler.
Gruß und Spaß
Andreas

Hallo,
da gibt es auch etwas anderes bei den Xbee, ich weiß aber nicht, ob Deine das können.

Die XBee können die SignalStärke des letzten Kommando ausgeben.
Also der Empfänger/Sender sendet Dir die Signalstärke. Damit kannst Du dann selbst festlegen wann
"ausser Reichweite" erreicht ist.
Gruß und Spaß
Andreas

Hallo Andreas

Ich habe mir mal das Handbuch angesehen. Ist nicht so verständlich, aber ich versuche es nochmals zu verstehen. Ich denke der API Modus soll auf 1 und nicht auf 0 sein. Dann geben die Xbees eine Rückmeldung ob etwas erfolgreich gesendet wurde oder nicht. Wie diese aber aussieht muss ich mal versuchen zu verstehen. Ich melde mich dann nochmals. Danke Dir mal für den Tipp mit dem Handbuch komplett zu studieren - die Xbees können ja eine Menge die mit den default Werten gar nicht eingestellt ist. Ist nur schade, gibt es dieses Handbuch nicht auf Deutsch, denn die Module werden ja international verkauft. Gewisse Dinge sind auf Deutsch vermutlich besser zu kapieren, wenn man ohnehin schon "wenig" Ahnung hat.

Grüsse

Stef

Hallo Andreas

Ich habe nun irgendetwas verstanden - denke ich mal.
Also, wenn ich den API Modus von 0 auf 1 ändere, dann werden mit meinen Daten die ich senden möchte noch andere Parameter mitgesendet. Der API Modus 1 fängt immer mit 0x7E an zu senden (1.Byte). Das 4.Byte gibt dann den "frame type" an. Was mir hier nicht ganz klar ist, werden immer alle frame types gesendet oder muss man das irgendwo definieren, welcher man gesendet haben möchte?
Ich denke ich bräuchte den frame type 0x01 (4.Byte) das fragt, ob die Daten gesendet werden können. Hier sind ab dem 9.Byte meine zu sendenden Daten dabei.
Die Antwort hierauf wäre dann der frame type 0x89 (4.Byte) der sagt, ob alle Daten empfangen wurden oder nicht. Ob ja oder nein, wird mit dem 6.Byte gesendet. Ist das 6.Byte eine 0, dann war es erfolgreich. Ist es eine 1, 2 oder 3 (also, wenn es keine 0 ist), dann war die Übertragung nicht erfolgreich.

Ich überlege mir gerade (sofern das hier stimmt, wie ich das verstanden habe), ob diese Übertragungsvariante nicht viel langsamer ist, als wenn ich einfach im Loop alle Daten über Serial sende und beim Empfangen in ein Array packe, damit die Reihenfolge stimmt. Dann einfach im Sketch wie ganz oben im ersten Beitrag beschrieben ein Verbindungs-Unterbuchkriterium definiere. Die Xbees sind dann mit den "default" Werten eingestellt und sind einfasch ein Ersatz für eine Kabelverbindung.

Ich muss ja mit dem API Modus die Daten so herausfischen, dass ich nur vom 9.Byte weg die Daten speichere. Wie kann ich das definieren, dass ich erst ab dem 9.Byte die Daten beginne meinen Variabeln zuzuweisen? Auch soll es ja eine Checksum geben ganz am Ende meiner Daten die im Sendungspaket sind. Diese darf ja nicht berücksichtigt werden - gut, ich glaube da ich diese nicht weiters definiert habe, wird diese gar nicht berücksichtigt. Hier wäre mal meine Idee des Sende- und Empfangsvogangs: Seriell Senden und Empfangen
Da habe ich jetzt noch keine Ahnung, wie ich das mit "ab dem 9.Byte" machen soll, sprich nur das 4.Byte und 6.Byte für die Überprüfung des Sendevorgangs abfrage.

Grüsse

Stef

Hallo Stef,
ich habe mit dieser Serie XBee868 und einem ArduinoMega 2560 ein "DigiMesh" Netzwerk aufgebaut. Da werkeln 5 Xbee so vor sich hin.
Glaube mir, der Weg dort hin ist echt hart gewesen. Dazu gehörte auch das sehr aufmerksame
lesen des Handbuch der XBee.
Im AuslieferungsZustand sind die XBee recht blöde. Die können nur das Nötigste.

Von der Serie die Du nutzt habe ich keine Ahnung. Ich kann Dir nur einige Tip´s geben, die
man (Frau) einmal versuchen kann. Dein Handbuch ist also ein anderes als meins.
Wenn Du die XBee tatsächlich ausnutzen möchtest, dann wirst Du nicht darum kommen das Ding
zu lesen.
Vielleicht hilft Dir diese Seite da weiter. Die übersetzen Dir ein PDF am Stück.

"Was mir hier nicht ganz klar ist, werden immer alle frame types gesendet oder muss man das irgendwo definieren, welcher man gesendet haben möchte?"

Warum nutzt Du nicht XCTU um die XBee zu konfigurieren und zum analysieren der gesendeten
Daten? Damit wird Dir doch bis aufs letzte ausgegeben was Deine Xbee senden und empfangen.

Du kannst doch z.B. den UNO als TTL-Wandler nutzen, wie auch den Mega.
Dann stöpselst Du den UNO/XBeeSender an USB1 und den Mega/XBeeEmpfänger an USB2.
Wenn Deine XBee es zulassen, dann stellt Du an beiden die gringste SendeLeistung ein, oder
stellst sie einige Meter (min 2,3m) auseinander.

Nun kannst Du beide mit XCTU konfigurieren. Wenn Du das erledigt hast, dann kannst Du
Daten senden und empfangen. Hier siehst Du in XCTU genau- was die beiden senden und
empfangen.

"ob diese Übertragungsvariante nicht viel langsamer ist"
Die XBee erledigen ihre Arbeit schneller als Deine Arduino!
Also, warum nicht die XBee rödeln lassen?

Deine ganze FunkBudenBastelei kannst Du so testen. Wenn das dann alles läuft wie Du es
Dir vorstellst, dann verbindest Du die XBee nur mit den Arduino.
Hier kommt es dann doch über seriell rein und raus. Und die Daten, die benötigt werden,
die kennst Du ja- also kannst Du sie auch auswerten.

Da Du in XCTU ja gesehen hast, was denn alles gesendet worden ist, weißt Du doch genau
wann Deine Daten beim auslesen der seriellen SchnittStelle dran sind.
Und ab da liest Du Deine Daten.
Wenn Du es einfach machen möchtest, dann markiere doch den Start der Daten.
Ab diesen Punkt kannst Du dann auswerten.

"Auch soll es ja eine Checksum geben"
Ja! Vergesse es. Sehe erst einmal zu, das Dein Funknetz einwandfrei funktioniert-
und ganz wichtig, Deine serielle Kommunikation.
Wenn mich nicht alles täuscht, dann können XBee eine Checksum bilden und auch an den
Arduino übergeben.
Gruß und Spaß
Andreas