multiwii armen mit schalter mit gaskurve

-Ralf-

Erfahrener Benutzer
#2
Du kannst nur armen, wenn dein Gassignal unter MINCHECK (Default: 1100) ist.
Wenn du weißt, was du tust, kannst du das ändern. MINCHECK steht in der
MultiWii.h
 

wildflyer

wildflieger :-)
#3
hab ich probiert, aber damit verändern sich auch die stick commands.

im code steht doch sicher irgendwo drin, das beim armen das gas gecheckt werden muss. kann man nicht dort evtl diese fallunterscheidung einfach rauskommentieren ? wo steht der code fürs armen, also in welchem file usw ?

grüsse und danke für die hilfe

joachim
 

-Ralf-

Erfahrener Benutzer
#4
Ich bin mir nicht sicher .... du kannst (auf eigene Gefahr!!!!!) folgendes
in der MultiWii.cpp probieren. Such den folgenden Abschnitt:

Code:
    if (rcData[THROTTLE] <= MINCHECK) {            // THROTTLE at minimum
      #if !defined(FIXEDWING)
        errorGyroI[ROLL] = 0; errorGyroI[PITCH] = 0;
        #if PID_CONTROLLER == 1
          errorGyroI_YAW = 0;
        #elif PID_CONTROLLER == 2
          errorGyroI[YAW] = 0;
        #endif
        errorAngleI[ROLL] = 0; errorAngleI[PITCH] = 0;
      #endif
      if (conf.activate[BOXARM] > 0) {             // Arming/Disarming via ARM BOX
        if ( rcOptions[BOXARM] && f.OK_TO_ARM ) go_arm(); else if (f.ARMED) go_disarm();
      }
    }
Die letzte } schiebst du 3 Zeilen nach oben, also zwischen #endif und if(conf.activate.......

Das sollte dir ein ARM über Schalter erlauben (über Stick-Command nicht).
 
#5
Ich würde ja die Abfrage ändern statt gleich komplett (für Schalter) ausser Kraft zu setzen.
Ansonsten guckt man von oben auf den Copter, Throttle auf Anschlag und dann flippt der Schalter mal... der check hat schon seinen Grund.

Wenn der niedrigste THROTTLE Wert z.b. 1100 ist:

if (rcData[THROTTLE] <= 1100)

Entweder für Stick-Kombo und Box in einem (einfach das MINCHECK ersetzen) oder vielleicht sowas?
Code:
    if (rcData[THROTTLE] <= MINCHECK) {            // THROTTLE at minimum
      #if !defined(FIXEDWING)
        errorGyroI[ROLL] = 0; errorGyroI[PITCH] = 0;
        #if PID_CONTROLLER == 1
          errorGyroI_YAW = 0;
        #elif PID_CONTROLLER == 2
          errorGyroI[YAW] = 0;
        #endif
        errorAngleI[ROLL] = 0; errorAngleI[PITCH] = 0;
      #endif
    }
    if (rcData[THROTTLE] <= 1100) {
      if (conf.activate[BOXARM] > 0) {             // Arming/Disarming via ARM BOX
        if ( rcOptions[BOXARM] && f.OK_TO_ARM ) go_arm(); else if (f.ARMED) go_disarm();
      }
    }
Ich würde davon aber eigentlich komplett die Finger lassen.

Edit: Wozu hat man an einem Copter eine Gaskurve die nicht bei Null anfängt?
 
Zuletzt bearbeitet:

-Ralf-

Erfahrener Benutzer
#6
Kann man so machen ..... nur hat dieser Code-Abschnitt keinen Einfluß auf das
Armen via Stick .... der obere Teil hält nur die I-Anteile auf 0 (kein Aufsummieren),
solange Leerlauf anliegt.
 
#7
Äh, huch... jetzt wo du es sagst... kommt davon wenn man das nebenbei macht. :rolleyes:
Habe aber ehrlich gesagt auch keine Ahnung vom MWC.

Dann bei dem Teil einfach vergessen was ich geschrieben habe. ;)
 
#9
Nur der "Stick-Kombo und Box in einem (einfach das MINCHECK ersetzen)" Teil soll vergessen werden. ;)
Da habe ich ja Quatsch geschrieben.
 

wildflyer

wildflieger :-)
#10
super! :)

hat funktioniert, jetzt wird gearmt, egal welche gas stellung. das war die lösung, vielen dank :)

der sinn meiner gaskurve ist in erster linie, das man 100% ausschliessen kann, das der copter unkontrolliert "fällt" wenn man den gasweg auf null macht, dann ist in diesem moment keine regelung mehr aktiv, das kann man durch die gaskurve auf einen wert von ca. 1150-1200 verhindern. ne richtige "kurve" wie beim heli isses natürlich nicht, lediglich eine wegbegrenzung nach unten. und der "arm" switch funktioniert damit dann als "not ausschalter" für die motoren ...

grüsse

joachim

Ich bin mir nicht sicher .... du kannst (auf eigene Gefahr!!!!!) folgendes
in der MultiWii.cpp probieren. Such den folgenden Abschnitt:

Code:
    if (rcData[THROTTLE] <= MINCHECK) {            // THROTTLE at minimum
      #if !defined(FIXEDWING)
        errorGyroI[ROLL] = 0; errorGyroI[PITCH] = 0;
        #if PID_CONTROLLER == 1
          errorGyroI_YAW = 0;
        #elif PID_CONTROLLER == 2
          errorGyroI[YAW] = 0;
        #endif
        errorAngleI[ROLL] = 0; errorAngleI[PITCH] = 0;
      #endif
      if (conf.activate[BOXARM] > 0) {             // Arming/Disarming via ARM BOX
        if ( rcOptions[BOXARM] && f.OK_TO_ARM ) go_arm(); else if (f.ARMED) go_disarm();
      }
    }
Die letzte } schiebst du 3 Zeilen nach oben, also zwischen #endif und if(conf.activate.......

Das sollte dir ein ARM über Schalter erlauben (über Stick-Command nicht).
 

-Ralf-

Erfahrener Benutzer
#13
Vergiß Minthrottle, das nutzt dir nichts. Solange dein Empfängersignal unter MINCHECK (1100)
ist, ist die Regelung abgeschaltet; es sei denn, du patchst den Code wie oben beschrieben.
 
#14
Ok, kann sein das ich das ursprüngliche Anliegen etwas falsch verstanden haben.
Minthrottle benutzt man, damit die Motoren immer drehen und schneller wieder auf die gewünschte Drehzahl kommen.
Die Regelung ist da aber nicht aktiv...
 

-Ralf-

Erfahrener Benutzer
#16
Code:
    if (rcData[THROTTLE] <= MINCHECK) {            // THROTTLE at minimum
 [COLOR="#FF0000"]     #if !defined(FIXEDWING)
        errorGyroI[ROLL] = 0; errorGyroI[PITCH] = 0;
        #if PID_CONTROLLER == 1
          errorGyroI_YAW = 0;
        #elif PID_CONTROLLER == 2
          errorGyroI[YAW] = 0;
        #endif
        errorAngleI[ROLL] = 0; errorAngleI[PITCH] = 0;
      #endif[/COLOR]
    }
    if (rcData[THROTTLE] <= 1100) {
      if (conf.activate[BOXARM] > 0) {             // Arming/Disarming via ARM BOX
        if ( rcOptions[BOXARM] && f.OK_TO_ARM ) go_arm(); else if (f.ARMED) go_disarm();
      }
    }
Einfach die markierten Zeilen löschen oder auskommentieren; dann ist deine Regelung immer aktiv.
Alternativ könnte man das so gestalten, das die Regelung immer nur dann aktiv ist, wenn der
Copter armed ist.
 

schnellmaleben

Erfahrener Benutzer
#17
Einfach die markierten Zeilen löschen oder auskommentieren; dann ist deine Regelung immer aktiv.
Alternativ könnte man das so gestalten, das die Regelung immer nur dann aktiv ist, wenn der
Copter armed ist.
Das ist nicht korrekt, das ist nur der Code der die I-Anteile resettet. Hast Du es probiert?
In Output.cpp ist auch noch mal so was drin:
if ((rcData[THROTTLE] < MINCHECK) && !f.BARO_MODE)
motor = conf.minthrottle;
ich würde mal behaupten das schaltet die Regelung auch effektiv aus :)
 

-Ralf-

Erfahrener Benutzer
#19
Das ist nicht korrekt, das ist nur der Code der die I-Anteile resettet. Hast Du es probiert?
In Output.cpp ist auch noch mal so was drin:
if ((rcData[THROTTLE] < MINCHECK) && !f.BARO_MODE)
motor = conf.minthrottle;
ich würde mal behaupten das schaltet die Regelung auch effektiv aus :)


Nee, ist schon richtig so ..... es müssen nur die I-Anteile resettet werden, P und D laufen eh permanent.
Oder habe ich da was übersehen, wo der PID-Controller komplett abgeschaltet wird?
 

-Ralf-

Erfahrener Benutzer
#20
Das ist nicht korrekt, das ist nur der Code der die I-Anteile resettet. Hast Du es probiert?
In Output.cpp ist auch noch mal so was drin:
if ((rcData[THROTTLE] < MINCHECK) && !f.BARO_MODE)
motor = conf.minthrottle;
ich würde mal behaupten das schaltet die Regelung auch effektiv aus :)


Nee, ist schon richtig so ..... es müssen nur die I-Anteile resettet werden, P und D laufen eh permanent.
Oder habe ich da was übersehen, wo der PID-Controller komplett abgeschaltet wird?

EDIT: Du hast recht .... da müßte man auch noch Hand anlegen .....
 
FPV1

Banggood

Oben Unten