Servo programma wordt traag

Geef hier suggesties voor extra onderwerpen of andere dingen die je graag gewijzigd zou willen zien
Berichten: 8
Geregistreerd: 07 Jan 2023, 09:55

Servo programma wordt traag

Berichtdoor Harry » 08 Mrt 2023, 22:08

Daar ben ik weer met mijn servo programma.

Inmiddels een aangepaste versie gemaakt voor 1 drukknop en 1 servo en een hoekverdraaiing van 90 graden
Code: Alles selecteren
#include <Servo.h>   

Servo servo;         

int pos = 70;         // variabele voor de positie van de servo
int switchPin = 12;                     // drukknop
int ledPin = 2;               // ingebouwde LED
int switchStatus= LOW;                  // drukknop

// wordt uitgevoerd bij de start

void setup() {

    pinMode(ledPin, OUTPUT);           
    pinMode(switchPin, INPUT);         
     servo.attach(3,350,2080);   
  servo.write(70);
  delay(350);
}


void loop() {

    switchStatus = digitalRead(switchPin);    // waarde van de schakelaar (LOW/HIGH)
   
   

    if (switchStatus == HIGH) {               // schakelaar ingedrukt (HIGH)
              digitalWrite(ledPin, HIGH);          // ingebouwde LED aan
           
    servo.write(160);  // servo naar 160
    delay(2000);         // tijd om te draaien
 

  // en servo weer terug
 
    servo.write(700);  // Servo naar 70
    delay(2000);         // tijd om te draaien
    } else {
        digitalWrite(ledPin, LOW);           // ingebouwde LED uit
         
    }

}


Dit werkt nu een maand zonder stilvallen zonder resetten van mij arduino gewoon goed.

Nu wil ik straks 4 servo's aansturen allen met een eigen knop en nauwelijks gelijktijdige bediening (als dat wel zo is is dat per ongeluk).
Dacht ik dat is simpel, helaas dit tweede programma reageert soms helemaal niet op een puls drukker soms na een paar keer drukken of als ik de knop heel lang (3-4 seconden)ingedrukt houd.

Mijn conclusie:het lijkt erop dat het programma heel traag de ingangen leest terwijl dat volgens mij niet hoeft omdat er geen acties zijn.

Of is het niet zo simpel als ik dacht en heb ik iets vreemds gemaakt.

Kan iemand me weer een zetje in de goede richting geven.

bijvoorbaat dank.

Harry

Code: Alles selecteren
#include <Servo.h>   

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

int pos = 70;         // startpositie voor de positie van de servo
int switchPin1 = 4;                     // drukknop
int switchPin2 = 5;                     // drukknop
int switchPin3 = 6;                     // drukknop
int switchPin4 = 7;                     // drukknop

int switchStatus1= LOW;                  // drukknop
int switchStatus2= LOW;                  // drukknop
int switchStatus3= LOW;                  // drukknop
int switchStatus4= LOW;                  // drukknop

// wordt uitgevoerd bij de start

void setup() {
   pinMode(LED_BUILTIN, OUTPUT);
             
    pinMode(switchPin1, INPUT);         
       servo1.attach(8,350,2080); 
    pinMode(switchPin2, INPUT);   
        servo2.attach(9,350,2080);
    pinMode(switchPin3, INPUT);   
        servo3.attach(10,350,2080);
    pinMode(switchPin4, INPUT);   
        servo4.attach(11,350,2080);
  servo1.write(pos);
  servo2.write(pos);
  servo3.write(pos);
  servo4.write(pos);
  delay(350);
  //Serial.begin(9600); //
}


void loop() {

    switchStatus1 = digitalRead(switchPin1);    // waarde van de schakelaar (LOW/HIGH)
    switchStatus2 = digitalRead(switchPin2);    // waarde van de schakelaar (LOW/HIGH)
    switchStatus3 = digitalRead(switchPin3);    // waarde van de schakelaar (LOW/HIGH)
    switchStatus4 = digitalRead(switchPin4);    // waarde van de schakelaar (LOW/HIGH)

   //int value = digitalRead(4);
  //Serial.println(value);
   

    if (switchStatus1 == HIGH) {               // schakelaar ingedrukt (HIGH)
             
               digitalWrite(LED_BUILTIN, HIGH);   // ingebouwde LED aan  !!!
           
    servo1.write(160);  // servo naar 160
    delay(700);         // tijd om te draaien
    }
     servo1.write(pos);  // Servo naar 10
    delay(500);         // tijd om te draaien
           
 
  if (switchStatus2 == HIGH) {               // schakelaar ingedrukt (HIGH)
          //digitalWrite(ledPin, HIGH);          // ingebouwde LED aan
     
         servo2.write(160);  // servo naar 160
       delay(500);         // tijd om te draaien
      }
  servo2.write(pos);  // Servo naar 10
    delay(500);         // tijd om te draaien 
 
 
  if (switchStatus3 == HIGH) {               // schakelaar ingedrukt (HIGH)
          //digitalWrite(ledPin, HIGH);          // ingebouwde LED aan
     
         servo3.write(160);  // servo naar 160
       delay(500);         // tijd om te draaien
    }
   
        servo3.write(pos);  // Servo naar 10
       delay(500);         // tijd om te draaien
 
  if (switchStatus4 == HIGH) {               // schakelaar ingedrukt (HIGH)
          //digitalWrite(ledPin, HIGH);          // ingebouwde LED aan
 
 
       servo4.write(160);  // servo naar 160
       delay(500);         // tijd om te draaien
     
         servo4.write(pos);  // Servo naar 10
       delay(500);         // tijd om te draaien 
 
     
    } else {
               digitalWrite(LED_BUILTIN, LOW);  // ingebouwde LED uit !!! 
    }

}

Advertisement

Berichten: 68
Geregistreerd: 04 Sep 2021, 08:31

Re: Servo programma wordt traag

Berichtdoor RobGood » 09 Mrt 2023, 14:29

Harrie,
Tja.... zelf heb ik vergelijkbaars gemaakt voor 8 servo's dus het kan...
Maar... je moet je echt verder verdiepen in de arduino algemeen.
Je hebt een sketch gemaakt die nu 1 ding, proces doet, bekijkt een knop en doet dan wat, in dit geval een servo bewegen.
Dan kun je de wachttijden doen met delays. Maar een delay stopt gewoon de arduino voor een periode. Dus wil je met de arduino meerdere dingen, processen doen.... dat gaat niet want die arduino wordt door die delays iedere keer uit gezet.

Verdiep je in het onderwerp timers, hoe kun je meerdere processen na elkaar uitvoeren, en met zo een snelheid dat wij denken dat het gelijktijdig gaat, en met pauzes gemaakt met timers ZONDER die pauzes die door delays worden gemaakt dus zonder delays.

Een bekende methode (er zijn er velen) is met tellers die de ingebouwde timers van een arduino gebruiken, dat ziet er zo uit: (micros() is een ingebakken timer)

(in declaratie)
unsigned long timer;

(in loop)
if(micros()-timer ==1000){
timer=micros();
..Doe hier iets.... wat 1x per seconde wordt gedaan...
}

succes... Rob

Berichten: 8
Geregistreerd: 07 Jan 2023, 09:55

Re: Servo programma wordt traag

Berichtdoor Harry » 09 Mrt 2023, 18:42

Bedankt voor je reactie, ik ben inderdaad een super beginner. Ik ga dit verder uitzoeken.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Servo programma wordt traag

Berichtdoor shooter » 10 Mrt 2023, 10:47

ik zou alle delays er resoluut uitgooien en dan eens kijken wat je programma doet als het goed is dan gaat elke servo draaien als je op een knop drukt. dan gaat het natuurlijk allemaaal super snel.
en dan gebruik je de timer millis() maar om een servo in een andere positie te zetten lekker proberen en zet de voedingen van de servos apart op een 5 V voeding want de arduino kan maar een servo vermogen geven.
paul deelen
shooter@home.nl

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: Servo programma wordt traag

Berichtdoor ThHe » 12 Mrt 2023, 00:08

Hierbij heb ik je eerste prgramma herschreven zonder delay.
Uitbreiden naar meer zal waarschinlijk wel lukken.
Succes!!!!

Code: Alles selecteren
#include <Servo.h>

Servo servo;         

int pos = 70;                           // variabele voor de positie van de servo
int switchPin = 12;                     // drukknop
int ledPin = 2;                         // ingebouwde LED
int switchStatus1 = LOW;                  // drukknop

// status 0 wachten tor de schakelaar wordt ingedrukt.
// status 1 servo naar 160
// status 2 servo naar  70
// status terug naar 0
int  status1     = 0;
long statusTime1 = 0;

// wordt uitgevoerd bij de start

void setup()
{
  pinMode(ledPin, OUTPUT);           
  pinMode(switchPin, INPUT);         
  servo.attach(3,350,2080);   
  servo.write(70);
  delay(350);
}


void loop()
{
  long t = millis();                          // huidige tijd
  switchStatus1 = digitalRead(switchPin);     // waarde van de schakelaar (LOW/HIGH)

   if (status1 == 0 && switchStatus1 == HIGH) // schakelaar ingedrukt (HIGH)
   {               
      digitalWrite(ledPin, HIGH);             // ingebouwde LED aan
      servo.write(160);  // servo naar 160
      status1     = 1;
      statusTime1 = t + 2000; // tijd om te draaien
   }
   if (status1 == 1 && t > statusTime1)
   {
      servo.write(700);  // Servo naar 70
      status1     = 2;
      statusTime1 = t + 2000; // tijd om te draaien
    }
    if (status1 == 2 && t > statusTime1)
    {
        status1 = 0;
        digitalWrite(ledPin, LOW);  // ingebouwde LED uit
    }
}

Berichten: 8
Geregistreerd: 07 Jan 2023, 09:55

Re: Servo programma wordt traag

Berichtdoor Harry » 12 Mrt 2023, 15:17

Enorm bedankt voor de reacties, er gaat een wereld voor me open.
Testopstelling draait nu.

Berichten: 1
Geregistreerd: 06 Sep 2023, 17:40

Re: Servo programma wordt traag

Berichtdoor BrunoCasino » 06 Sep 2023, 17:51

?sa

Terug naar Forum suggesties

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten