Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Hummerfresse
    Member
    • 23.02.2008
    • 813
    • Manu
    • Chiemgau

    #1

    Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

    Hi Leute

    da ich bezüglich meines Tiger-Projektes noch eine andere Möglichkeit testen wollen würde, hätte ich an die Programmier-Spezialisten bzw. Cracks am Arduino eine Bitte:
    Evtl kann mir den Code jemand um einen Servosignal-Eingang erweitern. Z.b. an Pin 9.

    Ich habe bereits diesen fertigen Code hier.
    Er bewegt 2 Servos per Zufall mit Random-Werten hin und her.
    Die Geschwindigkeit lässt sich auch variabel einstellen.

    Ich würde das ganze jetzt gerne noch via RC-Signal schaltbar gestalten.
    Dazu hätte ich gerne einstellbar in welchem Bereich von 1000 µs to 2000 µs die Schaltung auf AN geht.

    Leider übersteigt das meine doch sehr geringen Progmmierkenntnisse im Bereich "Arduino bzw. C"


    Anbei mein bisheriger Code:

    Verwendet habe ich einen Pro Mini 5V 16Hz
    Vor dem Arduino befindet sich noch ein kleiner Spannungswandler der mir die Spannung vom 2s LIPO auf genau 5V regelt.

    Endausschläge und Geschwindigkeit für das jeweilige Servo sind einstellbar.
    Die Servoposition an die das Servo geschickt wird, wird per Zufall via Random-Wert generiert.

    Video:
    MG Bewegung durch 2 Servos per Zufall - Arduino - Vario Tiger EC 665 on Vimeo


    Man benötigt folgende Library sowie unten stehenden Code
    Library:
    VarSpeedServo.h

    kann man hier downloaden:
    netlabtoolkit/VarSpeedServo · GitHub


    Code:
    #include <VarSpeedServo.h>

    #define SERVO_P1 10 // Servo connected to PIN 10
    #define SERVO_P2 11 // Servo connected to PIN 11
    #define WAIT_I 1000 // wait after init in ms


    #define POS_L 20 // left endstop
    #define POS_R 160 // right endstop
    #define POS_O 20 // oben endstop
    #define POS_U 160 // unten endstop

    #define WAIT_EN 350 // wait time at endstop in ms
    #define WAIT_IN 500 // wait time at each angular increment in ms


    VarSpeedServo servo1; // create servo object to control a servo
    VarSpeedServo servo2; // Zusatzservo für oben unten


    void setup()
    {
    servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
    servo1.write(POS_L); // tell servo to go to init position

    servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
    servo2.write(POS_O); // tell servo to go to init position

    delay(WAIT_I); // wait a little bit
    }


    void loop()
    {
    int posX = 0; // variable to store the servo position
    int posY = 0; // variable to store the servo position
    int gotoX = (int) random(POS_L, POS_R);
    int gotoY = (int) random(POS_O, POS_U);


    servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
    servo2.write(gotoY,10); // tell servo to go to position in variable 'pos'

    delay(WAIT_IN); // waits for the servo to reach the position
    }


    Vielen Dank

    Gruß
    Manuel
    Gruss
    Manuel
  • Borndelgramer
    Member
    • 21.04.2007
    • 323
    • Maxi

    #2
    AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

    Hallo,

    habs nicht getestet aber das könnte gehen

    void setup()
    {
    servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
    servo1.write(POS_L); // tell servo to go to init position

    servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
    servo2.write(POS_O); // tell servo to go to init position

    pinMode(pin, INPUT); // pin ist dein gewünschter Eingangskanal am Arduino, entsprechend abändern!!

    delay(WAIT_I); // wait a little bit
    }

    void loop()
    {
    int posX = 0; // variable to store the servo position
    int posY = 0; // variable to store the servo position
    unsigned long duration;

    duration = pulseIn(pin, HIGH);// pin ist dein gewünschter Eingangskanal am Arduino, entsprechend abändern!!

    if(duration>XXX)
    {
    int gotoX = (int) random(POS_L, POS_R);
    int gotoY = (int) random(POS_O, POS_U);
    servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
    servo2.write(gotoY,10); // tell servo to go to position in variable 'pos'
    }


    delay(WAIT_IN); // waits for the servo to reach the position
    }
    Gruß Maxi

    Kommentar

    • Borndelgramer
      Member
      • 21.04.2007
      • 323
      • Maxi

      #3
      AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

      fast vergessen: das XXX bitte entsprechend durch deine gewünschte Servoimpulsschwelle ersetzen, also einen Wert zwischen 1000 und 2000.

      Kommentar

      • Hummerfresse
        Member
        • 23.02.2008
        • 813
        • Manu
        • Chiemgau

        #4
        AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

        Hi Maxi

        vielen Dank

        werde ich heute Nachmittag gleich mal testen :-)

        Gebe dann hier Rückmeldung obs klappt.

        Gruß
        Manuel
        Gruss
        Manuel

        Kommentar

        • 4li3n
          Senior Member
          • 04.08.2009
          • 1082
          • Ingbert
          • meist aufm Platz

          #5
          AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

          I like that Hummelfresse ^^

          Nur ein Sache würde ich anders machen. Das das MG nach oben Zielt würde ich vermeiden wollen.

          Gruss
          Kluge Menschen reagieren auf Kritik gelassen, dumme Menschen trotzig.

          Kommentar

          • Hummerfresse
            Member
            • 23.02.2008
            • 813
            • Manu
            • Chiemgau

            #6
            AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

            Wieso?
            Wenn der Heli im Vorwärtsflug ist, sprich mit Neigung nach vorne, dann muss er auch Ziele anvisieren können, die weiter vor ihm liegen.
            D.h. die MG muss sich auch nach oben bewegen.
            Sieht man auch an vielen Flugbildern vom Tiger.
            Das passt meiner Meinung nach schon so :-)

            Gruß
            Manuel
            Zuletzt geändert von Hummerfresse; 04.12.2014, 09:34.
            Gruss
            Manuel

            Kommentar

            • beetlejuice
              Senior Member
              • 18.02.2004
              • 1382
              • Günter
              • Weiz-Graz-Zeltweg

              #7
              AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

              Zitat von 4li3n Beitrag anzeigen
              Nur ein Sache würde ich anders machen. Das das MG nach oben Zielt würde ich vermeiden wollen.

              Gruss
              Solange die MG-Richtung unter dem Hauptrotor bleibt, passt das schon so.

              Günter
              Erwin 5, Birdy DS, Su-35, Mig21
              1:4 Jet Ranger, Heli Baby NT, Agusta A109
              Jeti DS24

              Kommentar

              • Bernhard Kerscher
                Senior Member
                • 26.04.2010
                • 3227
                • Bernhard
                • Dingolfing/Frontenhausen

                #8
                AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

                Ich habe das bei meiner Lichtsteuerung so aus dem Netz zusammenkopiert:

                int rc_pin = 2; //Empfängereingang

                void setup() {
                pinMode(rc_pin, INPUT);
                }


                int rc_read() // Funktion um RC-Kanal auszulesen
                {
                int rc_in = pulseIn(rc_pin, HIGH, 100000);
                return rc_in;
                }


                void loop() {

                rc_signal = rc_read(); // aktuellen RC-Wert abfragen

                if(rc_signal >= 1000 && rc_signal <=1200) { // Knüppelposition abfragen

                //hier dann deinen Code hin kopieren

                }


                else { //mache nix
                }
                Selber denken schadet nicht ! YouTube

                Kommentar

                • Hummerfresse
                  Member
                  • 23.02.2008
                  • 813
                  • Manu
                  • Chiemgau

                  #9
                  AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

                  Vielen Dank
                  teste ich ebenfalls.

                  Gruß
                  Manuel
                  Gruss
                  Manuel

                  Kommentar

                  • Hummerfresse
                    Member
                    • 23.02.2008
                    • 813
                    • Manu
                    • Chiemgau

                    #10
                    AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

                    Hi Leute

                    vielen dank für all eure Beispiele.

                    Funktioniert hat am besten der Sketch von Maxi.
                    Diesen habe ich unten noch erweitert.
                    Im else-Fall, fährt die Gun nun bei Nicht-Aktivität immer in Ihre Ausgangs- bzw. Neutralpoistion zurück.

                    Anbei der finale Code:



                    #include <VarSpeedServo.h>


                    #define SERVO_P1 10 // Servo connected to PIN 10
                    #define SERVO_P2 11 // Servo connected to PIN 11
                    #define WAIT_I 000 // wait after init in ms
                    #define POS_L 20 // left endstop
                    #define POS_R 180 // right endstop
                    #define POS_O 20 // oben endstop
                    #define POS_U 170 // unten endstop

                    #define WAIT_EN 350 // wait time at endstop in ms
                    #define WAIT_IN 500 // wait time at each angular increment in ms

                    VarSpeedServo servo1; // create servo object to control a servo
                    VarSpeedServo servo2; // Zusatzservo für oben unten

                    void setup()

                    {
                    servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object

                    servo1.write(POS_L); // tell servo to go to init position

                    servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object

                    servo2.write(POS_O); // tell servo to go to init position

                    pinMode(9, INPUT); // pin ist dein gewünschter Eingangskanal am Arduino, entsprechend abändern!!

                    delay(WAIT_I); // wait a little bit

                    }
                    void loop()
                    {

                    int posX = 0; // variable to store the servo position

                    int posY = 0; // variable to store the servo position

                    unsigned long duration;


                    duration = pulseIn(9, HIGH);

                    if(duration>1600)


                    {

                    int gotoX = (int) random(POS_L, POS_R);
                    int gotoY = (int) random(POS_O, POS_U);

                    servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
                    servo2.write(gotoY,25); // tell servo to go to position in variable 'pos'

                    delay(WAIT_IN); // waits for the servo to reach the position

                    } else {


                    //Halteposition anfahren

                    posX = 95;
                    posY = 40;

                    servo1.write(posX,50); // tell servo to go to position in variable 'pos'

                    servo2.write(posY,50); // tell servo to go to position in variable 'pos'

                    delay(WAIT_IN); // waits for the servo to reach the position

                    }

                    }


                    Damit ist mein Problem gelöst.
                    Funktioniert so perfekt und der Schaltpunkt läst sich sehr genau einstellen
                    Gruss
                    Manuel

                    Kommentar

                    • Borndelgramer
                      Member
                      • 21.04.2007
                      • 323
                      • Maxi

                      #11
                      AW: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

                      Hallo,

                      hab deinen Code nochmal ein wenig optimiert. Das Wait in der setup Funktion sehe ich für sinnlos. Dürfte im oberen Code von dir eh nicht funktioniert haben, da das define überhaupt nicht existiert.
                      Deinen Servokanal habe ich durch einen define ersetzt, also so wie die anderen Werte auch. In der if Anweisung habe ich das Anfahren der Position raus gezogen. Das spart ein paar Programmzeilen.

                      Probiert habe ich den Code so nicht, sollte aber auch gehen.
                      Code:
                      #include <VarSpeedServo.h>
                      
                      #define SERVO_P1 10 // Servo connected to PIN 10
                      #define SERVO_P2 11 // Servo connected to PIN 11
                      #define WAIT_I 000 // wait after init in ms
                      #define POS_L 20 // left endstop
                      #define POS_R 180 // right endstop
                      #define POS_O 20 // oben endstop
                      #define POS_U 170 // unten endstop
                      #define RC_IN 9 // RC-Eingang
                      #define WAIT_IN 500 // wait time at each angular increment in ms
                      
                      VarSpeedServo servo1; // create servo object to control a servo
                      VarSpeedServo servo2; // Zusatzservo für oben unten
                      
                      void setup()
                      {
                      servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
                      servo1.write(POS_L); // tell servo to go to init position
                      servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
                      servo2.write(POS_O); // tell servo to go to init position
                      pinMode(RC_IN, INPUT); // pin ist dein gewünschter Eingangskanal am Arduino, entsprechend abändern!!
                      }
                      void loop()
                      {
                      int posX = 0; // variable to store the servo position
                      int posY = 0; // variable to store the servo position
                      unsigned long duration;
                      
                      duration = pulseIn(RC_IN, HIGH);
                      
                      if(duration>1600)
                      {
                      
                        posX = (int) random(POS_L, POS_R);
                        posY = (int) random(POS_O, POS_U);
                      
                      } else {
                      //Halteposition anfahren
                        posX = 95;
                        posY = 40;
                      
                      }
                      
                      servo1.write(posX,50); // tell servo to go to position in variable 'pos'
                      servo2.write(posY,50); // tell servo to go to position in variable 'pos'
                      delay(WAIT_IN); // waits for the servo to reach the position
                      }
                      Gruß Maxi

                      Kommentar

                      Lädt...
                      X