Digitale Daten einer Leitung auslesen

Ich möchte die Daten eines Varios (VT-1 von Simprop, in einem Modell-Segelflugzeug) auslesen, die per Funk (433MHz) in digitaler Form an einen Empfänger am Boden gesendet werden. Der Empfänger produziert über einen Ohrhörer einen unterschiedlich hohen Ton für steigen oder sinken des Seglers.
Die Daten werden auf einem separatern Info-Display via 3-adr.Kabel (+,-,Daten) angezeigt: Steigen/Fallen, akt.Höhe, Akku-Spannung im Modell etc.).
Mit einem Arduino Uno möchte ich diese Daten lesen und im seriellen Monor anzeigen. Später mochte ich sie auswerten. Der Hersteller gibt über Inhalt und Form der Datenpakete keine Auskunft.

Gibt es eine vergleichbare Anwendung? Wie könnte der Sketch in seiner einfachsten Form aussehen?
Danke für die Unterstüzung.
R.Rappen

Hi

Naja, da die Akku-Spannung wohl enthalten ist, wird das Signal mehrere Informationen in dem Datenstrom enthalten sein.
Die Tonhöhe wird wohl aus 'Flughöhe ALT zu Flughöhe NEU' bzw. Deren Unterschied zueinander vom Empfänger generiert.
Am Einfachsten, wenn Du etwas über das Protokoll finden kannst - sonst könnte ein Digital-Oszi Dir weiter helfen, da Du so die empfangenen Daten im Empfänger sichtbar machen kannst - und aus den Nullen und Einsen musst Du Dir dann was zusammen reimen.

Wie schnell sind die Daten am Empfänger?
Ggf. kann man Diese einfach seriell mitlesen, vll. ist I²C mit im Boot, vll. aber auch was ganz Eigenes.

Du kannst auch versuchen, den Datenstrom zum Display mitzuschneiden und dort die Informationen zurück zu gewinnen - on die Daten als lesbare Zeichen übertragen werden, oder ob bereits einzelne Pixel angesprochen werden, wirst Du wohl noch heraus finden.

Das Display - hat der darauf befindliche Chip einen Namen?

MfG

Hallo,

der Funkempfänger gibt demnach schon digitale Daten weiter an einen µC mit Display. Theoretisch musste dich nur lesend auf die Datenleitung klemmen. Bei unbekannten Protokoll besteht nun die Aufgabe das zu "entschlüsseln". Ein Sketch nützt dir hier noch nichts, du kennst das Protokoll nicht. Du brauchst einen Datenlogger oder Oszi mit einer seriellen Dekodierfunktion. Dann fängste an mit bekannten Werten vom Display Rückschlüsse auf die Datenpakete zunehmen. Wird bestimmt eine interessante Aufgabe. Oder du guckst in Modellbauforen ob das Protokoll schon bekannt ist.

Danke für die Hinweise.
Den Datenstrom mitschneiden und evtl. ersteinmal auf SD speichern, dass ist auch meine Vorstellung. Benötige ich zusätzliche "Hardware" dazu ? Genügt es, die Signalleitung (und GND) an einen bestimmtern Pin am Uno anzuschhließen? Mit welchen Befehlen lese ich sie aus? Ich stehe noch ganz am Anfang. Ist ein Sketch bekannt, der mir als "Vorlage" nützlich sein könnte? Erst wenn ich entsprechende Daten gesammelt habe, kann ich versuchen sie zu entschlüsseln.
Bin für weitere Ratschläge dankbar.
Rüdiger

Erst wenn du entsprechende Daten gesammelt hast, kannst du sie entschlüsseln.
Erst wenn du die passende Beschaltung gebaut hast, kannst du die Daten sammeln.
Erst wenn du die elektrischen Parameter des Signals herausgefunden hast, kannst du die Schaltung planen.

Es fängt also mit Doku lesen an.
Und was die Doku nicht her gibt, muss das Oszilloskop und der Denkapparat liefern.

Greyhaired:
Der Hersteller gibt über Inhalt und Form der Datenpakete keine Auskunft.

Dann bleibt Dir nur die mühsame Analyse mittels Oszi oder Logikanalysator. Du kannst auch Deinen Arduino dazu nutzen, glaubt man diesem Thema. Probiert habe ich es noch nicht.

Hi

So wie sich Das liest, wird dort nur sturr 1024 Mal das Port eingelesen und in den Speicherbereich des Variale log geschrieben.
Bin mir nur nicht sicher, wie(und so) die passenden Variablen benutzt werden, kommt aber in die Lesezeichen.

Für die heute aufgerufenen <5Eu für einen Logik-Analyser ist der Sketch aber wohl nur eine Machbarkeits-Studie.
Beim chinesischem Logik-Analyser habe ich direkt eine Protokoll-Erkennung integriert, Die hier weder enthalten, noch einfach einzubringen ist.

Netter Sketch, Danke dafür

MfG

Ich habe mir einen der preiswerten USB Logik Analyser bestellt und werde berichten. Ich fürchte, das kann dauern.
Danke für die Hinweise hierzu.
Gruß Rüdiger R.

Der Logic-Analyzer ist eingetroffen. Inzwischen konnte ich die DatenPakete des VT-1 auch entschlüsseln .
Nun werde ich versuchen, die Daten innerhalb des Paketes zu trennen und gezielt auszuwerten. Gibt es dazu einen Hinweis, wo ich etwas zu diesem Thema nachlesen kann?
Danke+Gruß
Rüdiger R.

Greyhaired:
Nun werde ich versuchen, die Daten innerhalb des Paketes zu trennen und gezielt auszuwerten.

Wenn Du etwas mehr über die Datenstruktur verraten würdest, wäre die Antwort genauer möglich. Diese Fragestellung taucht häufiger mal auf, aber die Details unterscheiden sich dann doch.

Serial Communication / String auslesen und nur bestimmten Teil verwenden

Bluetooth Eingabe auslesen und weiter verarbeiten (Software Serial mit HC05)

Print, BIN, DEC Verständnis (Windmesser)

Ich habe mal drei unterschiedliche Datenpakete als Anlage kopiert. Von der 4. bis zur 10. Zeile sieht man beispielsweise den Wert +/- x,x für steigen und fallen. Später (weiter unten) dann Werte zur Höhe und die Akku-Spannung. Allerdings, das sind Werte aus dem Saleae-Analyzer-Programm. Wie ich sie mittels Arduino auslese und bearbeite, muß ich mir erst erarbeiten. Gruß Rüdiger R.

Vario-Auszug2.txt (3.83 KB)

Nachtrag: Falls Interesse, hier zwei Bilddateien zu den oben gezeigten Datenpaketen.

Greyhaired:
Allerdings, das sind Werte aus dem Saleae-Analyzer-Programm. Wie ich sie mittels Arduino auslese und bearbeite, muß ich mir erst erarbeiten.

Wenn Du eine Anregung benötigst:

/*
  0xFF
  "&7- 0,7ms H+0019m0019m 5,5V 000.0"
  0x00

  0xFF
  "&7  0,0ms H+0017m0021m 5,5V 000.0"
  0x00

  0xFF
  "&7+ 0,1ms H+0021m0021m 5,5V 000.0"
  0x00
*/
#include <Streaming.h>

char receivedChars1[] = {"&7- 0,7ms H+0019m0019m 5,5V 000.0"};
char receivedChars2[] = {"&7  0,0ms H-0017m0021m 5,5V 000.0"};
char receivedChars3[] = {"&7+ 0,1ms H+0021m0021m 5,5V 000.0"};

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Anfang"));
  ausgabe(receivedChars1);
  ausgabe(receivedChars2);
  ausgabe(receivedChars3);
}
void ausgabe(char* text) {
  Serial << text << endl;
  char dir;
  byte a1 = 0, a2 = 0, s1 = 0, s2 = 0; // Hier sollen die Zahlenwerte landen
  short int h1 = 0, h2 = 0;
  sscanf(text, "&7%c %hhu,%hhums H%hdm%hdm %hhu,%hhuV 000.0", &dir, &a1, &a2, &h1, &h2, &s1, &s2);
  Serial << "dir: " << dir << "\ta1: " << a1 << "\ta2: " << a2 << "\th1: " << h1 << "\th2: " << h2 << "\ts1: " << s1 << "\ts2: " << s2 << endl;

  float stg = a1 + (a2 / 10.);
  float spg = s1 + (s2 / 10.);
  Serial << "Richtung: " << dir << "\tSteigung: " << stg << "\tHoehe: " << h1 << "\tSpannung: " << spg << endl;

// Fuer die folgenden Zeilen ist eine Erweiterung der IDE notwendig, damit %f funktioniert.
// Quelle: https://forum.arduino.cc/index.php?topic=570408.msg3888254#msg3888254
  char* pos = strchr(text, (int)',');
  *pos = '.';
  pos = strchr(text, (int)',');
  *pos = '.';
  Serial << text << endl;

  float af = 0, sf = 0;
  sscanf(text, "&7%c %fms H%hdm%hdm %fV 000.0", &dir, &af, &h1, &h2, &sf); // hier %f
  Serial << "dir: " << dir << "\taf: " << af << "\th1: " << h1 << "\th2: " << h2 << "\tsf: " << sf << endl;
// Ende notwendige Erweiterung.

  Serial.println(F("-------"));
}

void loop()
{}

DANKE, das ist wirklich eine entscheidende Hilfe für mich gewesen.

Trotzdem bleibt für mich im Augenblick noch eine Frage: Wie schließe ich die Datenleitung an den Arduino an? An den Rx-Anschluß? Brauche ich zusätzliche Hardware?

Gruß Rüdiger R.

Greyhaired:
Wie schließe ich die Datenleitung an den Arduino an? An den Rx-Anschluß? Brauche ich zusätzliche Hardware?

Aus dem, was Du schreibst, geht die Signal-Spannung nicht hervor. Ein UNO möchte 0 bis 5V haben. Bei anderer Signalspannung benötigst Du externe Hardware.

Am Rx des UNO hängt schon USB, da gibt es einen Konflikt. Ein Mega2560 mit mehreren seriellen Schnittstellen wäre besser. Es gibt aber auch SoftwareSerial als Möglichkeit, ist aber in der Geschwindigkeit beschränkt. Welche Baudrate hat das Signal? Ist es überhaupt ein UART-Signal mit Start- und Stopp-Bit?

Saleae benutzt von sich aus AsyncSerial als Protokoll. Nach meinem Verständnis 9600bps, 8 bit, no parity, 1 Stopbit. Also UART? Über die Spannung weiß ich nichts, vermute 5V.
Ich werde bei Ebay mal nach einem Mega2560 schauen. Hatte bis jetzt nur die einfachen UNO. Neu war für mich auch, daß Rx mit USB verbunden ist. Ich muß offensichtlich noch viel lernen. Vermutlich bin ich überfordert, habe mir das einfacher vorgestellt. Zum Programm oben habe ich “Streaming.h” neu installiert. Was im Programm passiert ist mir noch nicht klar.
((Vermutlich bin ich mit fast 78 doch zu alt. Ich war vor vielen Jahren Leiter der EDV-Org. in einem Großhandelsbetrieb. Habe viele kaufm.Anwendungen programmiert, aber das war eine ander Welt))
Vielen Dank! Rüdiger R.

Greyhaired:
Vermutlich bin ich mit fast 78 doch zu alt.

Unsinn!

Greyhaired:
Saleae benutzt von sich aus AsyncSerial als Protokoll. Nach meinem Verständnis 9600bps, 8 bit, no parity, 1 Stopbit. Also UART?

Ja, könnte passen.

Greyhaired:
Über die Spannung weiß ich nichts, vermute 5V.

RS232 benutzt deutlich höhere Spannungen, Vermutungen nützen da nichts, das weißt Du selbst.

Greyhaired:
Ich werde bei Ebay mal nach einem Mega2560 schauen.

Die gibt es auch als Mega 2560 PRO kleiner, wenn das ein Kriterium sein sollte. (Ich bestelle da, wo das Land liegt, muß ich Dir nicht erzählen, aber es gibt viele Anbieter.)

Du kannst bei 9600 Baud aber auch SoftwareSerial auf beliebigen Pins versuchen.

#include <SoftwareSerial.h>

#define rxPin 9
#define txPin 8

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

Greyhaired:
Was im Programm passiert ist mir noch nicht klar.

Wie man Fragen stellt, weißt Du ja :slight_smile:

Danke für den Hinweis auf SoftwareSerial. Ich werde das probieren.
Gruß Rüdiger R.

Bei dem Versuch, das beigefügte Programm-Fragment auf den Arduino zu laden, stoße ich auf Logic- /Syntax-Fehler, die ich nicht abgestellt bekomme. Ich möchte erst einmal Daten lesen können, bevor ich an die Details der Bearbeitung gehe. Wo liegen die Fehler?
Danke für die Hilfe.
Rüdiger R.

VT-1_Vorschlag-Orig_RR.ino (2.96 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy