FrSky Telemetrie / Protokoll

filth

Erfahrener Benutzer
#1
Hallo,

hat sich jemand schon mal mit den Protokollen von FrSky auseinander gesetzt?
Konkret möchte ich zb für den Anfang die GPS Daten von einem eigenem GPS Modul übertragen. uC und Programmierkenntnisse habe ich, aber ein Referenzprojekt wäre ganz gut.

Danke!
 
#2
Das Protokoll ist komplett offen, dokumente gibts alle bei FrSky auf der Seite.

http://www.frsky-rc.com/uploadfile/201009/20100921121837352.pdf
http://www.frsky-rc.com/uploadfile/201211/20121120193905895.pdf
und andere,

Du musst im Prinzip die NMEA Daten vom GPS parsen und in binäre FrSky Hub Frames verwandeln. Soweit hatte ich das alles schon mal am laufen. Das einzige Problem war das das FrSky zwar mit 9600 an Ein und Ausgang arbeitet, aber nur deutlich weniger Zeichen pro sec. übertragen kann. wenn du zu schnell sendest dann verschluckt es sich.
Du kannst z.B: auch mal im sourcecode vom Naze32 gucken, das kann auch FrSky frames erzeugen und ausspucken.

Ach und noch eins, FrSky arbeitet an ein und Ausgang mit RS232 Signalen, nicht TTL, also entweder Umsetzer verwenden oder Spannungsteiler und Inverter.
 
Zuletzt bearbeitet:

filth

Erfahrener Benutzer
#3
Danke!
Wie genau funktioniert es mit der Übertragung? Also wenn ich ein Hub Frame mit meinem (zb) Atmega erzeugt habe - sende ich den via RS-232 an das Telemetriemodul und dieses überträgt es dann? Wie genau kann ich es dann empfangen?
 
#4
Genau, du schreibst mit dem Atmel binäre daten auf der seriellen raus, da hast dann n Umsätzer nach RS232 der geht dann an den RX vom FrSky Emfpänger. Am FrSky Sendemodul kommt das Frame dann wieder mit rs232 Level am TX pin raus - hier allerdings in FrSky frames gekapselt. Die kannst du dann über nen Wandler wieder an der seriellen von z.B: nem 2. Atmel einlesen, aus den FrSky frames auspacken und anzeigen oder was auch immer.

Wenn du am FrSky Empfänger halt Daten im FrSky Hub Format generiert und einspeist dann kannst du am Boden einach mit dem Display von FrSky oder ner 9x mit FrSky mod anzeigen.
 
Zuletzt bearbeitet:

filth

Erfahrener Benutzer
#7
Damit kann man ja nun eigentlich relativ einfach zB Antennentracking realisieren, oder stelle ich mir das gerade aus irgendeinem Grund zu einfach vor?
 
#8
Im prinzip ja, aber wie gesagt, so einfach isses nicht, GPS Daten zum Boden zu bekommen sollte gut machbar sein, siehe FrSky Hub und Naze Code.
Was du dann damit am Boden machst ist ne andere Sache, haben ja schon einige hier mal probiert wenn ich nicht irre.
Für mich keine Option, ich will keinen Tracker der nur mit Fliegern geht die ein GPS drin haben.
 

DerCamperHB

Erfahrener Benutzer
#9
Den FrSky Tracker gibt es schon, musst mal im Forum suchen, den hat einer schon Prorammiert, da mir bisher die GPS Daten vom Modell fehlen, hatte ich den noch nicht nachgebaut
 

meister

Erfahrener Benutzer
#10
Hi,
wollte auch mal was zu FrSky schreiben.

Am Original-Hub lassen sich auch Standart NMEA-GPS Module betreiben (9600Baud/1Hz), sowie BMP085-Sensoren.
Der RPM-Eingang erwartet nur einen Takt.
Einen Konverter (RS232<->TTL) kann man einfach mit einem Transistor und 2 Widerständen bauen.
Man kann auch andere Daten über FrSky senden (z.B. direkt NMEA), das Protokoll auf der RX-Seite legt nur der Hub fest,
auf der TX-Seite muss man allerdings seine Daten dann wieder aus dem FrSky-Protokoll (User-Daten) extrahieren.
Dabei sollte man aber insgesammt unter 2000 Zeichen/Sec bleiben.

Als Hub kann man auch einen Arduino mit Software-Serial nutzen um den Hardware-Serial Port für ein GPS frei zu haben.

Einen Demo-Code hab ich auch dafür (Sendet jedoch nur Fake-Daten / RPM & Lipo-Voltage):
Code:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);


#define FRSKY_USERDATA_GPS_ALT_B    0x01
#define FRSKY_USERDATA_TEMP1        0x02
#define FRSKY_USERDATA_RPM          0x03
#define FRSKY_USERDATA_FUEL         0x04
#define FRSKY_USERDATA_TEMP2        0x05
#define FRSKY_USERDATA_CELL_VOLT    0x06

#define FRSKY_USERDATA_GPS_ALT_A    0x09
#define FRSKY_USERDATA_BARO_ALT_B   0x10
#define FRSKY_USERDATA_GPS_SPEED_B  0x11
#define FRSKY_USERDATA_GPS_LONG_B   0x12
#define FRSKY_USERDATA_GPS_LAT_B    0x13
#define FRSKY_USERDATA_GPS_CURSE_B  0x14
#define FRSKY_USERDATA_GPS_DM       0x15
#define FRSKY_USERDATA_GPS_YEAR     0x16
#define FRSKY_USERDATA_GPS_HM       0x17
#define FRSKY_USERDATA_GPS_SEC      0x18
#define FRSKY_USERDATA_GPS_SPEED_A  0x19
#define FRSKY_USERDATA_GPS_LONG_A   0x1A
#define FRSKY_USERDATA_GPS_LAT_A    0x1B
#define FRSKY_USERDATA_GPS_CURSE_A  0x1C

#define FRSKY_USERDATA_BARO_ALT_A   0x21
#define FRSKY_USERDATA_GPS_LONG_EW  0x22
#define FRSKY_USERDATA_GPS_LAT_EW   0x23
#define FRSKY_USERDATA_ACC_X        0x24
#define FRSKY_USERDATA_ACC_Y        0x25
#define FRSKY_USERDATA_ACC_Z        0x26

#define FRSKY_USERDATA_CURRENT      0x28

#define FRSKY_USERDATA_VOLTAGE_B    0x3A
#define FRSKY_USERDATA_VOLTAGE_A    0x3B


uint16_t val = 0;

void SendValue(uint8_t ID, uint16_t Value) {
    uint8_t tmp1 = Value & 0x00ff;
    uint8_t tmp2 = (Value & 0xff00)>>8;
    mySerial.write(0x5E);
    mySerial.write(ID);
    if(tmp1 == 0x5E) {
      mySerial.write(0x5D);
      mySerial.write(0x3E);
    } else if(tmp1 == 0x5D) {
      mySerial.write(0x5D);
      mySerial.write(0x3D);
    } else {
       mySerial.write(tmp1);
    }
    if(tmp2 == 0x5E) {
      mySerial.write(0x5D);
      mySerial.write(0x3E);
    } else if(tmp2 == 0x5D) {
      mySerial.write(0x5D);
      mySerial.write(0x3D);
    } else {
       mySerial.write(tmp2);
    }
    mySerial.write(0x5E);
}

void SendVoltage(uint8_t cellID, uint16_t voltage) {
  voltage /= 2;
  uint8_t v1 = (voltage & 0x0f00)>>8 | (cellID<<4 & 0xf0);
  uint8_t v2 = (voltage & 0x00ff);
  uint16_t Value = (v1 & 0x00ff) | (v2<<8);
  SendValue(FRSKY_USERDATA_CELL_VOLT, Value);
}

void setup(void) {
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop(void) {

  SendValue(FRSKY_USERDATA_RPM, val++);
  delay(400);

  SendVoltage(0, 3200);
  delay(100);
  SendVoltage(1, 3300);
  delay(100);
  SendVoltage(2, 3400);
  delay(100);
  
}
Der Code ist allerdings nur mit meiner eigenen Boden-Station getestet, diese funktioniert aber genause mit dem Original-Hub.
Daher sollte es auch mit dem Original Display funktionieren !

Gruß,
Olli
 

bruchpilot05

Erfahrener Benutzer
#11
Hallo, ich habe mal eine Fragen zu den Telemetrieprotokoll aus der Taranis.

Ich möchte gern ein Ground OSD realisieren und nutze die Telemetrie im alten Protokoll (D8).
Ich habe etwas fast passendes gefunden.
http://diydrones.com/forum/topics/o...extra?id=705844:Topic:1620914&page=2#comments

Spannung, Strom und RSSI werden angezeigt, nur die GPS Daten nicht. Das OSD verarbeitet nur die GPS Daten im S.Port Protokoll.
Ist es möglich den Code so zu ändern, dass es auch die GPS Daten im alten D8 Protokoll versteht?

Vielleicht kann mir jemand einen Tipp geben, wo ich ansetzen kann.
In der MAVLink.ino sind die Adressen aufgeschlüsselt. Aber ein einfaches Austauschen der Adressen brachte keinen Erfolg.

Gruß Stefan
 
RCLogger

FPV1

Banggood

Banggood

Oben