- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Problem mit der Accelstepper.h

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49

    Problem mit der Accelstepper.h

    Anzeige

    Powerstation Test
    Ich Suche schon ewig nach einem Fehler, in einem Programmabschnitt. Ich habe 4 Joysticks die mit denen ich 4 Schrittmotoren ansteuern kann, jetzt war es bisher so das die Schrittgeschwindigkeit extrem langsam war . Jetzt hab ich zu Versuchszwecke mal über diese Kette eine while(1) schleife gesetzt und siehe da alles funktioniert so wie es soll.

    Problem ist das ich jetzt nicht mehr aus der schleife komme(ist ja logisch) und auch keine Bedingung dafür finde, das Verständnis zu den Erklärungen der Funktionen auf http://www.airspayce.com/mikem/ardui...e9373eb14c69c1 liegt auch nur bei 50%.

    Kann mir mal wer erklären wieso es mit der while schleife zügig funktioniert und ohne nicht ?

    void Joystick()
    {


    while(1)

    {
    int analog_in0 = (512 - analogRead(ANALOG_IN0));
    int analog_in1 = (512 - analogRead(ANALOG_IN1));
    int analog_in2 = (512 - analogRead(ANALOG_IN2));
    int analog_in3 = (512 - analogRead(ANALOG_IN3));


    int AN0, AN01;
    int AN1, AN11;
    int AN2, AN21;
    int AN3, AN31;


    //.......Stepper1..........//
    if (analog_in0 >= 35 )
    {
    AN0 = exp(analog_in0 / 67);
    Stepper0.setSpeed(AN0) ;
    Stepper0.runSpeed();
    }
    else if (analog_in0 <= -35)
    {
    AN01 = exp(-analog_in0 / 67);
    Stepper0.setSpeed(-AN01) ;
    Stepper0.runSpeed();
    }

    //........Stepper2...........//
    else if (analog_in1 >= 35 )
    {
    AN1 = exp(analog_in1 / 67 );
    Stepper1.setSpeed(AN1) ;
    Stepper1.runSpeed();
    }
    else if (analog_in1 <= -35)
    {
    AN11 = exp(-analog_in1 / 67 );
    Stepper1.setSpeed(-AN11) ;
    Stepper1.runSpeed();
    }

    //..........Stepper3..........//
    else if (analog_in2 >= 35)
    {
    AN2 = exp (analog_in2 / 67);
    Stepper2.setSpeed(AN2) ;
    Stepper2.runSpeed();
    }
    else if (analog_in2 <= -35)
    {
    AN21 = exp (-analog_in2 / 67);
    Stepper2.setSpeed(-AN21) ;
    Stepper2.runSpeed();
    }

    //............Stepper4...........//
    else if (analog_in3 >= 35 )
    {
    AN3 = exp (analog_in3 / 67);
    Stepper3.setSpeed(AN3) ;
    Stepper3.runSpeed();
    }
    else if (analog_in3 <= -35)
    {
    AN31 = exp (-analog_in3 / 67 );
    Stepper3.setSpeed(-AN31) ;
    Stepper3.runSpeed();
    }

    }
    }


    Gruß

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Aus der AccelStepper.h :
    /// Poll the motor and step it if a step is due, implmenting a constant
    /// speed as set by the most recent call to setSpeed().
    /// \return true if the motor was stepped.
    boolean runSpeed();
    Auf deutsch: runSpeed() macht genau einen Step. Und nur dann, wenn eine bestimmte Dauer, die aus dem mit setSpeed() bekommenen Geschwindigkeitswert berechnet wird, überschritten wird.

    Ergo: Du solltest die Funktion möglichst oft ausführen. Daher wäre es ratsam die Teachen_menue()-Funktion nur einmal auszuführen und um den Eintrag delay(500) zu erleichtern.

    P.S.:Wenn du
    Code:
    ... //........Stepper2...........//
    else if (analog_in1 >= 35 )...
    bzw. Stepper3, Stepper4 durch
    Code:
    ...//........Stepper2...........//
    if (analog_in1 >= 35 )...
    ersetzt, hast du gleichberechtigte Joysticks. Z.Z. ist Joystick 1 sozusagen Master, d.h. wird er betätigt, wird auf die anderen nicht reagiert.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    Hab das Problem mit einer for Schleife gelöst , alle 1000 Durchgänge wird Teaching_menue() aufgerufen.
    Gibts noch elegantere Möglichkeiten ?
    Und danke schon mal bzw wieder.
    Die delay() im Teaching_menue hätte mir auch auffallen müssen.


    Gruß
    Geändert von jok3r (24.03.2014 um 22:17 Uhr)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Klar, du könntest eine 2.Funktion (z.B.void displayUpdate()) bauen, die nicht alles löscht und neu aufbaut, sondern nur die tatsächlichen Änderungen schreibt.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    Lieber nicht

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    void Joystick(int x)
    {

    int analog_in0 = (512 - analogRead(ANALOG_IN0));
    int analog_in1 = (512 - analogRead(ANALOG_IN1));
    int analog_in2 = (512 - analogRead(ANALOG_IN2));
    int analog_in3 = (512 - analogRead(ANALOG_IN3));


    int AN0, AN01;
    int AN1, AN11;
    int AN2, AN21;
    int AN3, AN31;


    //.......Stepper1..........//
    if (analog_in0 >= 35 )
    {
    AN0 = exp(analog_in0 / 67);
    Stepper0.setSpeed(AN0) ;
    Stepper0.runSpeed();
    }
    else if (analog_in0 <= -35)
    {
    AN01 = exp(-analog_in0 / 67);
    Stepper0.setSpeed(-AN01) ;
    Stepper0.runSpeed();
    }

    //........Stepper2...........//
    if (analog_in1 >= 35 )
    {
    AN1 = exp(analog_in1 / 67 );
    Stepper1.setSpeed(AN1) ;
    Stepper1.runSpeed();
    }
    else if (analog_in1 <= -35)
    {
    AN11 = exp(-analog_in1 / 67 );
    Stepper1.setSpeed(-AN11) ;
    Stepper1.runSpeed();
    }

    //..........Stepper3..........//
    if (analog_in2 >= 35)
    {
    AN2 = exp (analog_in2 / 67);
    Stepper2.setSpeed(AN2) ;
    Stepper2.runSpeed();
    }
    else if (analog_in2 <= -35)
    {
    AN21 = exp (-analog_in2 / 67);
    Stepper2.setSpeed(-AN21) ;
    Stepper2.runSpeed();
    }

    //............Stepper4...........//
    if (analog_in3 >= 35 )
    {
    AN3 = exp (analog_in3 / 67);
    Stepper3.setSpeed(AN3) ;
    Stepper3.runSpeed();
    }
    else if (analog_in3 <= -35)
    {
    AN31 = exp (-analog_in3 / 67 );
    Stepper3.setSpeed(-AN31) ;
    Stepper3.runSpeed();
    }


    if (analog_in0 < -20 || analog_in0 > 20 || analog_in1 < -20 || analog_in1 > 20 ||analog_in2 < -20 || analog_in2 > 20 ||analog_in3 < -20 || analog_in3 > 20 )
    {
    return 1;
    }


    }

    Stimmt das so ? Oben sollte jetzt beim bewegen eines Joysticks eine 1 in Joystick(int x) stehen bzw für x ?
    Wobei void steht ja für keinen Wert .... normal schreibt man ja int main(void) oder int main (int x) .... wie sieht das beim Arduino aus ?
    logisch wäre int Joystick(int x) oder ?
    Geändert von jok3r (25.03.2014 um 19:25 Uhr)

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Was vor dem Bezeichner (hier: Joystick) steht beschreibt den Rückgabedatentyp der Funktion. Void gibt keinen Wert zurück, double einen double etc. In den Klammern stehen die Eingangsdatentypen. Diese werden ihr zum Ausführungsbeginn mit übergeben. Es kann gar kein, ein oder mehrere Wert(e) verschiedener Datentypen übergeben werden.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    also dann zb "int Joystick(int x) " ?

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Wenn du dem Kompiler sagst, dass ein int zurückgegeben wird, musst du auch dafür sorgen, dass dies IN JEDEM FALL passiert.
    Code:
    ...
    if (analog_in0 < -20 || analog_in0 > 20 || analog_in1 < -20 || analog_in1 > 20 ||analog_in2 < -20 || analog_in2 > 20 ||analog_in3 < -20 || analog_in3 > 20 )
    {
    return 1;
    }
    else return 0;
    Und du solltest darüber nachdenken, ob das int x in der Funktion gebraucht wird. Falls nicht, wäre int joystick() die richtige Wahl. Es ist im übrigen Programmierer-Konvention Funktionsbezeichner klein zu schreiben. Kein Muss, aber guter Stil.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    Ich hab das damals von C++ noch so in Erinnerung gehabt das ich immer (int x ) schreiben muss , weil sonst kann ich mit den rückgabewerten nichts anfangen (vergleichen ect.) ?

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Problem mit der Taster
    Von oliver123 im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 25.04.2011, 12:46
  2. [ERLEDIGT] Problem mit der Textbox
    Von TomEdl im Forum Anregungen/Kritik/Fragen zum Forum und zum Wiki RN-Wissen
    Antworten: 1
    Letzter Beitrag: 19.03.2011, 14:13
  3. Problem mit der Linienverfolgung
    Von Hohenloher im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 25.03.2010, 20:16
  4. Problem mit der Streckenberechnung
    Von Der_Anfänger im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 16.07.2007, 12:01
  5. Problem mit der Hysterese
    Von Jimmy C im Forum Elektronik
    Antworten: 19
    Letzter Beitrag: 07.07.2004, 20:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen