Bassline Digital HD 2S toothpick FPV drone built-in Walksnail or HDZERO VTX
Etwa 48g, schwebt 4:30min an 2s 450mAh.
Die originalen Gemfan 2023 triblade props sind besser geeignet an den 11000kv Motoren.
Bassline Digital HD 2S toothpick FPV drone built-in Walksnail or HDZERO VTX
Etwa 48g, schwebt 4:30min an 2s 450mAh.
Die originalen Gemfan 2023 triblade props sind besser geeignet an den 11000kv Motoren.
I built a small 1s digital whoop with WalkSnail.
Based on a Mobula 7 frame, T-Motor F411 AIO 13A 1s, RcINpower 1002 motors with Gemfan 1610 props, BetaFPV ELRS lite and the Walksnail VTX lite.
It weighs 34g, a 1s Lipo 550mAh has 14g. Flight-time with Tattu 1s 500mAh is 3:15. The GNB claiming 550mAh are only at 2:45.
UART1 = ELSR, UART2 = WalkSnail (CRSF), the motors are directly soldered. I used the original BLHeli_32 suite to fix the motor directions. The canopy is from https://www.printables.com/de/model/504099-rotorriot-vision40-prints.
OSD activation is a bit tricky:
set osd_displayport_device = MSP
set displayport_msp_serial = 1
Complete Diff:
# diff all
# version
# Betaflight / STM32F411 (S411) 4.3.1 Jul 13 2022 / 03:32:52
(8d4f005) MSP API: 1.44
# config: manufacturer_id: TMTR, board_name: TMOTORF411,
version: edcd244b, date: 2022-06-29T02:24:46Z
# start the command batch
batch start
# reset configuration to default settings
defaults nosave
board_name TMOTORF411
manufacturer_id TMTR
mcu_id 003700413236510435383430
signature
# name: V40
# feature
feature -RX_PARALLEL_PWM
feature -LED_STRIP
feature TELEMETRY
# serial
serial 0 64 115200 57600 0 115200
serial 1 1 115200 57600 0 115200
# beeper
beeper -ON_USB
# beacon
beacon RX_LOST
beacon RX_SET
# map
map TAER1234
# aux
aux 0 0 0 1750 2100 0 0
aux 1 1 1 1700 2100 0 0
aux 2 13 2 1700 2100 0 0
aux 3 35 2 1750 2100 0 0
# master
set gyro_lpf1_static_hz = 0
set gyro_lpf2_static_hz = 0
set dyn_notch_count = 2
set dyn_notch_min_hz = 100
set dyn_notch_max_hz = 1000
set gyro_lpf1_dyn_min_hz = 0
set gyro_lpf1_dyn_max_hz = 750
set acc_calibration = 55,52,-4,1
set mag_hardware = NONE
set baro_hardware = NONE
set rc_smoothing_auto_factor = 80
set rc_smoothing_setpoint_cutoff = 25
set rc_smoothing_feedforward_cutoff = 25
set serialrx_provider = CRSF
set rx_spi_protocol = EXPRESSLRS
set dshot_bidir = ON
set motor_pwm_protocol = DSHOT300
set motor_poles = 12
set align_board_pitch = -4
set vbat_max_cell_voltage = 440
set ibata_scale = 400
set ibata_offset = -1700
set beeper_dshot_beacon_tone = 3
set yaw_motors_reversed = ON
set small_angle = 180
set pid_process_denom = 1
set simplified_gyro_filter_multiplier = 150
set osd_cap_alarm = 450
set osd_vbat_pos = 2432
set osd_link_quality_pos = 2048
set osd_tim_2_pos = 2080
set osd_throttle_pos = 2368
set osd_current_pos = 2464
set osd_mah_drawn_pos = 2528
set osd_display_name_pos = 0
set osd_warnings_pos = 14355
set osd_displayport_device = MSP
set debug_mode = GYRO_SCALED
set displayport_msp_serial = 1
set rpm_filter_harmonics = 2
set name = V40
profile 0
# profile 0
set vbat_sag_compensation = 100
set anti_gravity_gain = 10000
set iterm_relax_cutoff = 10
set p_pitch = 67
set i_pitch = 120
set d_pitch = 76
set f_pitch = 199
set p_roll = 64
set i_roll = 115
set d_roll = 67
set f_roll = 191
set p_yaw = 64
set i_yaw = 115
set f_yaw = 191
set d_min_roll = 67
set d_min_pitch = 76
set thrust_linear = 40
set feedforward_averaging = 2_POINT
set feedforward_smooth_factor = 45
set feedforward_jitter_factor = 10
set dyn_idle_min_rpm = 35
set simplified_master_multiplier = 160
set simplified_d_gain = 140
set simplified_pi_gain = 90
set simplified_dmax_gain = 0
profile 1
# profile 1
set dterm_lpf1_dyn_min_hz = 100
set dterm_lpf1_dyn_max_hz = 125
set dterm_lpf1_type = BIQUAD
set dterm_lpf2_static_hz = 0
set vbat_sag_compensation = 100
set anti_gravity_gain = 4500
set crash_recovery = ON
set iterm_relax_cutoff = 12
set p_pitch = 58
set i_pitch = 83
set d_pitch = 70
set f_pitch = 124
set p_roll = 56
set i_roll = 79
set d_roll = 61
set f_roll = 119
set p_yaw = 56
set i_yaw = 79
set f_yaw = 119
set d_min_roll = 52
set d_min_pitch = 59
set thrust_linear = 40
set dyn_idle_min_rpm = 60
set simplified_master_multiplier = 125
set simplified_i_gain = 80
set simplified_d_gain = 140
set simplified_dmax_gain = 50
set simplified_feedforward_gain = 80
set simplified_dterm_filter = OFF
profile 2
# restore original profile selection
profile 1
rateprofile 0
# rateprofile 0
set thr_mid = 42
set thr_expo = 30
set rates_type = BETAFLIGHT
set roll_rc_rate = 100
set pitch_rc_rate = 100
set yaw_rc_rate = 100
set roll_expo = 40
set pitch_expo = 40
set roll_srate = 80
set pitch_srate = 80
set yaw_srate = 80
rateprofile 1
# rateprofile 1
set rates_type = BETAFLIGHT
set roll_rc_rate = 80
set pitch_rc_rate = 80
set yaw_rc_rate = 80
set roll_expo = 40
set pitch_expo = 40
set roll_srate = 70
set pitch_srate = 70
set yaw_srate = 70
rateprofile 2
rateprofile 3
rateprofile 4
rateprofile 5
# restore original rateprofile selection
rateprofile 0
# save configuration
save
Es gibt einen neuen Tuning-Guide von Chris Rosser:
Chris schaltet alle Gyro-Lowpass-Filter ab, außer den dynamischen und die RPM-Filter. Nur einen D-Term-Lowpass und den dafür auf BIQUAD. Die Grenzfrequenzen hängen von der Coptergröße ab, ein 40mm bis 2″ sollte so 100 und 125Hz haben. Die Filter kann man im Blackbox-Explorer überprüfen.
Der Testflug sollte einige 100%-Throttle, Vollgas-Punchouts haben.
Vor dem Tuning stellt Chris den I-Regler auf 0.
Die Testflüge macht er im Angle-Mode, da in diesem Mode der Feedforward inaktiv ist.
Der Copter wird einfach im Schwebeflug gehalten und dabei schnell hin und her gewackelt und vor/zurück. Chris macht eine Serie an Reglerpositionen auf einen Akku und bewegt den Regler im OSD. Zuerst wird die Balance eingestellt. Chris fliegt ein paar PD-Balance-Werte, z.B. 0.3, 0.4, 0.5, 0.75, 1.0, 1.25 und 1.5.
Nach der Testflugreihe zieht er das Log auf den PC und analysiert es mit der PID-Toolbox mit der Step-Response (Sprungantwort). Ziel ist es, schnell auf 1.0 zu kommen ohne über zu schwingen.
Sobald die optimale Balance gefunden wurde, wird der Master-Gain eingestellt. Z.B. die Werte 1.0, 1.25, 1.5, 1.75 und 2.0. Sollte der Weg des Reglers nicht reichen (gerade bei kleinen Coptern), gibt es einen Trick: Man stellt die individuellen Regler für P und D auf jeweils das Doppelte und den Master wieder auf die Mitte.
Man kann diese zwei Schritte auch wiederholen, um die Balance bei hohem Mastergain noch besser einzuregeln.
Ich habe mich mit FF noch nicht so anfreunden können, das liegt evtl. daran, dass meine Quads nicht viel darauf reagieren. Ziel ist es, den Delay zwischen Stick-Input („Setpoint“) und Gyro-Sensor auf 0 zu bekommen, der Quad „erahnt“ quasi die Knüppelbewegungen (reagiert auf die Knüppelbeschleunigung). Das klappt nicht immer 100%ig.
Chris stellt den I-Regler wieder auf 1.0. Man kann mit ein paar Probeflügen noch den I-Anteil feintunen, wie gut der Quad bei Punchouts die Lage hält und in der PID-Toolbox die Achsen an der 1.0 kleben ohne träger zu werden. Das Tuningfenster ist aber recht groß.
Chris testet die Reglerwerte 1.0, 1.25 und 1.5. Sollte sich die Verzögerung nicht verbessern oder die Kurven kräftig gestört sein, sollte man wieder eine Stufe zurück gehen.
Chris empfiehlt unbedingt „Dynamic-Idle“ zu aktivieren. Der Wert hängt von der Leerlaufdrehzahl ab. Für kleine 40mm stellt er 94 ein, 2″ 75, 3″ 50, etc. Dyn.Idle RPM = ~15000/Propeller-Durchmesser in Zoll. Der Wert in BF ist dann diese RPM geteilt durch 100.
Dann stellt man noch die Rates und die RC-Filterung (RC-Smoothing) noch nach eigenen Vorlieben ein.
Ich empfehle auch noch „crash_recovery=on“.
Und Arming-Angle 180°.
Das Tuning hängt natürlich auch vom Akku ab, sollte man 2s,3s,4s,etc wild mischen, kann man die Presets nutzen und die automatische Umschaltung abhängig von der Zellenzahl „auto_profile_cell_count“. Auch Änderungen im Gewicht beeinflussen das Tuning (Gopro drauf oder nicht, großer Longrange-Lipo vs kleiner Lipo, etc)!
Ja, ich hab ihn noch.
Auf BF 4.2.9, mit neuen Einstellungen:
Crash_recovery=ON
Dynamic RPM-Filter und Bluejay 0.2.0 48kHz (ich hab das Crazybee F4 V3 Pro mit BLHeli_S F_H_40)
So LOS-Schweben klingt er unglaublich smooth und stabil. Bei leichten absichtlich ausgeführten Crashs in z.B. den Wäscheständer stabilisiert er sich sofort. Toll!
Als nächstes werden die Lipo-Stecker auf BT2.0 oder GNB27 ausgetauscht. Die Motorstecker bleiben, die kleinen 0802 sind doch recht schnell durchgenudelt…
ExpressLRS gibt’s 3.0
DJI FPV Goggles gehackt
Ich hab eine neue Fritzbox
Mein absoluter Lieblingsflieger Phenix hatte seit jeher um Gewicht zu sparen nur eine ziemlich miese Nebula Nano (v1).
Jetzt habe ich ihm die neue Nebula Pro Nano gegönnt, war im Angebot.
Der Stecker mit 8cm Kabel (zu kurz) kam vormontiert – ist halt für die Minicopter-Fraktion gedacht. Aber ich hab ja das lange Kabel im Flieger schon drin. Der Hersteller hat den Anschlusswechsel an der Kamera wohl nicht vorgesehen. Die Rückseite ist mit der Vorderseite verschraubt – löst man die 2 Schrauben
, fällt die Kamera komplett in 3 Teile, Sensor freiliegend. Also Achtung. Dazu kommt, der Stecker passt nicht durch das Loch in der Rückplatte, da muss man das Kabel kräftig verknicken und dann den Stecker quer durchschieben. Diese Prozedur wollte ich dem alten Kabel dann nicht zumuten und ich schnitt einen kleinen Schlitz in den Deckel. Den Stecker mit den Fingernägeln raus zu hebeln, ging dagegen recht einfach.Operation geglückt, viel besseres Bild!
Ich hab einen neuen Flieger gebaut.
Mit 80g und 500mm Spannweite ein eher kleines Exemplar. Ein kleiner Reaktionstrainer 🙂
Ausstattung:
2x EMAX ES9051 4,7g Servo (ca. 10€)
FrSky X4R-SB Empfänger
Brotherhobby Returner R3 1106-5100kv (13,16€)
HQProp 3025 Propeller
Sunrise 11A BLHELI_32 mit BEC ESC (ca. 12€)
Robbe Speedy Wing Kit (9,99€)
Trimmung:
Neutralstellung ca. 1-2mm tiefer als die Fläche.
Ausschläge ca. 10mm
Arduino on Lilygo OLED Lora ESP32 (board TTGO-Lora32-OLED V1″)
#define USE_OLED
#ifdef USE_OLED
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#endif
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
const char *ssid = "GPSWIFI";
const char *password = "12345678";
WiFiServer server(80);
const unsigned char ubxRate1Hz[] =
{ 0x06,0x08,0x06,0x00,0xE8,0x03,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate5Hz[] =
{ 0x06,0x08,0x06,0x00,200,0x00,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate10Hz[] =
{ 0x06,0x08,0x06,0x00,100,0x00,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate16Hz[] =
{ 0x06,0x08,0x06,0x00,50,0x00,0x01,0x00,0x01,0x00 };
// Disable specific NMEA sentences
const unsigned char ubxDisableGGA[] =
{ 0x06,0x01,0x08,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGLL[] =
{ 0x06,0x01,0x08,0x00,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGSA[] =
{ 0x06,0x01,0x08,0x00,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGSV[] =
{ 0x06,0x01,0x08,0x00,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableRMC[] =
{ 0x06,0x01,0x08,0x00,0xF0,0x04,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableVTG[] =
{ 0x06,0x01,0x08,0x00,0xF0,0x05,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableZDA[] =
{ 0x06,0x01,0x08,0x00,0xF0,0x08,0x00,0x00,0x00,0x00,0x00,0x01 };
#define Battadc 36
#define ADC_FACTOR (0.000635*2.0*1.362)
#define BATT_LOW 3.5
#define SDA 21
#define SCL 22
#ifdef USE_OLED
//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
#endif
bool enable_dbg;
bool sig_valid, sig_rxok;
float sig_speed, saved_spd;
int sig_sats;
#define NUM_V_ENTRIES 5
float maxspeed[NUM_V_ENTRIES];
int vbatt;
// Cut out the wanted substring from a comma-separated string
static String extract_val(char *buf, int len, int cpos)
{
String str="";
int i,cc=0,cs=0,ce=255;
for (i=0;i<len;i++) {
if (buf[i]==',') {
cc++; // count commas
if(cc==cpos) cs=i+1;
if(cc==cpos+1) {ce=i; break;}
}
else if (buf[i]=='*' || buf[i]=='\r')
ce=i;
}
if (cs == 0) // no comma seen - no result
return str;
int s = min(ce-cs, 255);
for (i=0; i<s; i++) // build string, could be nicer...
str+=(char)buf[cs+i];
// memcpy(tgt, &buf[cs], s);
return str;
}
void parse_gps(char c) {
static char buf[127];
static int pos=0;
if (c=='\n') {
buf[pos]=0;
if (buf[2]=='V' && buf[3]=='T' && buf[4]=='G') {
sig_rxok = true;
String s = extract_val(buf, pos, 7);
if (s.length() > 0)
sig_valid = true;
Serial.println(s);
sig_speed = s.toFloat();
saved_spd = sig_speed;
}
else if (buf[2]=='G' && buf[3]=='G' && buf[4]=='A') {
#ifdef USE_OLED
display.print(buf);
#endif
String s = extract_val(buf
, pos, 7);
Serial.println(s);
sig_sats = s.toInt();
}
}
else if (c=='$') pos=0;
else if (pos < sizeof(buf))
buf[pos++] = c;
}
//Warteschleife, die ankommende Daten vom GPS Modul verarbeitet und den Status des Tasters prüft
static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (Serial2.available()) {
char c=Serial2.read();
parse_gps(c);
if (enable_dbg) Serial.print(c);
//display.print(c);
}
//display.display();
} while (millis() - start < ms);
}
static void sendUBX( const unsigned char *progmemBytes, size_t len )
{
Serial2.write( 0xB5 ); // SYNC1
Serial2.write( 0x62 ); // SYNC2
uint8_t a = 0, b = 0;
while (len-- > 0) {
uint8_t c = ( *progmemBytes++ );
a += c;
b += a;
Serial2.write( c );
}
Serial2.write( a ); // CHECKSUM A
Serial2.write( b ); // CHECKSUM B
delay(100);
}
static void updateRate()
{
sendUBX(ubxRate5Hz, 10);
}
void setup() {
pinMode(0, INPUT_PULLUP); // button
pinMode(SCL, INPUT_PULLUP); // I2C of GPS compass
pinMode(SDA, INPUT_PULLUP);
// analogSetAttenuation(ADC_0db); // control sensitivity; ADC_11db, ADC_6db, ADC_2_5db, ADC_0db
// pinMode(Battadc, INPUT);
// adcAttachPin(Battadc);
Serial.begin(115200); // debug
Serial2.begin(9600,SERIAL_8N1,12,13); // GPS
#ifdef USE_OLED
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
//Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
#endif
// setup WIFI server
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP(); // usually 192.168.4.1
server.begin();
#ifdef USE_OLED
display.setTextColor(WHITE);
display.setTextSize(1);
display.clearDisplay();
display.setCursor(0, 0);
display.println("Simon's WIFI GPS");
display.println("IP address:");
display.println(myIP);
display.display();
#endif
delay(2000);
sendUBX(ubxDisableGLL, 12);
sendUBX(ubxDisableGSA, 12);
sendUBX(ubxDisableGSV, 12);
sendUBX(ubxDisableRMC, 12);
sendUBX(ubxDisableZDA, 12);
Serial2.print("$PUBX,41,1,0007,0003,19200,0*25\r\n");
Serial2.flush();
delay(100);
Serial2.end();
Serial2.begin(19200,SERIAL_8N1,12,13);
delay(1000);
updateRate();
}
void wifi() {
WiFiClient client = server.available(); // listen for incoming clients
if (client) { // if you get a client,
char i;
Serial.println("New Client."); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
// Serial.write(c); // print it out the serial monitor
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// the content of the HTTP response follows the header:
char tmp[32];
client.print("<html><head><meta http-equiv=\"refresh\" content=\"10; URL=/\" /></head>");
client.print("<body style=\"background-color:black;\"><h1 style=\"color:white;font-size:80px\">Simon's WIFI GPS</h1>");
client.println("<p style=\"color:white;font-size:60px\"><b>");
sprintf(tmp, "Max = %4.1f km/h", maxspeed[0]);
client.print(tmp);
client.println("</p><p style=\"color:white;font-size:30px\">");
for (i=1;i<NUM_V_ENTRIES;i++) {
sprintf(tmp, "%4.1f km/h", maxspeed[i]);
client.print(tmp);
client.println("<br>");
}
sprintf(tmp, "<br>Batt = %2.3f V", (float)vbatt*ADC_FACTOR);
client.print(tmp);
client.println("<br>");
sprintf(tmp, "<br>Signal rx ok = %d", sig_rxok);
client.print(tmp);
client.println("<br>");
sprintf(tmp, "<br># of satellites = %d", sig_sats);
client.print(tmp);
client.println("<br>");
client.print("<br><br><a href=\"/R\">RESET</a> Vmax.<br></p></body></html>");
// The HTTP response ends with another blank line:
client.println();
// break out of the while loop:
break;
} else { // if you got a newline, then clear currentLine:
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
// Check to see if the client request was "GET /H" or "GET /L":
if (currentLine.endsWith("GET /R")) {
for (i=0; i<NUM_V_ENTRIES; i++)
maxspeed[i] = 0.0;
}
}
}
// close the connection:
client.stop();
// Serial.println("Client Disconnected.");
}
}
void loop() {
int i;
bool spdwritten = false;
char tmp[32];
float spd;
smartdelay(0);
#ifdef USE_OLED
display.clearDisplay(); // drawString(x,y,text);? or ACROBOTIC_SSD1306 with setTextXY/putString
display.setCursor(0, 0);
#endif
if (sig_valid) {
spd = sig_speed;
sig_speed = 0.0;
// show maximum speed, with 5 places to see glitches
#ifdef USE_OLED
display.println("Geschwindigkeit (max)");
#endif
for (i=0; i<NUM_V_ENTRIES; i++) {
if (spd > maxspeed[i] && !spdwritten) {
maxspeed[i] = spd;
spdwritten = true;
break;
}
}
#ifdef USE_OLED
for (i=0; i<NUM_V_ENTRIES; i++) {
if (i==0)
display.setTextSize(2);
sprintf(tmp, "%4.1f km/h", maxspeed[i]);
display.println(tmp);
if (i==0)
display.setTextSize(1);
}
// show current speed
sprintf(tmp,"S%4.1f Sats %3d", saved_spd, sig_sats);
display.print(tmp);
} else {
display.println("No GPS fix.");
if (sig_rxok)
display.println("GPS RX ok");
sprintf(tmp," Sats %3d", sig_sats);
display.print(tmp);
#endif
}
vbatt = analogRead(Battadc);
#ifdef USE_OLED
if ((float)vbatt*ADC_FACTOR < BATT_LOW) {
display.setCursor(108, 32);
display.print("LOW");
}
display.display();
#endif
if (digitalRead(0)==0) { // clear
for (i=0;i<NUM_V_ENTRIES; i++)
maxspeed[i] = 0.0;
#ifdef USE_OLED
display.clearDisplay();
#endif
}
wifi();
}
Der VNA ist ja schön und gut, was die Abstimmung der Antennen betrifft.
Aber er sagt nur wenig über die Reichweite aus.
Daher kommt hier Test #2.
Aufbau: VNA auf 5800MHz mit der ImmersionRC CL als Testsender.
Daneben dann das ImmersionRC-Powermeter mit dem DUT.
Der Abstand wird in der stärksten „Keule“ so lange vergrößert
, bis das Messlimit von -40dBm erreicht ist. Dieser Abstand wird mit einem Lineal von Gehäuse zu Gehäuse gemessen und notiert.Klar, das hat sicher auch seine Fehler. Antennen werden immer von Antennengehäuse zu Gehäuse gemessen. Da sind lange Helix evtl im Nachteil.
Die Frequenz ist fix auf 5800 – das ist sicher nicht für alle Antennen das Optimum.
Die Reproduzierbarkeit ist gut. Wiederholtes Anschließen von Aomway CL und TrueRC X-Air zwischen den Tests zeigen immer die gleiche Entfernung.
Sender: ImmersionRC Spironet CL | Mehr = besser [cm] | Anmerkung |
AXII 2 CL lang | 9 | hat einen 90° SMA |
Aomway CL | 11 | |
Aomway CL | 7 | mit U.FL-Adapter |
Aomway CL #2 | 7 | |
CnG CL | 12 | |
Lum. Pagoda | 7 | |
Lum. Pagoda #2 | 9 | |
TBS Triumph Stubby | 9 | |
TBS Triumph | 7 | |
Hawkeye CL | 9 | |
rote Pagoda | 5 | |
UXII Stubby | 6 | |
TrueRC Singularity lang | 8 | |
Foxeer CL | 9 | |
CnG Helix 6 Windungen | 25 | |
AXII mini Patch 8.4dBi | 27 | mit Winkel |
TrueRC X-Air 10dBi | 26 | |
TrueRC X-Air 10dBi | 28 | mit Winkel |
Ethix Crosshair 10.25dBi | 23 | mit Winkel |
AXII Duo Patch 12.2dBi | 34 | mit Winkel |
Aomway Helix 8 Windungen | 22 | |
Aomway Triple 8dBi | 31 | |
Aomway Triple 8dBi | 19 | verlängert |
Realacc Triple 8dBi | 28 | |
Fatshark Big Patch 13dBi | 39 | Krass |
Furious Pokerchip 10dBi | 27 | |
Menace Invader 6.5dBi | 18 | |
Prodrone 3,5 Helix v2 8.8dBi | 34 | recht eng |
Prodrone Mi-Cross V2 9dBi | 24 | |
Prodrone v3 Extreem Cross-Air 10dBi | 27 | |
Furious Nano CL | 10 | U.FL |
Rush Cherry | 10 | U.FL |
TBS Triumph nano | 9 | U.FL |
Realacc Trident nano | 5 | U.FL |
TBS Dipol | 8 | U.FL |
noname Dipol dünn | 8 | U.FL |
noname Dipol dünn #2 | 8 | U.FL |
Eachine Dipol lang | 8 | U.FL |
Eachine Dipol kurz | 6 | U.FL |
Fazit:
Von den Omnis/CL beeindrucken die eine Aomway und die CnG (Chips&Grips-Selbstbau). Die meisten anderen schlagen sich aber auch ok. Wie stark die Abstrahlung ungleich verteilt ist, habe ich nicht getestet.
Die UXII-Stubby und rote China-Pagoda fallen durch. Auch die Realacc Trident ist Mist.
Mit dem U.FL-Adapter schlagen sich die Furious CL und die Rush Cherry sehr gut. Die Rush ähnelt optisch sehr der Caddx-Vista-Antenne (nur ist die LHCP).
Bei den Richtantennen bleibt die große Fatshark Patch der King. Aber diese Antenne ist groß, unpraktisch, muss verlängert werden (was den Gewinn wieder schmälert) und hat einen extrem kleinen Öffnungswinkel.
Der eigentliche Sieger ist daher die Lumenier AXII Duo Patch – mit kaum geringerer Reichweite, aber inklusive SMA-Winkel und großem horizontalen Öffnungswinkel. Sie ist auch eine der teuersten Antennen hier. Am VNA fällt auf, dass sie etwas niederohmig daherkommt, was vom Winkeladapter fast komplett kompensiert wird. Das fällt auch bei der anderen modernen Lumenier-Patch aus dem Long-Range-Kit auf. Da hat der Hersteller sich wohl Gedanken über die Benutzung in der Praxis gemacht. Die Zahlen geben ihm jedenfalls Recht!
Preis-Leistungs-Tipp bei den Patch-Antennen ist die Poker Chip von FuriousFPV. Die kostet knapp 10 Euro, klein ist sie auch. Das Design ist auch cool.
Enttäuscht bin ich von der Menace Invader, aber die gibt auch nur 6,5dBi Gewinn an. Die Ethix gewinnt auch keinen Blumentopf hier, in der 10dBi-Klasse spielt die nicht mit.
Die Triplefeeds sind ok, aber sperrig und mit Verlängerung leidet die Performance. Ich habe beide mit 50 Ohm am zweiten Anschluss terminiert.
Das mit dem fehlenden OSD bei DJI-Goggles-Recording ist schon schade.
Aber es gibt einen Workaround. Wenn man denn die Telemetrie in der Funke per SD-Log wegspeichert. Leider klappt das nur unter Windows…
Man nehme
Video und Telemetrie-Log auf PC kopieren.
Ablauf:
Meine Modifikationen:
Korrigiertes Matching der Geschwindigkeit und Höhe: