Naza Telemetrie für FrSky D4R-II und D8R

#1
Nachdem ich ich die FC Telemetrie Übertragung aufs Display der 9x mit OpenTX von naze32 und jetzt mittels des Mavlink->FrSky Konverters auch am APM schätzen gelernt hab wollte ich das auch am Naza-Lite haben.

Die kleine Zaggometrie aus dem Parallelthread geht leider nur mit den neuen S-PORT Empfängern, fiel für mich also Flach.

Kurz mal scharf nachgedacht....das $20 OSD vom JR66 parst ja die FrSky Daten schon mittels Arduino und der Mavlink Adapter baut mir schon die passenden FrSky Datenpakete die den FrSky Hub emulieren....sollte machbar sein.

Fix die beiden Verwendeten Libs zusammenkopiert und im eigentlichen Arduino Sketch nur noch die Werte aus dem Naza Parser in den FrSky Encoder geschrieben - fertig war der Code in gut 30min incl dem Suchen der Libs.
Ich liebe den Arduino.

Also noch Fix nen Arduino Pro Mini aus dem Lager geholt (bei einem Preis von unter $3 sollte man sowas auf Vorrat haben) und fertig war der Konverter.

Naza2Frsky_tele.jpg

Die Verkabelung für den Anschluss ans Naza GPS findet sich hier von JR66 prima beschrieben:
https://code.google.com/p/minnazaosd/wiki/SolderGPS
Statt ans MinimOSD kommt das kabel genau so an den Arduino Pro Mini.
Auf der anderen Seite geht der Softserial TX von pin 5 des Arduino an den RX Pin des FrSky Empfängers und fertig is.

Aktuell zeigt der Konverter auf der openTX dann Fix Status und Anzahl Sats, sobald ein 3D fix vorliegt dann auch Position, Höhe, Speed und Heading.

Gestern wurde das ganze getestet und es scheint soweit prima zu funktionieren.

Viel Spass beim Nachbau - wenn man das überhaupt Bau nennen kann.

Anhang anzeigen Naza2FrSkyHub.zip
 
Zuletzt bearbeitet:

DerCamperHB

Erfahrener Benutzer
#2
jetzt kommst du damit an, wo die Nächsten Tage X6Rfür die Naza Copter ankommen:mad:

Schön das dich dran gemacht hast, wird sicher vielen helfen und einige Copter retten
 

wolfes1126

Erfahrener Benutzer
#4
Aboniert....
Wenn ich das richtig lese braucht man dazu nun nur noch den Arduino ???

Kann man sich dann auch Höhe ansagen lassen ?
 
#5
Ja, es braucht nur den Arduino und parallel zum OSD gehts natürlich auch, es greifen beide die selben Pins ab.

Höhe ansagen sollte auch gehen mit der Taranis, nur hat meine 9x keine Sprachausgabe.

Spannungsabgriff der Naza hab ich hier weggelassen, da die D4R und D8 Empfänger eh nen analogen Spannungseingang haben den man parallel nutzen kann.
 
#7
Sollte machbar sein. SD libs gibts ja genug für den arduino und Pins sind auch noch genug frei.
Musst du einfach mal probieren.
 

aargau

Erfahrener Benutzer
#8
Wow wirklich simpel gelöst ^^
Ich war ja auch schon an einem solchen Projekt, bin aber zeitlich nie wirklich dazu gekommen daran zu arbeiten.
Aber wenn es so einfach geht, werde ich mein Projekt einstampfen ;)

@Ösi: Das geht ganz sicher, würde aber nicht das riesen SD Teil nehmen sondern ein kleiner Adapter für ne microSD. Die Daten würde ich direkt als CSV speichern
 
#9
Ja, der Code ist echtn icht viel, hier mal das Wichtigste:

Code:
// Connect FrSky Receiver RX to inverted Softserial TX on Arduino Pin 5
SoftwareSerial frSerial(6,5,true);

void setup()
{
  // Serial for Reading Naza GPS data and writing debug info
  Serial.begin(115200);
  
  // SoftSerial for writing to FrSky RX
  frSerial.begin(9600);
  
  // LED Pin for heartbeat
  pinMode(13, OUTPUT);   
  
  Serial.println("DJI Naza 2 FrSky Sensor Hub Emulator READY");
}

void loop()
{
  if(Serial.available())
  {
    uint8_t decodedMessage = NazaDecoder.decode(Serial.read());
    switch (decodedMessage)
    {
      case NAZA_MESSAGE_GPS:
        
        // toggle led as Heartbeat
        digitalWrite(13, ! digitalRead(13));
        
        iob_fix_type = (uint8_t) NazaDecoder.getFixType();
        iob_satellites_visible = NazaDecoder.getNumSat();
        
        // if 3D Fix -> set Values
        if (iob_fix_type == 3) {
          iob_lat = (float) NazaDecoder.getLat();
          iob_lon = (float) NazaDecoder.getLon();
          iob_gps_alt = (float) NazaDecoder.getAlt();
          iob_groundspeed = (float) NazaDecoder.getSpeed();          
        }
      
        break;

      case NAZA_MESSAGE_COMPASS:

        iob_heading = (float) NazaDecoder.getHeading();
        break;

    }
  }
  
  update_FrSky();

}
Jo, alternativ habe ich auch schon mal ne SD nach Micro-SD Adapterkarte als Kartenslot umfunktioniert, einfach untem am SD Adapter die Kabel zum Arduino angelötet.



wobei mittlerweile die Adapter ja problemlos und billig zu bekommen sind.


http://www.ebay.com/itm/Micro-SD-St...igital_Camera_Accessories&hash=item3f2d6f4fbe
 
Zuletzt bearbeitet:

aargau

Erfahrener Benutzer
#10
Jap hab es gesehen, extrem einfach, aber darauf muss man erst mal kommen ^^
ich habe auch schon mit dem Gedanken gespielt mit dem Naza Decoder die Daten nach MAVLink zu wandeln und dann mit einem zweiten Arduino mit der anderen Lib die Daten umzuwandeln. Aber wie man sieht, viel zu weit gedacht ^^
Ich werde den Code für mich nun noch so erweitern, dass man eine Kamera per IR auslösen kann, dann hab ich alles in einem Arduino ;)
 

aargau

Erfahrener Benutzer
#11
Hi Frickler

Hab das ganze mal kurz für meinen pro micro umgeschrieben, welchen ich schon im Copter verbaut habe.
Heisst eigentlich nur aus Serial Serial1 gemacht, da der pro micro zwei serielle Schnittstellen hat und die 1. nur via USB erreichbar ist.

Nun habe ich zwar auf dem Display Daten, jedoch werden die koordinaten falsch angezeigt: 0° 47.5427 und die N/S W/E wird mir auch nur mit einem komischen Zeichen dargestellt.
Hast du ev. eine Idee? Ich denke im Code werden die Koordinaten nicht in Grad Minuten umgewandelt, wodurch die Taranis die Daten falsch anzeigt.
Habe mir aber den Code jetzt noch nicht so genau angesehen. Falls du spontan keine Idee hast werde ich den sonst morgen mal durchkämmen ^^
Ich meinte nur, dass ich mit der alten jD IOBoard Version eben auch das selbe Problem mit meinem APM gehabt habe und dies erst durch das flashen der neusten hex (für welche der Sourcecode nicht mehr verfügbar ist) geklappt hat.

Jetzt fehlt nur noch das Auslesen der LiPo Zellen und ein Stromsensor :D
 

aargau

Erfahrener Benutzer
#12
Habe mir das mal genauer angesehen. Liegt ziemlich sicher, daran, dass es nicht als Grad Minuten übertragen wird. Zudem wird wie ich es sehe N/S / W/E nicht übertragen. Für die Taranis wird das aber wohl gebraucht, dass es korrekt funktioniert.

Werde mich sonst am WE mal dahinter setzen und da was schreiben, dürfte keine grosse Sache werden ^^
 
#13
Mmmh da muss ich nochmal schauen, ich hatte bei mir in der 9x die Daten am Display mit denen auf dem Tel. das mit GPS daneben lag verglichen, schien mir zu passen.
Ich glaube man kann das aber auch in der Funke einstellen wie die GPS Daten gehandelt werden.

Hier mal die Doku was FrSky erwartet:
http://www.google.de/url?sa=t&rct=j...msok9xoJm1TSH4A&bvm=bv.66330100,d.d2k&cad=rja

Code:
DataID Value, Meaning,   ﹡Form,                Note
0x12,            Longitude,  dddmm.mmmm , Before “.”
0x12+8                                                 After “.”
0x1A+8         E/W
0x13             Latitude     ddmm.mmmm    Before “.”
0x13+8                                                 After “.”
0x1B+8         N/S
und was die FrSky lib zusammenbaut:
Code:
//Little Endian exception
case 0x12: // Longitude, before "."
outBuff[payloadLen + 0] = 0x12;
outBuff[payloadLen + 1] = FixInt(long(iob_lon),1);
outBuff[payloadLen + 2] = FixInt(long(iob_lon),2);
addedLen = 3;
break;
case 0x12+8: // Longitude, after "."
outBuff[payloadLen + 0] = 0x12+8;
outBuff[payloadLen + 1] = FixInt(long((iob_lon - long(iob_lon)) * 10000.0), 1); // Only allow .0000 4 digits
outBuff[payloadLen + 2] = FixInt(long((iob_lon - long(iob_lon)) * 10000.0), 2); // Only allow .0000 4 digits after .
addedLen = 3;
break;
case 0x1A+8: // E/W
outBuff[payloadLen + 0] = 0x1A+8;
outBuff[payloadLen + 1] = iob_lon_dir;
outBuff[payloadLen + 2] = 0;
addedLen = 3;
break;


//Little Endian exception
case 0x13: // Latitude, before "."
outBuff[payloadLen + 0] = 0x13;
outBuff[payloadLen + 1] = FixInt(long(iob_lat),1);
outBuff[payloadLen + 2] = FixInt(long(iob_lat),2);
addedLen = 3;
break;
case 0x13+8: // Latitude, after "."
outBuff[payloadLen + 0] = 0x13+8;
outBuff[payloadLen + 1] = FixInt(long((iob_lat - long(iob_lat)) * 10000.0), 1);
outBuff[payloadLen + 2] = FixInt(long((iob_lat - long(iob_lat)) * 10000.0), 2);
addedLen = 3;
break;
case 0x1B+8: // N/S
outBuff[payloadLen + 0] = 0x1B+8;
outBuff[payloadLen + 1] = iob_lat_dir;
outBuff[payloadLen + 2] = 0;
addedLen = 3;
break;
und was die Naza Lib liefert:
Code:
double lon;     // longitude in degree decimal
double lat;     // latitude in degree decimal
evtl muss man da noch konvertieren, stimmt, ist wie gesagt noch Prototyp und Verbesserungen werden gerne genommen.
 
Zuletzt bearbeitet:

aargau

Erfahrener Benutzer
#14
Hi
Ich denke bei der 9x passt das so schon, bei der alten jD IOBoard Version wurden die Daten auch noch in Dezimal übertragen. Für die Taranis passt das aber wohl so nicht mehr, bei meinem Projekt musste ich die Daten auch erst umwandeln.
Das ist aber kein Problem, die Funktion habe ich ja schon, denke mal die muss man nur reinkopieren und zwei drei Änderungen noch machen.
Wir finden sicher eine Lösung ^^
 
#15
Fein, klingt gut!

Wobei es mit wundert das das Protokoll bei der Taranis anders sein soll. Der alte Sensor Hub sollte doch hier auch noch funktionieren oder?

und iob_lat_dir und iob_lon_dir hab ich tatsächlich nicht gesetzt, ups!
 

aargau

Erfahrener Benutzer
#17
Fein, klingt gut!

Wobei es mit wundert das das Protokoll bei der Taranis anders sein soll. Der alte Sensor Hub sollte doch hier auch noch funktionieren oder?

und iob_lat_dir und iob_lon_dir hab ich tatsächlich nicht gesetzt, ups!
naja ich denke nicht anders, aber deine 9x wird wohl einfach die Daten anzeigen die sie bekommt, die Taranis erwartet wohl genau das Format wie im Datenblatt, wird ja auch mit 47° 12.41231" angezeigt, bei dir wohl einfach 47.1241232 ?

So oder so, wenn es dann mal sauber überall klappt ist das einfach eine super Lösung, die kaum was kostet.
 
#18
Ja, das ist durchaus möglich, ich hatte nur fix geschaut das die "Ziffern" stimmten, gut möglich das die Grad/Minuten Trenner nicht da waren.
 

DerCamperHB

Erfahrener Benutzer
#19
Bei der Taranis kann man das GPS umstellen, zwischen Nmea und HMS

Da ich aber kein passendes GPS habe, kann ich nicht sagen, ob dabei nur die Anzeige umgestellt wird, oder auch/nur die Eingangsauswertung
 

aargau

Erfahrener Benutzer
#20
Ist nur die Anzeige auf dem Display, entweder hast du Grad Minuten oder Grad Minuten Sekunden, wird aber immer von Grad Minuten ausgehend umgerechnet.

Ich habe es gestern abend geschafft, der Code ist soweit mal umgeschrieben, die Daten werden mir jetzt korrekt angezeigt. Jedoch "spinnt" die Himmelsrichtung immer noch herum, ab und zu erhalte ich "komische" Zeichen.
Werde heute Abend oder sonst sicher morgen Abend nochmals dahinter und den Code auch noch etwas ausmisten (momentan wird viel übertragen, was es gar nicht gibt). Werde ihn dann uploaden.

20140508_195105.jpg
 
RCLogger

FPV1

Banggood

Banggood

Oben