Servo programma wordt traag
7 berichten
• Pagina 1 van 1
Servo programma wordt traag
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
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
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
Re: Servo programma wordt traag
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
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
Re: Servo programma wordt traag
Bedankt voor je reactie, ik ben inderdaad een super beginner. Ik ga dit verder uitzoeken.
Re: Servo programma wordt traag
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.
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
shooter@home.nl
Re: Servo programma wordt traag
Hierbij heb ik je eerste prgramma herschreven zonder delay.
Uitbreiden naar meer zal waarschinlijk wel lukken.
Succes!!!!
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
}
}
Re: Servo programma wordt traag
Enorm bedankt voor de reacties, er gaat een wereld voor me open.
Testopstelling draait nu.
Testopstelling draait nu.
7 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten