RSSI - Antennen Tracker mit 2 x 6T Helix

Hallo

Im Netz habe ich diesen Beitrag über einen Tracker gefunden:
https://www.instructables.com/id/Arduino-FR632-RSSI-Antenna-Tracker/

und auch gebaut.
Funktioniert und trackt sehr gut.
Mit 25mW Sendeleistung im Copter bin ich schon 1000m weit geflogen.

index.jpg

2 x Helix 6Turn
Servo 180° Grad, ergibt mit 60° Winkel der Helix eine Abdeckung von min. 240° Grad
Arduino Micro Pro
Empfänger: RX5808 Pro 5.8G 40CH Diversity FPV Receiver
Interner 3S Akku
20mW Sender zur Video-Weitergabe an FPV-Brille

Da ich aber keine großen Programmierkenntnisse habe, würde ich gerne den Arduino-Code ein wenig besser verstehen.
Den Code zum Tracker gibt es hier:
https://github.com/andreiva/simple-rssi-antenna-tracker/blob/master/simple-rssi-antenna-tracker.ino

Wäre super, wenn sich hier jemand finden würde, der den Code noch ein wenig weiter kommentieren könnte.

Viele Grüße
Jochen Causemann
 

rubberduck

User gesperrt
hallo,
hier im RCN-Forum (ohne das Forum kritisieren zu wollen), ist vielleicht nicht gerade der richtige Ort für deine Frage, eher in der FPV-Community. Da wirst du sicher auf reichlich Interesse stossen.
Kopter und FPV sind hier wenig vertreten, daran besteht hier bei RCN wohl wenig Interesse.

Gruss
Jürgen
 
Hallo Dieter
Ich habe früher recht viel mit PHP gemacht, aber eher prozuderal.

Letztendlich würde ich gerne wissen, an welchen tellen ich das Verhalten des Trackers verändern/anpassen kann.

#define SERVO_MAX_STEP 5
Wenn ich diesen Wert verringere, bewegt sich das Servo langsamer

Mich würde interessieren, warum.

float x = float(avgRight - avgLeft) / 10;
x = SERVO_MAX_STEP / (1+ exp(-SIGMOID_SLOPE * x + SIGMOID_OFFSET));
ang = x * SERVO_DIRECTION * -1;
#endif
#if defined(SIGMOID)

Aber da hört es bei mir schon auf.


#define SERVO_MIN_STEP 0.09
Habe ich noch nichts mit gemacht, würde mich aber interessieren.


Das Lesen hier
https://www.arduino.cc/en/Reference/Servo
bringt mich auch nicht weiter.

Natürlich weiß ich, das ich für grundsätzliches Verständnis bez. C ganz vorne anfangen sollte.
Aber ich möchte "nur" ein wenig mit dem Tracker rumspielen. Weil er schon so gut funktioniert.

Viele Grüße
Jochen Causemann



 
Hallo Jochen,

das normale Vorgehen in Arduino ist, dass der Code in den Libs objektorientiert ist
und dieser im sogenannten Sketch vom User prozedural verwendet wird.

Der Code startet in einem C oder C++ Programm mit Ausführen der Funktion main()
Diese Funktion wird von Arduino internalisiert und vom User verborgen. In main() wird
hier per Konvention in einer Schleife ständig die Funktion loop() aufgerufen so schnell es die
MCU hergibt.

In Deinem Programm werden die Libs Timer und Servo verwendet.
Hier wird in loop() nur die Methode
Code:
timer.update();
aufgerufen. Das tackert den Code in der Timer Lib vorran.

Das Objekt timer ist hier
Code:
timer.every(50, mainLoop);
timer.every(5, measureRSSI);

so eingerichtet, das alle 50ms die Funktion main_loop() und
alle 5ms die Funktion measureRSSI() aufgerufen werden soll.
Der Code der Timer Lib schaut also bei jedem Aufruf von timer.update
auf die Uhr und führt die Funktionen bestmöglich zeitlich passend aus.

Die Zeilen die in C oder C++ mit # beginnen sind sogenannte
Präprozessor Direktiven. Hier werden zur Compilierzeit Entscheidungen
getroffen. Z.B. Code nur berücksichtigt wenn etwas "defined" ist oder
im Fall von sogenannten Makros Wörter mit Zahlen ersetzt ohne zur Laufzeit
Speicher zu brauchen.

Bei
Code:
#define SERVO_MAX_STEP 5

Wird dann in
Code:
    float x = float(avgLeft - avgRight) / 10;
    x = SERVO_MAX_STEP / (1+ exp(-SIGMOID_SLOPE * x + SIGMOID_OFFSET));
    ang = x * SERVO_DIRECTION;

SERVO_MAX_STEP vor dem Compilieren durch 5 ersetzt.


Das Prinzip:

In der Funktion measureRSSI() werden die jeweils aktuellen
RSSI Werte der linken und rechten Antenne vom AD Wandler
gelesen und in zwei Arrays geschoben. Das heißt die Werte
in den Arrays werden eins aufgerückt und die neuen Werte an
die Spitze geschrieben.

In main_loop() wird dann aus allen Werten eines Arrays der Durchschnitt
gebildet (moving average) und die Entscheidung getroffen ob nicht doch
besser ein definiertes Minimum als Durchnitt genommen wird.

Code:
  uint16_t avgLeft = max(avg(rssi_left_array, FIR_SIZE) + RSSI_OFFSET_LEFT, RSSI_MIN);
  uint16_t avgRight = max(avg(rssi_right_array, FIR_SIZE) + RSSI_OFFSET_RIGHT, RSSI_MIN);

Mit dem per #define aus gewähltem Algorithmus wird dann der Winkel ausgerechnet den
das Antennenarray in die bessere Richtung gedreht werden soll.
Dieser Winkel ist natürlich SERVO_MAX_STEP direkt proportional.

Code:
    float x = float(avgLeft - avgRight) / 10;
    x = SERVO_MAX_STEP / (1+ exp(-SIGMOID_SLOPE * x + SIGMOID_OFFSET));
    ang = x * SERVO_DIRECTION;

Wenn man weiß dass exp(bla) e hoch bla bedeutet kann man auch die ganze Formel
mathematisch hin schreiben. Der Rest ist dann Physik resp. Regelungstechnik.

Gruß
Dieter
 
Hallo Dieter
Vielen Dank für Deine sehr ausführliche und kompetente Antwort.
Jetzt ist ein wenig Licht im Dunkel.

1. Man braucht fundierte C-Kenntnisse
2. und ev. hier noch wichtiger: Mathe und Regelungstechnik

Da beides bei mir nur rudimentär vorhanden ist, werde ich den Tracker "nur" benutzen wie er ist und mich daran freuen, daß er so gut funktioniert.
Nur an
#define SERVO_MIN_STEP 0.09
werde ich noch ein wenig herum spielen.

Vielen Dank nochmals

Viele Grüße
Jochen Causemann
 
Gute Entscheidung, den RX5808 und nicht den empfohlenen FR632 zu nehmen. Den habe ich nämlich auch, die Empfangsqualität war von Anfang an ziemlich miserabel, nach einem Jahr Benutzung hatte ich dann immer schwarze Streifen im Bild.
Hallo Jürgen
Danke für den Tip.
Habe ich gleich mal gemacht.
https://fpv-community.de/threads/rssi-antennen-tracker-mit-2-x-6t-helix.83949/

Viele Grüße
Jochen Causemann
Wie man anhand der Rückmeldungen in der FPVC sieht, ist auch dort nicht mehr viel los. Vor einigen Monaten wenigstens noch als Verkaufsbörse gebrauchbar aber auch das schläft da immer mehr ein. Die Leute mit Ahnung sind längst im englischssprachigen Bereich bei Entwicklerforen und weiterem verschwunden. Der Nachwuchs baut eh fast nur noch Racer und findet sich dann auch in diesen Foren. Dementsprechend flach werden dort jedoch die theoretischen Details diskutiert.

Es bringt also auch nichts mehr, noch weiter die FPVC zu empfehlen. Wenn du der englischen Sprache mächtig bist, würde ich immer direkt dort nachfragen, wo die Projekte vorgestellt werden.
 
Ansicht hell / dunkel umschalten
Oben Unten