- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 566

Thema: outdoor I

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    der kleinere akku ist da, also kann ich weiter experimentieren. Bei diesem
    Code:
    #include <AccelStepper.h>
    #include <Wire.h>
    #include <IRremoteInt.h>
    #include <ir_Lego_PF_BitStreamEncoder.h>
    #include <IRremote.h>
    #include <Bounce2.h>
    
    
    uint8_t RECV_PIN = 13; //13
    uint8_t taste = 0;
    uint8_t zaehler = 0;
    
    uint8_t idx;
    
    #define PIN2RESET 10
    
    
    
    #define dirPin_VL 2
    #define stepPin_VL 3
    #define dirPin_HL 4
    #define stepPin_HL 5
    #define dirPin_VR 6
    #define stepPin_VR 7
    #define dirPin_HR 8
    #define stepPin_HR 9
    
    #define enbl_VL 40
    #define enbl_HL 42
    #define enbl_VR 41
    #define enbl_HR 43
    
    IRrecv irrecv(RECV_PIN);
    
    decode_results results;
    
    Bounce debouncer = Bounce();
    
    enum stepper_e
    { stepper_VL, stepper_HL, stepper_VR, stepper_HR, stepper_MAX };
    
    
    AccelStepper stepper[stepper_MAX]
    {
      AccelStepper(1, stepPin_VL, dirPin_VL),
      AccelStepper(1, stepPin_HL, dirPin_HL),
      AccelStepper(1, stepPin_VR, dirPin_VR),
      AccelStepper(1, stepPin_HR, dirPin_HR)
    };
    
    
    void setup()
    {
      Serial1.begin(115200);
      Serial.begin(115200);
    
      Serial.println("code----//home/georg/Arduino/outdoor_robo/stepper/test_vier_stepper/mit_lib/infra_rot_pin_13/remote_vier_stepper_switch_1_enbl");
    
      //pinMode(RECV_PIN, INPUT_PULLUP);
    
      pinMode(PIN2RESET, INPUT);
    
      debouncer.attach(RECV_PIN);
      debouncer.interval(5); // interval in ms
    
      irrecv.enableIRIn(); // Start the receiver
    
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        stepper[idx].setMaxSpeed(1000);
        stepper[idx].setSpeed(800);
        stepper[idx].setAcceleration(100);
      }
    
    
      digitalWrite(enbl_VL, HIGH);
      digitalWrite(enbl_HL, HIGH);
      digitalWrite(enbl_VR, HIGH);
      digitalWrite(enbl_HR, HIGH);
    
      digitalWrite(PIN2RESET, HIGH);
    }
    
    void loop()
    {
    
      // Update the Bounce instance :
      debouncer.update();
    
      // Get the updated value :
      zaehler = debouncer.read();
    
      if (zaehler == 1)
      {
        zaehler = 0;
        if (irrecv.decode(&results))
        {
          taste = results.value;
          Serial.println(taste);
          //      delay(1000);
          irrecv.resume(); // Receive the next value
        }
        //    taste = 0;
        tasten_abfrage();
        //vorwaerts();
    
        fahrt_ausfuehren();
      }
    }
    
    
    /***********************************************************/
    
    void tasten_abfrage(void)
    {
      switch (taste)
      {
    
        case 151 ://taste 1 große FB
          {
            if (taste == 151 )
            {
              Serial.println("szenario_1");
              Serial1.println("szenario_1");
    
              //fahre szenario_1
    
              delay (1000);
    
              break;
            }
          }
    
        case 103://taste 2 große FB
          {
            if (taste == 103)
            {
              Serial.println("szenario_2");
              Serial1.println("szenario_2");
    
              //fahre szenario_2
    
              delay (1000);
    
              break;
            }
          }
    
        case 79://taste 3 große FB
          {
            if (taste == 79)
            {
              Serial.println("szenario_3");
              Serial1.println("szenario_3");
    
              //fahre szenario_3
    
              delay (1000);
    
              break;
            }
          }
    
    
        case 207://taste 4 große FB
          {
            if (taste == 207)
            {
              Serial.println("szenario_4");
              Serial1.println("szenario_4");
    
              //fahre szenario_4
    
              delay (1000);
    
              break;
            }
          }
    
    
        case 253://OK taste, motor stop
          {
            if (taste == 253)
            {
              alle_stepper_stop();
    
              break;
            }
          }
    
    
        case 61:// rotate rechts große FB
          {
            if (taste == 61)
            {
              rechts_drehen();
    
              break;
            }
          }
    
    
        case 221:// rotate links große FB
          {
            if (taste == 221)
            {
              links_drehen();
    
              break;
            }
    
          }
    
    
        case 157:// fahre vor große FB
          {
            if (taste == 157)
            {
              vorwaerts();
    
              break;
            }
          }
    
    
        case 87:// fahre rückwärts große FB
          {
            if (taste == 87)
            {
              rueckwaerts();
    
              break;
            }
          }
      }
    
    
    }
    
    
    /***********************************************************/
    void alle_stepper_stop(void)
    {
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
    
        stepper[idx].stop();
    
      }
    
      digitalWrite(enbl_VL, HIGH);
      digitalWrite(enbl_HL, HIGH);
      digitalWrite(enbl_VR, HIGH);
      digitalWrite(enbl_HR, HIGH);
      reboot();
    }
    
    /***********************************************************/
    void vorwaerts(void)
    {
    
      digitalWrite(enbl_VL, LOW);
      digitalWrite(enbl_HL, LOW);
      digitalWrite(enbl_VR, LOW);
      digitalWrite(enbl_HR, LOW);
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(-200);
      }
    
      for (idx = stepper_VR; idx < stepper_MAX; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(200);
      }
    }
    
    
    /**********************************************************/
    
    void rueckwaerts(void)
    {
    
      digitalWrite(enbl_VL, LOW);
      digitalWrite(enbl_HL, LOW);
      digitalWrite(enbl_VR, LOW);
      digitalWrite(enbl_HR, LOW);
    
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(200);
      }
    
      for (idx = stepper_VR; idx < stepper_MAX; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(-200);
      }
    }
    
    /***********************************************************/
    void rechts_drehen(void)
    {
    
      digitalWrite(enbl_VL, LOW);
      digitalWrite(enbl_HL, LOW);
      digitalWrite(enbl_VR, LOW);
      digitalWrite(enbl_HR, LOW);
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(-200);
      }
    
      for (idx = stepper_VR; idx < stepper_MAX; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(-200);
      }
    }
    
    
    /**********************************************************/
    void links_drehen(void)
    {
    
      digitalWrite(enbl_VL, LOW);
      digitalWrite(enbl_HL, LOW);
      digitalWrite(enbl_VR, LOW);
      digitalWrite(enbl_HR, LOW);
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(200);
      }
    
      for (idx = stepper_VR; idx < stepper_MAX; idx++)
      {
        stepper[idx].runSpeed();
        stepper[idx].move(200);
      }
    }
    
    /***********************************************************/
    void reboot()
    {
      pinMode(PIN2RESET, OUTPUT);
      digitalWrite(PIN2RESET, LOW);
      delay(100);
    }
    /***********************************************************/
    
    boolean fahrt_fertig()
    {
    
      return        stepper[stepper_VL].isRunning() && stepper[stepper_HL].isRunning() && stepper[stepper_VR].isRunning()
                    && stepper[stepper_HR].isRunning();
    
    }
    
    /************************************************************/
    void fahrt_ausfuehren()
    {
      //  while ( ! fahrt_fertig() )
      {
        for (idx = stepper_VL; idx < stepper_MAX; idx++)
        {
          stepper[idx].run();
          // delay(1);
        }
      }
    }
    für eine fernbedienung, die ich im code mit bounce entprellt habe, stellte ich fest, dass bei einer "Vorwärts - STOP - Rückwärts" befehlsfolge die abgebrochene vorwärtsbewegung beim betätigen der rückwärtstaste erstmal zu ende ausgeführt wird bevor es rückwärts geht...
    Ich verstehe es nicht, weil ich den gleichen code bereits bei den anderen, kleinere steppern - ohne dieses phänomen - verwendet habe. Hier scheint es mir so zu sein, dass nach einem stop-befehl die variablen nicht in den zustand versetzt werden, der nach RESET bzw. neustart des codes vorhanden ist. Kann das an der motortreibern liegen?
    Ich konnte mir zunächst damit helfen, dass ich den arduino im STOP befehl mit diesem
    Code:
    #define PIN2RESET 10
    
    void setup()
    
    {
    
      Serial.begin(115200);
    
      Serial.println("code----//home/georg/Arduino/tools/reboot");
    
      pinMode(PIN2RESET, INPUT);
    
      delay(2000); //nur für test
    }
    
    void loop()
    
    {
    
      reboot();
      //  delay(2000); //nur für test
    }
    
    /***********************************************************/
    void reboot()
    {
      pinMode(PIN2RESET, OUTPUT);
      digitalWrite(PIN2RESET, LOW);
      delay(100);
    }
    resette. Es funktioniert, ganz wohl ich mir aber nicht dabei...
    gruß inka

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von inka Beitrag anzeigen
    Kann das an der motortreibern liegen?
    Wenn du damit die Hardware Treiber Module meinst, nein. Die haben keine Variablen, merken sich nichts. Beim enablen/disablen kann es höchtens einen Ruckler um +- 1/2 Schritt geben, also so rund um 1° Drehung.

    Es ist ein Software Problem.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.668
    Ich versuche mal ein wenig Licht in die Sache zu bringen. Da sind mir noch mehr Dinge aufgefallen, die ich nicht so recht in dem Code von Inka verstehe. Wie das Verwenden von runSpeed(). Das soll immer wieder aufgerufen werden (?), damit der Motor seine Schritte tut, allerdings ruft Inka danach immer wieder die move()-Methode auf? Die Verwendung von move(), setSpeed() usw. verstehe ich noch nicht so recht.

    Aber zunächst mal was anderes:

    die Klassenreferenz: http://www.airspayce.com/mikem/ardui...elStepper.html


    zu: stepper_VL, stepper_HL, stepper_VR, stepper_HR, stepper_MAX
    habe ich keine Werte gefunden, welche verbergen sich dahinter?






    Übersetzung:


    Sie können mehrere gleichzeitige Stepper verwenden, die sich alle mit unterschiedlichen Geschwindigkeiten und Beschleunigungen bewegen,
    vorausgesetzt, Sie rufen ihre run () - Funktionen in ausreichend regelmäßigen Abständen auf.
    Die aktuelle Position ist auf 0 und die Zielposition auf 0 eingestellt. Die Standardeinstellung für MaxSpeed und Acceleration ist 1.0.
    Die Motorpins werden während des Konstruktors durch einen Aufruf von enableOutputs () in den OUTPUT-Modus initialisiert.




    setEnablePin()
    --------------
    Legt die Aktivierungs-PIN-Nummer für Schritttreiber fest. 0xFF zeigt unbenutzt an (Standard). Andernfalls, wenn ein Pin gesetzt ist,
    wird der Pin beim Aufruf von enableOutputs () eingeschaltet und beim Aufruf von disableOutputs () ausgeschaltet.


    Der Ordnung halber würde ich den Enable-Pin über diese Methode, für alle 4988, festlegen. Auch wenn es, zumindest scheinbar, an
    der LIB vorbei funktioniert.




    stop()
    ------
    Der Stepper soll unter Verwendung der aktuellen Geschwindigkeits- und
    Beschleunigungsparameter so schnell wie möglich anhalten.




    disableOutputs()
    ----------------
    Deaktivieren Sie die Motor-Pin-Ausgänge, indem Sie alle auf LOW stellen. Abhängig vom Design Ihrer Elektronik kann dies
    die Stromversorgung der Motorspulen unterbrechen, um Strom zu sparen. Dies ist nützlich, um Arduino-Energiesparmodi
    zu unterstützen: Deaktivieren Sie die Ausgänge für den Ruhezustand und aktivieren Sie sie dann erneut mit enableOutputs(),
    bevor Sie erneut einen Schritt ausführen. Wenn der Aktivierungs-Pin definiert ist, wird er in den OUTPUT-Modus
    versetzt und der Pin auf deaktiviert gesetzt.


    isRunning()
    -----------
    Überprüft, ob der Motor gerade läuft.



    Hier habe ich Zweifel, wegen dem UND-Operator.
    Code:
    /***********************************************************/
    
    
    boolean fahrt_fertig()
    {
    
    
      return        stepper[stepper_VL].isRunning() && stepper[stepper_HL].isRunning() && stepper[stepper_VR].isRunning()
                    && stepper[stepper_HR].isRunning();
    
    
    }
    "1" und "0" ergibt normalerweise "0".
    fahrt_fertig() gäbe FALSE, wenn nur 1 Motor nicht mehr läuft.
    Wenn alle Ergebnisse von isRunning() zusammengeführt werden
    sollen, würde ich das ändern in folgenden Code, mit dem ODER-Operator.
    Code:
    /***********************************************************/
    
    
    boolean fahrt_fertig()
    {
    
    
      return        stepper[stepper_VL].isRunning() || stepper[stepper_HL].isRunning() || stepper[stepper_VR].isRunning()
                    || stepper[stepper_HR].isRunning();
    
    
    }
    Dann gäbe fahrt_fertig() ein FALSE, wenn alle Motoren nicht mehr laufen.





    Folgender Code, um die Stepper anzuhalten.
    Code:
    /***********************************************************/
    void alle_stepper_stop(void)
    {
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        stepper[idx].stop();
        stepper[idx].disableOutputs();
      }
    
    
    /*
      digitalWrite(enbl_VL, HIGH);
      digitalWrite(enbl_HL, HIGH);
      digitalWrite(enbl_VR, HIGH);
      digitalWrite(enbl_HR, HIGH);
      reboot();
    */
      
    }

    stop() soll den Motor - so schnell wie möglich - anhalten.
    disableOutputs() sollte den a4988 Motortreiber abschalten,
    so dass der Motor sofort anhalten sollte.
    Normalerweise erst stoppen, dann abschalten.


    Später dann wieder anschalten enableOutputs() und den Motor bewegen.



    MfG

    - - - Aktualisiert - - -

    Auch mal bitte prüfen, ob der Code der Fernbedienung ohne Verzögerung im Programm ankommt, ob von dort irgendwo die Verzögerung (vorwärts auf rückwärts) herrührt.

    - - - Aktualisiert - - -


    Beispiel:
    stepper[index].setEnablePin(Pinnummer);
    siehe auch: setPinsInverted()
    stepper[index].setPinsInverted(false,false,true); //weil der Enable ein invertierender Eingang ist
    Geändert von Moppi (10.11.2019 um 08:31 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hat gut geklappt:
    Klicke auf die Grafik für eine größere Ansicht

Name:	20191114_163024.jpg
Hits:	16
Größe:	39,0 KB
ID:	34476

    ein drehteller (ich glaub von fondue), 10 minuten drehen und das wars...

    Um ein video aufzunehmen hat die dritte hand gefehlt...
    gruß inka

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Ich habe es schon mit der Drehbank umgespult. Hatte das Problem das eine Dickstelle im Filament war und ich den Druck nach über 40h abbrechen musste. Damit das nicht mehr passiert habe ich das Filament kontrolliert. Habe mir aber einen Sensor gebaut der das registrieren soll. Muss ich aber noch testen und optimieren.

    MfG Hannes

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.668
    Mit wieviel Spannung muß das aufgewickelt werden?


    MfG

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Das Material darf nicht locker sein, das ist die Hauptsache.

    Was auch noch wichtig ist, ist das du keine Stelle hast mit einem "Berg" oder einem "Tal". Wenn das passiert kann es das Material beim Verarbeiten nachrutschen und sich das Material verzwicken.

    MfG Hannes

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Zitat Zitat von Moppi Beitrag anzeigen
    Mit wieviel Spannung muß das aufgewickelt werden?
    MfG
    Klicke auf die Grafik für eine größere Ansicht

Name:	20191115_133920.jpg
Hits:	12
Größe:	28,7 KB
ID:	34477
    habe nicht so drauf geachtet, habe einfach mit der rechten hand gedreht, mit der linken die grosse spule etwas gebremst, also das filament ein bischen unter spannung gehalten und versucht das material auf der kleineren spule ein bischen zu verteilen. Besonders ist es nicht gelungen, der drucker druckt aber...

    p.s. werden hier neuerdings alle fotos in "landscape" gedreht?
    gruß inka

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    vielleicht greife ich hier zu weit vor, aber warum eigentlich nicht. Der Mega 2560 soll ja als "motorbetreuer" dienen, evtl. bekommt er noch ein paar Sensoren zur seite...
    Für die kommunikation nach aussen (und innen) soll ein LOLIN ESP32 dienen, den hatte ich als "rest" aus dem projekt der autonomen TT-lok noch da. Das menü auf dem smartphone sah dort so aus:

    Klicke auf die Grafik für eine größere Ansicht

Name:	2019_11_19_bedien_bild_tt_lok.jpg
Hits:	10
Größe:	46,5 KB
ID:	34490
    dies soll, da die bedienung des outdoor roboters ja viel umfangreicher sein wird durch so etwas
    Klicke auf die Grafik für eine größere Ansicht

Name:	20191119_102532.jpg
Hits:	44
Größe:	35,1 KB
ID:	34491
    ersetzt werden...

    Die übernahme des AP-servers macht mir denke ich keine probleme, wie ich aber die (html?) programmierung des neuen bedienfeldes hinbekommen soll, da habe ich keinen blassen schimmer... Wer hilft?
    gruß inka

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.668
    Wenn Du Hilfe beim HTML-Bedienfeld brauchst, kann ich das gerne für Dich übernehmen. Allerdings habe ich keinen ESP32, nur ein ESP-12E. Müsstest den Code dann auf dem ESP32 selbst zum Laufen bringen, wenn Du nicht ganz unbewandert bist, sollte das funktionieren.


    Gruß

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Abstandsmessung Outdoor bis 3m
    Von robo218 im Forum Sensoren / Sensorik
    Antworten: 4
    Letzter Beitrag: 14.12.2017, 06:56
  2. outdoor spy robot
    Von jancrombach im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 7
    Letzter Beitrag: 14.08.2010, 13:09
  3. Outdoor Roboter
    Von OsramLED im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 07.08.2006, 09:34
  4. Outdoor-Robo
    Von RobotrixerP im Forum Mechanik
    Antworten: 3
    Letzter Beitrag: 16.04.2006, 18:38
  5. [ERLEDIGT] Outdoor - Navigation
    Von Quaio im Forum Sensoren / Sensorik
    Antworten: 37
    Letzter Beitrag: 21.04.2005, 12:31

Berechtigungen

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

LiFePO4 Speicher Test