Projekt Open-Source Antennentracker No.2

Status
Nicht offen für weitere Antworten.
#21
Ja super.
Vorerst würde mir aber auch ein einfacher Ansatz reichen wie du das GPS Signal runterrechnest damit ich mal schauen kann, ob man das in das DIY OSD noch integrieren kann
 

muerzi

Erfahrener Benutzer
#22
@Lonestar
Ich könnte dir ne Platine ätzen/fräsen...

Wie wärs, wenn wir das "Open Source Audio Telemetry Protocol" von Melih in das DIY OSD implementieren würden?


Nachfolgende Codes stammen von Melih

Calibrating a PWM generator for 2100Hz carrier wave (for Atmega328)
Code:
TCCR1B   =   0x00;   //stop timerTCNT1H   =   0;TCNT1L   =   0;
ICR1   =   ((Xtalfrequency/8) / 2100);   //2100hz carrier generator value 878 for 14.7Mhz
OCR1B   =   ((Xtalfrequency/8) / 2100)/2;   // ICR1 / 2 for %50 PWM waves
TCCR1A   =   0x22;   
TCCR1B   =   0x1A; //start timer
Code:
modem_bit = 0;while (modem_bit<18) //wait for all bit waves        {
                 
        if ((modem_bit%2==0) && ((PINB & (1  2))) ) // wait for 1 on PWM output. 
          {
          if (modem_bit==0)  // start bit
                 {
                 TCNT1H = 1;   // this values creates small delay for increasing the wave width
                 TCNT1L = 180; // and AFSK decoder can detect this big waves to 1, other small(2100hz) waves 0
                 }
                

           if (modem_bit>1)

                 {

                 if (modem[modem_byte] & (1((modem_bit-2)/2))) // if bit of bte is 1, change the wave width for 1 on AFSK

                   {

                   TCNT1H = 1;   // this values creates small delay for increasing the wave width

                   TCNT1L = 180; // and AFSK decoder can detect this big waves to 1, other small(2100hz) waves 0

                   }

                 }

                 

          modem_bit++;

          }



        if ((modem_bit%2==1) && (!(PINB & (1  2)))) // wait for 0 on PWM output  

          {   

          modem_bit++;

          }

        }
Der Originalbeitrag lässt sich hier finden.

Was haltet ihr davon?

btw: zum Thema Schleifring: Gibts im Nachbarforum einen Interessanten Beitrag
 

Lonestar78

Erfahrener Benutzer
#23
@jflyer:

Ich benutze tinyGPS auf dem Arduino (http://arduiniana.org/libraries/tinygps/), um die GPS-Strings auszulesen.
Dann werden nur noch Longitude und Latitude als jeweils 32bit float und Hoehe als als 16bit Integer übertragen, macht 10byte pro Zyklus.

Bei nem 10Hz GPS sind dass dann effektiv 100byte/s = 800bit, da bleibt noch Platz für Checksummen und Trennzeichen.

Komplett gelöst hab ich das noch nicht.

Grüße
C
 

Lonestar78

Erfahrener Benutzer
#24
Sodele, Statusupdate:

Hab das arduino pro mini direkt in das Gehäuse vom FrSky D8R-II eingebaut, passt saugend :)

Datendownlink funktioniert jetzt auch, allerdings hab ich erwartungsgemäß ungültige Frames. Die lassen sich sauber aussortiern, das Eizige, was jetzt noch fehlt, ist das Zusammensetzen der Datenpakete.....

Grüße
 

Rangarid

Erfahrener Benutzer
#25
So und ich hab mal nen Schleifring gefunden, der billig ist:
http://www.ebay.de/itm/290643713362

Kostet knapp 12€. In der Preislage gibt es bei ebay wohl noch mehrere. Frage ist halt ob die was taugen.

Technische Daten sehen jedenfalls ganz ok aus: 220V, 2A pro Leitung usw...

Dabei steht noch folgendes:
Typical Application:
-CCTV Monitoring System ;
-Electrical test equipment;
-Medical equipment
-Robotics;
Für den Preis wärs mal n Versuch wert, oder? Denke dass ich es auch mal über FrSky Telemetrie versuche. Damit hat man ja quasi alles da was man braucht...
 

Lonestar78

Erfahrener Benutzer
#26
Hmm, also so toll sieht der Schleifring nicht aus. Antrieb geht so nur indirekt über Zahnrad oder Riemen. Oder hast du da ne andere Idee?
Andererseits, Du hast schon recht. Kaufen und probieren...


Zum Thema FrSky: seit gestern abend funktioniert das Senden von 2xfloat+1x int mit Sicherstellung der Paketgültigkeit. Damit sind Höhen- und Breitengrad und Flughöhe übertragen. (Frequenz: alle 72ms)...

Ich denk mal, zwischen Weihnachten und Sylvester müsste ich den Code soweit fertig bekommen.

Grüße
C
 

DerCamperHB

Erfahrener Benutzer
#27
Nutzt du zur Übertragung das Telemetrie Protokol, das auch der Hub eingesetzt werden kann?

Wie hast du die Anbindung gemacht, der Empfänger hat doch normale rs232 Pegel?
 

Lonestar78

Erfahrener Benutzer
#28
Jupp, ich nutze das Protokoll.
Die Anbindung am Empfänger ist einfacher als am Boden/Sender (da geht NUR RS232 level, da muss zwischen Arduino und FrSky dann ein MAX232 oder so).
Am Empfänger geht entweder RS232 level oder inverted TTL.
Inverted TTL kann man bei Arduino mit der NewSoftSerial Library einfach per Software machen.

Das funzt einwandfrei.....
 

DerCamperHB

Erfahrener Benutzer
#29
und wo schlisst du das dran, oder geht das an der nach außen geführte TX/RX?

Habe nur den 6 Kanal, bisher lohnte sich der 8 Kanal noch nicht
hast du mal versucht, ob die Update Leiste von den kleineren Empfängern auch geht, oder geht es nur beim 8 kanal
 
#30
Wo hast du die FrSky Protokollinformationen her ?
Ich werde irgendwie nicht richtig schlau wenn ich sowas hier sehe:

7E
FE
69
7D
5E
63
C5
7E
FE
69
7D
5E
63
C5
0

Eigentlich soll ja jedes Segment mit 7E, FE anfangen und 11 Bytes lang sein. Der Anfang ist richtig, aber 11 Bytes ist es scheinbar nicht lang.
 

Lonestar78

Erfahrener Benutzer
#31
Also ich hab nur den 8-Kanal.
Ideal ist das nicht...
Anschluss: der 8-Kanal hat eine Stiftleiste mit TX RX G, die hab ich ausgelötet und dann direkt mit dem Arduino verlötet....
Bilder kommen, wenn ich aus dem Vorweihnachtsstress raus bin.

Perfekt wäre der 4-Kanal, der hat RSSI und CPPM, leider keine "serielle" Schnittstelle. Vieleicht per Lötkolben.....Muss mir mal einen bestellen.

Anbei ein PDF zum Protokoll. Nicht auf meinem Mist gewachsen, aber meine größte Hilfe...

Ansonsten mal ein kleiner Testcode auf der Fliegerseite (Also das Arduino, was vom Flieger GPS senden soll):

EDIT: Cool, bin jetzt FPV-Pilot -> 100ster Post ;-)))

Code:
#include <NewSoftSerial.h>

// Serial output to FrSky wit NewSoftSerial INVERTED
#define RXPIN_F 4
#define TXPIN_F 5
NewSoftSerial FrSkySerialout(RXPIN_F, TXPIN_F, true);

#define DEBUG 2

unsigned long fix_age;
float flat, flon, falt;
int intalt,framecounter;
char char_lat[4];
char char_lon[4];
char char_alt[2];
char gooddata;

long dt36ms,timenow,timeold36ms;

void setup()
{
  FrSkySerialout.begin(9600);
  framecounter=0;
  if(DEBUG>=1) Serial.begin(9600);
  
  flat = 1.234;
  flon = 5.678;
  falt = 333.888;
  intalt = falt;
  gooddata='Y';
}

void loop()
{

  memcpy(char_lat, &flat, sizeof (flat));
  memcpy(char_lon, &flon, sizeof (flon));
  memcpy(char_alt, &intalt, sizeof (intalt));
 
  timenow = micros();
  dt36ms = timenow - timeold36ms;
  // 36ms Loop
  if(dt36ms > 36000)
  { 
    if(framecounter%2==0)
    {
      FrSkySerialout.print("X");
      for(int i=0;i<4;i++) FrSkySerialout.print(char_lat[i]);
      FrSkySerialout.print(char_lon[0]);
    }
    if(framecounter%2==1)
    {
      for(int i=1;i<4;i++) FrSkySerialout.print(char_lon[i]);
      for(int i=0;i<2;i++) FrSkySerialout.print(char_alt[i]);
      FrSkySerialout.print(gooddata);
    }
    framecounter++;
    if(framecounter==32) framecounter=0;
    timeold36ms = micros();
  }
}
 

Anhänge

DerCamperHB

Erfahrener Benutzer
#32
Lonestar haben wird der sicher eine, die 4Polige Update Schnittstelle
Die Frage ist nur, ist damit nur das Update möglich, oder kann man die auch zur Kommunikation nutzen
 

Lonestar78

Erfahrener Benutzer
#33
Kleines Update:
Anbindung Arduino an Dragon OSD zum Abgreifen des GPS-Signals tut jetzt. Hatte ein paar Probleme, weil das Dragon OSD die GPS NMEA Strings leider mit 115,2kbit/s ausgibt im Pass Through Modus. Das schafft die NewSoftSerial nicht.
Also siehts jetzt so aus:
DragonOSD --- HW Serial - Arduino - SoftSerial --- FrSky RX

GPS encoding tut im Code :))) Übertragung tut sauber...

Was bleibt noch? In der Groundstation Firmware muss jetzt eigentlich nur noch die Umrechnung der GPS-Daten in Antennenrichtung erfolgen, Bedienkonzept für Reset und Home-Position ist gemacht...

Wenn alles fertig ist, wirds wohl ein länglicher Post....
zum Weihnachtsgeschenk wirds aber wohl nicht ganz reichen.
 

Lonestar78

Erfahrener Benutzer
#35
Anbei der Code für den Arduino, der GPS vom Dragon OSD entgegen nimmt, auf das Wesentliche komprimiert und dann ans FrSky-System im Flieger übergibt.

Code:
#include <NewSoftSerial.h>
#include "TinyGPS.h"

// Define TinyGPS parser
TinyGPS gps;

#define DEBUG 1

// Serial input from GPS with HW Serial, due to timing limits at high data rates
#define SERIALSPEED 115200

// Serial Debug-Output
#define RXPIN_G 3
#define TXPIN_G 2
NewSoftSerial serialDebugOut(RXPIN_G, TXPIN_G);

// Serial output to FrSky wit NewSoftSerial INVERTED
#define RXPIN_F 4
#define TXPIN_F 5
NewSoftSerial FrSkySerialout(RXPIN_F, TXPIN_F, true);

unsigned long fix_age;
float flat, flon, falt;
int intalt,framecounter;
char char_lat[4];
char char_lon[4];
char char_alt[2];
char gooddata;

long dt36ms,timeold36ms;

void setup()
{
  serialDebugOut.begin(SERIALSPEED);
  FrSkySerialout.begin(9600);
  Serial.begin(SERIALSPEED);
  framecounter=0;
  timeold36ms=0;
  
  flat = 1.234;
  flon = 5.678;
  falt = 333.888;
  intalt = falt;
}

void loop()
{
  if (Serial.available())
  {
    uint8_t c = Serial.read();
    if(DEBUG==1) serialDebugOut.print(c);
    if (gps.encode(c))
    {
      gps.f_get_position(&flat, &flon, &fix_age);
      falt = gps.f_altitude(); // +/- altitude in meters
      intalt = falt;
      if(fix_age <= 1000)
      {
        gooddata='Y';
        if(DEBUG==2)
        {
          serialDebugOut.print(flat);
          serialDebugOut.print(" ");
          serialDebugOut.print(flon);
          serialDebugOut.print(" ");
          serialDebugOut.println(intalt);
        }
      }
      else
      {
        gooddata='N';
      }
    }
  }


  dt36ms = micros() - timeold36ms;
  // 36ms Loop
  if(dt36ms > 36000)
  { 
    memcpy(char_lat, &flat, sizeof (flat));
    memcpy(char_lon, &flon, sizeof (flon));
    memcpy(char_alt, &intalt, sizeof (intalt));
    if(framecounter%2==0)
    {
      FrSkySerialout.print("X");
      for(int i=0;i<4;i++) FrSkySerialout.print(char_lat[i]);
      FrSkySerialout.print(char_lon[0]);
    }
    if(framecounter%2==1)
    {
      for(int i=1;i<4;i++) FrSkySerialout.print(char_lon[i]);
      for(int i=0;i<2;i++) FrSkySerialout.print(char_alt[i]);
      FrSkySerialout.print(gooddata);
    }
    framecounter++;
    if(framecounter==32) framecounter=0;
    timeold36ms = micros();
  }
  
}
 

DerCamperHB

Erfahrener Benutzer
#36
Du solltest den RAW nicht über das BEC Speisen, so trennst du noch mögliche Störungen durch die Servos

Bei den LEDs sind doch hoffentlich 5V LEDs, bzw du hast die Widerstände vergessen einzuzeichnen

Für was sind die Taster/Schalter?
Werden die nicht normal mit Masse geschaltet?
 

Lonestar78

Erfahrener Benutzer
#37
Zur BEC-Versorgung: Stimmt. Macht bei mir zwar keine Probleme, aber eine saubere 5V-Versorgung getrennt von den Servos kann man natürlich leicht machen.

Zu den LEDs: jupp, sind LEDs mit eingebautem Vorwiderstand. Fehlt in der Skizze.

Zu den Tastern: Ganz normale Taster, die offen sind, falls nicht gedrückt...
Zur Verschaltung zb auch hier: http://www.freeduino.de/books/arduino-trifft-processing/taster
 

Lonestar78

Erfahrener Benutzer
#39
** UPDATE IN POST 34. Schema um Vorwiderstandhinweise und Filter ergänzt. **

Aktuelles Funktionsprinzip:

Es gibt ne gote,gelbe und grüne LED. Dazu nen roten und gelben Taster, sowie ein Poti.

Nach dem Einschalten leuchtet erstmal nur die grüne LED dauerhaft, sobald gültige GPS-Pakete durchkommen blinkt sie.
Norden wird automatisch dauerhaft mit 10Hz über das Magnetometer gefiltert bestimmt (filtern mit gleitendem mittelwert, damit keine Sprünge auftreten).
Sollte es hier Abweichungen vom "echten" Norden geben, läßt sich dass immer per Poti nachstellen.

Wenn die rote Taste kurz gedrückt wird, wird aus 10 GPS-Paketen die home-Position des Trackers bestimmt. Hierzu muss der Flieger natürlich neben dem Tracker liegen. Dabei blinkt die rote LED und ist nach home-Findung dauerhaft rot. Der Vorgang ist wiederholbar.

Über den gelben Taster kann man dann drei Zustände des Trackers cyclen:
Gelbe Led aus: Antenne zeigt in die mechanisch gewünschte Transportstellung.
Gelbe Led an: Antenne zeigt nach Norden (das ist quasi ein Test).
Gelbe Led blinkt: Tracking ist aktiv, Antenne zeigt auf Flieger.

Reset des Trackers erfolgt über dern Ein/Aus-Schalter der Stromversorgung.

Debug-Informationen werden über die nach aussen geführte serielle Schnittstelle ausgegeben. Über die kann man auch bequem, ohne den Tracker zu öffnen, neue Firmwares einspielen....
 

DerCamperHB

Erfahrener Benutzer
#40
Würde eher Vorschlagen, den Arduino ohne BEC direkt zu versorgen, hat ja keine Leistung hinter zu hängen, das schafft der Interne Spannungsregler besser alleine

Schön wäre es natürlich, wenn das Trackingprogramm noch auf den Copter Arduino passt, nur würde der wohl irgendwann am Ende seiner Kapazität kommen
 
Status
Nicht offen für weitere Antworten.
FPV1

Banggood

Oben Unten