Neue Übertragungswege für den MyFlyDream AAT Auto Antenna Tracker

Status
Nicht offen für weitere Antworten.
Oh man, ich habs......;)

BT Modul funzt nun mit 115,2k und absolut zuverlässig am Handy. Gleich mehr, muss Essen kochen. ;)
 

muerzi

Erfahrener Benutzer
0x00 0x00 0xFF 0x00 0x00 0x04 0x38 0x9F 0x7B lautet die anfrage an die funke (für die gps daten) und dann sendet die Funke ne antwort von 42Bytes. Hab die auch schon entschlüsselt die antwort. Werd das morgen posten
 
Also es geht bei der Methode nur 115,2k, weil die Funke die Daten intern so verarbeitet. Nur am Data Pin, da müssen 19,2k sein. Und da muss man auch requesten. Zb mit Arduino / Smartbox. Bei Smartbox könnte man das BT Modul mit einschleifen, da muss es dann aber auf 19,2k stehen.

Screenshot_2013-05-12-21-29-34.png

Ob es an der Stelle auch mit 19,2k Baud geht, muss ich noch testen. Aber dieses WE nimmer, muss morgen früh raus. Muss dazu das BT Modul auf 19,2k stellen und die App kann man auch einstellen.

Wenn man das BT Modul intern verbaut, so wie ich, braucht man nix requesten, zumindest nicht mit der App, die macht das alleine. Aber man muss RX und TX vom BT Modul anschliessen, denn die Handy App schickt ein 0x80 zur Funke - darum brauchen wir auch TX. Die Funke antwortet dann mit den entsprechenden Daten, die die App anfordert. Verhält sich dann ja auch quasi wie die Smartbox / ein Request.

Da man die entsprechenden Meldungen ja einzeln in der App einstellen / auswählen kann, werde ich mitm Serial Port Monitor mal mithören und kann so jeden Request aufspüren.

Zumindest habe ich jetzt alle Daten der Sensoren aufm Handy per BT. Habe nur n GAM und den RX. GPS Daten habe ich noch keine, da ich noch kein DIY GPS gebaut habe.

Hier das Anschlusschema.

20130512_200644.jpg 20130512_200704.jpg 20130512_200715.jpg 20130512_200744.jpg

Hoffe man erkennt was.

Die beiden kleinen Platinen sind im rückwärtigen Deckel. Einmal die USB Schnittstelle und einmal die DSC Buchse + Data Port. An dem klauen wir uns auch die 5V für das BT Modul.

Ist aber eher suboptimal - ich bevorzuge lieber die "muerzi Variante", am Data Pin mit Arduino.
So muss man nix löten.
 
Zuletzt bearbeitet:

muerzi

Erfahrener Benutzer
Zum Verständnis
115,2k --> damit kommuniziert die app mit deinem BT Modul?
Und mit 19,2k kommuniziert das BT Modul mit RX/TX der funke?

Die Pegel sind 3,3v bei der kommunikation und 5v für die Versorgungsspannung?

Stimmt das so?
 
Es gibt in der Funke 2 Übertragungsarten.

1. USB Anschluss - 115,2k - da häng ich mitm BT Modul drauf
2. Der Dataport - 19,2k - hinten an der Funke - Servostecker 3 polig. "S", "+" und "-". Da kommt die Smartbox ran.

Die App kann 115,2k und 19,2k kann man umstellen.

EDIT: Pegel am USB Port und am Dataport 3,3V. (Seh grad, hinter dem USB -> TTL Converter sitzt nochn LLC - aber das BT Modul funzt trotzdem)

Da ich am USB Port praktisch dahinter hänge (Der USB Port an den Funke hat auch nur n USB zu TTL - CP irgendwas), muss das BT Modul dort auf 115,2k laufen. Am Dataport muss man mit Arduino ne Smartbox simulieren - da sinds dann 19,2k.
 
Zuletzt bearbeitet:

muerzi

Erfahrener Benutzer
@ApoC: gott sei dank gibts leute wie dich die sich da hinsetzen und drüber brüten. Vielen Dank

Wie man "requested" hab ich oben schon beschrieben. Werd mir da morgen mal nen Versuchsaufbau machen um die daten am Dataport abzufragen. Liegen am Dataport (+ pol) 5v an? Wie kommst du drauf das die pegel 3,3v sind?
 

muerzi

Erfahrener Benutzer
Kannst du bitte mal nen Mitschnitt mit dem "Serial Port Monitor" posten wo jetzt alles funktioniert. Im Alten Screenshoot sieht man nur "80". Das Byte 0x80 wird bei jeder Anfrage am Bus gesendet. Das sagt leider nicht viel aus...

Bsp.: GPS-Sensor
Anfrage: 0x80 0x8A

Dann Antwortet der Sensor mit 45 Bytes
 
Ich nehm an, das es 3,3V sind, weil ich keinen 5V Pegel gemessen habe. Versteh aber zu wenig davon. :D Also lieber nochmal prüfen. Weisst ja: "Wer viel misst, misst Mist"

Am Dataport liegen 5V an. Mittlerer Pin.

N Mitschnitt geht erst wieder am Wochenende, da ich auswärts arbeite.

Kann dir dann jeden Request raussuchen.
 

muerzi

Erfahrener Benutzer
Wochenende ist früh genug. Danke.

Hab von Graupner die Schnittstellenbeschreibung bekommen. Ist das selbe Protokoll wie zwischen Empfänger und Sensor. Die Daten dazu muss jeder selbst bei Graupner erfragen. Darf die nicht weitersenden. Aber in meinem Projekt "Diy hott gps" im Source und im Thread bei rc-network stehen ja schon alle Details ;-)

lg Stefan
 
War zu erwarten, das es das gleiche Protokoll ist. Wie sollen die auch miteinander reden, wenn jeder eine andere Sprache spricht. ;)

Aber die genauen Requests kennst du nicht?

Wird ne heiden Arbeit, alle einzeln zu loggen. ;)

Mein geplantes Vorgehen:

- Serial Monitor parallel zum BT Modul
- In der App jeweils nur einen Wert abfragen, also zb RX Temp
- Das loggen

Oder soll ich alle Werte gleichzeitig abfragen? Aber dann wissen wir ja nicht, was was ist ^^
 

muerzi

Erfahrener Benutzer
Angefragt wird von der Smartbox immer mit 2 Bytes (über den Data Port)

1. Immer 0x80
2. 0x8D = GAM, 0x8E EAM, 0x8A GPS, 0x89 Vario

Bei USB (so wie du es gemacht hast) wird mit 9 Bytes vom Host (PC, Handy app) angefragt.
Da gibts ne Doku mit dem Namen USB_protocol.xls oder so.
Ist per anfrage erhältlich bei Graupner.
 
Also wissen wir nu alles? Oder muss ich jeden Request loggen?
 
Ich teste / logge am We.
 

muerzi

Erfahrener Benutzer
Hier mal ein Testcode welcher Anfragen der Smartbox über den Dataport emuliert und über den Seriellen Port ausgibt.

Zur Schaltung:
"-" des Dataport mit masse des arduinos verbinden
"S" des Dataport mit Pin 3 des Arduino verbinden --> HOTTV4_RXTX im Code

Code:
#include <SoftwareSerial.h>

#define HOTTV4_RXTX 3
#define HOTTV4_TX_DELAY 1000

/* Binärmodus
0x8D GAM (General Air Module)
0x8E EAM (Electric Air Module)
0x8A GPS
0x89 VARIO
*/

SoftwareSerial hottV4Serial(HOTTV4_RXTX, HOTTV4_RXTX); // RX, TX

void setup()
{
    hottV4Setup();
    Serial.begin(57600);
}

void loop()
{
	hottV4EnableTransmitterMode();
	hottV4SerialWrite(0x80);
	hottV4SerialWrite(0x8A);
	hottV4EnableReceiverMode();

	while (hottV4Serial.available() > 1) {
	   Serial.write(hottV4Serial.read());
	}
        
	delay(333);
}



/**
 * Common setup method for HoTTv4
 */
void hottV4Setup() {
  hottV4Serial.begin(19200);
  hottV4EnableReceiverMode();
}

/**
 * Enables RX and disables TX
 */
void hottV4EnableReceiverMode() {
  DDRD &= ~(1 << HOTTV4_RXTX);
  PORTD |= (1 << HOTTV4_RXTX);
}

/**
 * Enabels TX and disables RX
 */
void hottV4EnableTransmitterMode() {
  DDRD |= (1 << HOTTV4_RXTX);
}

/**
 * Writes out given byte to HoTT serial interface.
 */
static void hottV4SerialWrite(uint8_t c) {
  hottV4Serial.write(c);
  delayMicroseconds(HOTTV4_TX_DELAY);  
}
 

Rangarid

Erfahrener Benutzer
Was kann das GPS alles automatisch berechnen? Ich nehm mal an Entfernung, Alt und Lat/Lon gehen auf jedenfall, aber berechnet er auch den Winkel relativ zum Startpunkt?

Hier übrigens wie man die Checksum berechnent:

Du holst den String H0000D0000A00 ohne den Stern und checksum. Sagen wir mal der String heist data dann sieht das so aus:
Code:
uint8_t checksum = 0;
for (int i = 0; i < sizeof(data); i++)
{
    checksum += data[i];
}
return checksum;
Und dann hängst du an den String ein * und dahinter checksum.

Mal was anderes. Wenn ihr jetzt einen Arduino direkt an die Funke hängt, braucht man ja die Firmware garnicht zu ändern, weil man dann die Daten direkt im Arduino so machen kann, dass sie dem MFD Protokoll entsprechen...
 
Zuletzt bearbeitet:

Admiraliss

Erfahrener Benutzer
über usb/bluetooth können auch die requests abgesetzt werden mit 115k baud, geht viel schneller als über die data buchse, da über uart keine wartezeiten eingehalten werden müssen.
apoc hats schon richtig bebildert geschrieben wie es anzuschließen ist.
im hott manager (in der debug konsole) kann man sich die kommunikation zu jeden einzelnen request anschauen, was gesendet und was empfangen wird. Lauschen an der smartbox währe bissel arg umständlich...

hier ein beispiel für die daten des empfängers (ohne crc prüfung), die daten sind gleich wie im hott protokoll, teilweise aber in der reihenfolge verschoben, wie oben schon geschrieben keine wartezeiten wie im hott protokoll notwendig.:cool:

Code:
void EmpfängerAbfragen()
        {
            Byte[] BBuffer = new Byte[9];
            BBuffer[0] = 0x00;
            BBuffer[1] = 0x55;
            BBuffer[2] = 0xAA;
            BBuffer[3] = 0x00;
            BBuffer[4] = 0x00;
            BBuffer[5] = 0x04;
            BBuffer[6] = 0x34;
            BBuffer[7] = 0x13;
            BBuffer[8] = 0xba;
            Byte[] bTemp = new Byte[SP.BytesToRead];
            SP.Read(bTemp, 0, SP.BytesToRead);
            SP.Write(BBuffer, 0, 9);

            WaitUntil = DateTime.Now.AddMilliseconds(300);

            while (SP.BytesToRead < 20 && WaitUntil > DateTime.Now)
            {
                Thread.Sleep(50);
            }

            if (SP.BytesToRead == 20)
            {
                Byte[] ListByte = new Byte[SP.BytesToRead];
                SP.Read(ListByte, 0, SP.BytesToRead);

                EmpfängerTemperatur = ListByte[9];
                EmpfängerRxSt = ListByte[13];
                EmpfängerRxQua = ListByte[16];
                EmpfängerSpannung = (double)ListByte[14] / 10;
            }           


        }
hab mich noch nicht an die smartbox rangehangen, aber mir scheint als ob bei euch der crc im request fehlt. aber wenn´s auch ohne geht ist die data buchse vielleicht gutmütiger als das usb oder hat´s einfach nicht nötig :p

-Admi
 

muerzi

Erfahrener Benutzer
Was kann das GPS alles automatisch berechnen? Ich nehm mal an Entfernung, Alt und Lat/Lon gehen auf jedenfall, aber berechnet er auch den Winkel relativ zum Startpunkt?
Entfernung:
uint8_t distanceLow; /* Byte 20: 027 123 = /distance low byte 6 = 6 m */
uint8_t distanceHigh; /* Byte 21: 036 35 = /distance high byte */

ALT:
uint8_t altitudeLow; /* Byte 22: 243 244 = /Altitude low byte 500 = 0m */
uint8_t altitudeHigh; /* Byte 23: 001 1 = /Altitude high byte */

LAT/LON:
uint8_t LatitudeNS; /* Byte 10: 000 = N = 48°39’988 */
uint8_t LatitudeMinLow; /* Byte 11: 231 0xE7 = 0x12E7 = 4839 */
uint8_t LatitudeMinHigh; /* Byte 12: 018 18 = 0x12 */
uint8_t LatitudeSecLow; /* Byte 13: 171 220 = 0xDC = 0x03DC =0988 */
uint8_t LatitudeSecHigh; /* Byte 14: 016 3 = 0x03 */

uint8_t longitudeEW; /* Byte 15: 000 = E= 9° 25’9360 */
uint8_t longitudeMinLow; /* Byte 16: 150 157 = 0x9D = 0x039D = 0925 */
uint8_t longitudeMinHigh; /* Byte 17: 003 3 = 0x03 */
uint8_t longitudeSecLow; /* Byte 18: 056 144 = 0x90 0x2490 = 9360*/
uint8_t longitudeSecHigh; /* Byte 19: 004 36 = 0x24 */

Homedirection: (2° Auflösung)
uint8_t HomeDirection; /* Byte 29: HomeDirection (direction from starting point to Model position) (1 byte) */

Hier kannst du dir den Aufbau des GPS structs ansehen.

Code:
struct {
  uint8_t startByte;               /* Byte 1: 0x7C = Start byte data */
  uint8_t sensorID;                /* Byte 2: 0x8A = GPS Sensor */
  uint8_t alarmTone;               /* Byte 3: 0…= warning beeps */
  uint8_t sensorTextID;            /* Byte 4: 160 0xA0 Sensor ID Neu! */
  uint8_t alarmInverse1;           /* Byte 5: 01 inverse status */
  uint8_t alarmInverse2;           /* Byte 6: 00 inverse status status 1 = kein GPS Signal */
  uint8_t flightDirection;         /* Byte 7: 119 = Flightdir./dir. 1 = 2°; 0° (North), 9 0° (East), 180° (South), 270° (West) */
  uint8_t GPSSpeedLow;             /* Byte 8: 8 = /GPS speed low byte 8km/h */
  uint8_t GPSSpeedHigh;            /* Byte 9: 0 = /GPS speed high byte */
  
  uint8_t LatitudeNS;              /* Byte 10: 000 = N = 48°39’988 */
  uint8_t LatitudeMinLow;          /* Byte 11: 231 0xE7 = 0x12E7 = 4839 */
  uint8_t LatitudeMinHigh;         /* Byte 12: 018 18 = 0x12 */
  uint8_t LatitudeSecLow;          /* Byte 13: 171 220 = 0xDC = 0x03DC =0988 */
  uint8_t LatitudeSecHigh;         /* Byte 14: 016 3 = 0x03 */
 
  uint8_t longitudeEW;            /* Byte 15: 000  = E= 9° 25’9360 */
  uint8_t longitudeMinLow;         /* Byte 16: 150 157 = 0x9D = 0x039D = 0925 */
  uint8_t longitudeMinHigh;        /* Byte 17: 003 3 = 0x03 */
  uint8_t longitudeSecLow;         /* Byte 18: 056 144 = 0x90 0x2490 = 9360*/
  uint8_t longitudeSecHigh;        /* Byte 19: 004 36 = 0x24 */
  
  uint8_t distanceLow;             /* Byte 20: 027 123 = /distance low byte 6 = 6 m */
  uint8_t distanceHigh;            /* Byte 21: 036 35 = /distance high byte */
  uint8_t altitudeLow;             /* Byte 22: 243 244 = /Altitude low byte 500 = 0m */
  uint8_t altitudeHigh;            /* Byte 23: 001 1 = /Altitude high byte */
  uint8_t resolutionLow;           /* Byte 24: 48 = Low Byte m/s resolution 0.01m 48 = 30000 = 0.00m/s (1=0.01m/s) */
  uint8_t resolutionHigh;          /* Byte 25: 117 = High Byte m/s resolution 0.01m */
  uint8_t unknow1;                 /* Byte 26: 120 = 0m/3s */
  uint8_t GPSNumSat;               /* Byte 27: GPS.Satelites (number of satelites) (1 byte) */
  uint8_t GPSFixChar;              /* Byte 28: GPS.FixChar. (GPS fix character. display, if DGPS, 2D oder 3D) (1 byte) */
  uint8_t HomeDirection;           /* Byte 29: HomeDirection (direction from starting point to Model position) (1 byte) */
  uint8_t angleXdirection;         /* Byte 30: angle x-direction (1 byte) */
  uint8_t angleYdirection;         /* Byte 31: angle y-direction (1 byte) */
  uint8_t angleZdirection;         /* Byte 32: angle z-direction (1 byte) */
  uint8_t gyroXLow;                /* Byte 33: gyro x low byte (2 bytes) */
  uint8_t gyroXHigh;               /* Byte 34: gyro x high byte */
  uint8_t gyroYLow;                /* Byte 35: gyro y low byte (2 bytes) */
  uint8_t gyroYHigh;               /* Byte 36: gyro y high byte */
  uint8_t gyroZLow;                /* Byte 37: gyro z low byte (2 bytes) */
  uint8_t gyroZHigh;               /* Byte 38: gyro z high byte */
  uint8_t vibration;               /* Byte 39: vibration (1 bytes) */
  uint8_t Ascii4;                  /* Byte 40: 00 ASCII Free Character [4] */
  uint8_t Ascii5;                  /* Byte 41: 00 ASCII Free Character [5] */
  uint8_t GPS_fix;                 /* Byte 42: 00 ASCII Free Character [6], we use it for GPS FIX */
  uint8_t version;                 /* Byte 43: 00 version number */
  uint8_t endByte;                 /* Byte 44: 0x7D Ende byte */
  uint8_t chksum;                  /* Byte 45: Parity Byte */
} HoTTV4GPSModule;
Somit ist alles vorhanden.

Wenn du über den Dataport requestest, dann kommt genau diese Antwort. Übern USB/BT Port is die Antwort ein bisschen anders.
 

Rangarid

Erfahrener Benutzer
Was ist der Unterschied zwischen Distance High und Distance Low?

Wir brauchen Entfernung, Höhe und Homedirection. Ich glaub damit sollte man den AAT schon steuern können. Man muss dann halt irgendwie den Homepunkt setzen können...
 
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten