- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 12 von 12

Thema: Servo-Dauerlauf ohne delay();

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    29.07.2013
    Beiträge
    7
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Eine Hardware-Lösung würde ich gerne vermeiden. Ich habs jetzt erstma anderweitig gelöst, jetzt fährt er dauerhaft zwischen zwei Positionen hin und her, z.b. 30° und 150°. Das dürfte für meine Zwecke reichen.

    Allerdings komm ich damit im Moment nicht weiter wenn ich in die Loop noch eine andere Funktion packe.

    1+2 = fail

    1
    Code:
    #include <Servo.h>
    int pos = 0;
    Servo myservo;
    long previousMillis1 = 0;
    long previousMillis2 = 300;
    
    
     
    void setup(){
     myservo.attach(10);
    }
    
     void loop(){
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis1 >= 600) {      //yes 200
        myservo.write(30);
        previousMillis1 = currentMillis;
      }
      if(currentMillis - previousMillis2 >= 600) {      //yes 200
        myservo.write(150);
        previousMillis2 = currentMillis;
      }
    }
    2
    Code:
    #define echoPin 46 // Echo Pin
    #define trigPin 47 // Trigger Pin
     int maximumRange = 200; // Maximum range needed
     int minimumRange = 0; // Minimum range needed
     long interval = 50;    // Scanrate
     long previousMillis = 0;
     long duration, distance;
     
     
    void setup() {
     Serial.begin (9600);
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
    }
     
    
    void loop() {
      scan();
    }
     
     
    int scan(){
     unsigned long currentMillis = millis();
     if(currentMillis - previousMillis >= interval) {
      digitalWrite(trigPin, LOW); 
      delayMicroseconds(2); 
    
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); 
     
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
     
      Serial.println(distance);
      distance = duration/58.2;  //Calculate the distance (in cm) based on the speed of sound.
      previousMillis = currentMillis;
     }
    }
    fail
    Code:
    #include <Servo.h>
    #define echoPin 46 // Echo Pin
    #define trigPin 47 // Trigger Pin
     int maximumRange = 200; // Maximum range needed
     int minimumRange = 0; // Minimum range needed
     int pos = 0;
     long interval = 50;    // Scanrate
     long previousMillis = 0;
     long previousMillis1 = 0;
    long previousMillis2 = 300;
     long duration, distance;
     Servo myservo;
    
     
    void setup() {
     Serial.begin (9600);
     myservo.attach(10);
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
    }
     
    
    void loop(){
      scan();
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis1 >= 600) {      //yes 200
        myservo.write(30);
        previousMillis1 = currentMillis;
      }
      if(currentMillis - previousMillis2 >= 600) {      //yes 200
        myservo.write(150);
        previousMillis2 = currentMillis;
      }
    }
     
     
    int scan(){
     unsigned long currentMillis = millis();
     if(currentMillis - previousMillis >= interval) {
      digitalWrite(trigPin, LOW); 
      delayMicroseconds(2); 
    
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); 
     
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
     
      Serial.println(distance);
      distance = duration/58.2;  //Calculate the distance (in cm) based on the speed of sound.
      previousMillis = currentMillis;
     }
    }
    Scannen, also die Entfernung messen, macht er perfekt, allerdings fährt der Servo nur auf Position 150° und schläft ein.
    Einzelnd betrachtet funktionieren die Sketche. Kommt er mit den ganzen 'currentMillis = millis();' nicht klar und verzählt sich oder kommt aus dem takt?

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Hi,

    ich habe heute wieder was an der Servogeschichte getan. Bin aber nicht wirklich weiter gekommen. Habe Hauptsächlich im Inet gesucht und verschiedene Lib ausprobiert. Die machen aber alle nicht das was ich will. Ich setze mich evtl. Morgen nochmal dran.

    Zu deinem Problem...
    Bei dir kollidieren die Timer. Die Servo Lib nutzt Timer1 genau wie die Lib welche die Funktionen currentMillis etc zur Verfügung stellt.
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 09.07.2008, 23:02
  2. Zeiten ohne Delay
    Von Spongebob85 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 22.10.2007, 00:22
  3. [Frage?] die Delay TIme nicht stimmt mit <util/delay.h>
    Von PaMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 03.08.2007, 15:57
  4. Servo dreht ohne Controller ???
    Von michiE im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 20.06.2005, 14:13
  5. [ERLEDIGT] Servo dreht ohne Impuls
    Von Raimond1 im Forum Motoren
    Antworten: 23
    Letzter Beitrag: 06.05.2005, 15:15

Berechtigungen

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

Solar Speicher und Akkus Tests