Go Down

Topic: servo beweging met een duur van x aantal tijd het kan maar hoe (Read 2 times) previous topic - next topic

wokkel94

Hey allemaal

Iedereen een gelukkig 2014 en nog bedankt op de reacties op  mijn vorige vragen

ik heb het eindelijk aan het lopen alleen iets te snel

mijn loopje ziet er zo uit :

Code: [Select]
void loop()
{
  // leest de drukknop ingang pin:
  buttonState = digitalRead(buttonPin);

  // if the state has changed, increment the counter
  if (buttonState == HIGH) {
    // if the current state is HIGH then the button
    // wend from off to on:

  servo1.write(90);
  servo2.write(90);
delay (1000);
  servo1.write(10);
  servo2.write(10);
delay (1000); 
  servo1.write(90);
  servo2.write(90);
delay (1000);
  servo1.write(10);
  servo2.write(10);
delay (1000);
  servo1.write(90);
  servo2.write(90);
delay (1000);



maar nu wil ik over de beweging van punt X tot punt X (hier dus 10 naar 90 of 90 naar 10) in een x aantal seconden doen

want nu gaat dat heel snel en ik wil dit vertragen

MVG Mark

DeepZ

Hier is een klein sketchje, gemaakt om een servo voor wisselbesturing te testen. Na het indrukken van de toets loopt de servo in 5 seconden van de ene naar de ander stand.

Code: [Select]

//Servo wissel motor control
#include <Servo.h>

#define SERVO_MIN 25                                    //Servo waarde voor kleinste hoek
#define SERVO_MAX 155                                   //Servo waarde voor grootste hoek
#define SERVO_TIME 5000                                 //Tijd (in millisec) voor omlopen

#define SERVO 2                                         //Servo uitgang op pin 2
#define TOETS 3                                         //Toets input op pin 3

Servo servo1;

void setup()
{
    pinMode(TOETS,INPUT_PULLUP);                        //Toets input, active low
   
    servo1.attach(SERVO);
    servo1.write(SERVO_MIN);                            //Zet servo in beginstand
}

void loop()
{
  unsigned long timer;
  unsigned long staptijd;
  unsigned int huidig = SERVO_MIN;                      //Huidige stand vand de servo
  unsigned int doel = SERVO_MIN;                        //Gewenste stand van de servo
  int richting;                                         //Positieve voor min naar max, negatief voor max naar min
 
  staptijd = SERVO_TIME / (SERVO_MAX - SERVO_MIN);      //Vertraging per stap om de gewenste looptijd te krijgen
 
  while (true) {
 
    while (digitalRead(TOETS) != LOW) {};                 //Zolang er geen toets gedrukt wordt.
   
    if (doel == SERVO_MIN) {                              //Stel de nieuwe gewenste hoek in
      doel = SERVO_MAX;
      richting = 1;
    } else {
      doel = SERVO_MIN;
      richting = -1;
    }
   
    while (huidig != doel) {
      huidig += richting;
      servo1.write(huidig);                               //Servo naar de volgende stap
      timer = millis();
      while ((millis() - timer) < staptijd) {};           //Wacht de berekende tijd voor de volgende stap
    }
 
    while (digitalRead(TOETS) != HIGH) {};                //Zolang de toets nog gedrukt wordt.
  }
}


Hopelijk kun je hier wat mee.

Mvg,
Guido

Jantje

Ik heb voor jou men wiebel library ingecheck op github.
Dat is volgens mij precies wat je nodig hebt.
hier kan je de code vinden https://github.com/jantje/libraries/tree/master/wiebel

Er zit geen sample programma en de onderstaande code is niet getest.
Code: [Select]

// Do not remove the include below
#include "Arduino.h"
#include "Servo.h"
#include "wiebel.h"

#define SERVO_MIN 25                                    //Servo waarde voor kleinste hoek
#define SERVO_MAX 155                                   //Servo waarde voor grootste hoek
#define SERVO_TIME 5000                                 //Tijd (in millisec) voor omlopen

#define SERVO 2                                         //Servo uitgang op pin 2
#define TOETS 3                                         //Toets input op pin 3

wiebel wiebelservo("mijn servo", SERVO);


void setup()
{
wiebelservo.setup();
pinMode(TOETS,INPUT_PULLUP);
}


void loop()
{
  int buttonState = digitalRead(TOETS);
  wiebelservo.loop();
if ( (wiebelservo.getActieStatus() == wiebel::niks_te_doen) &&(buttonState == HIGH))
{
wiebelservo.startWiebel(SERVO_MAX, SERVO_MIN, SERVO_TIME, SERVO_TIME, 0, 0, 0, 0, 1);
}
}

Veel geluk.
Jantje
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

MAS3

Quote from: wokkel94

ik heb het eindelijk aan het lopen alleen iets te snel
mijn loopje ziet er zo uit :

Code: [Select]
void loop()
{
  // leest de drukknop ingang pin:
  buttonState = digitalRead(buttonPin);

  // if the state has changed, increment the counter
  if (buttonState == HIGH) {
    // if the current state is HIGH then the button
    // wend from off to on:

  servo1.write(90);
  servo2.write(90);
delay (1000);
  servo1.write(10);
  servo2.write(10);
delay (1000); 
  enzo


maar nu wil ik over de beweging van punt X tot punt X (hier dus 10 naar 90 of 90 naar 10) in een x aantal seconden doen

want nu gaat dat heel snel en ik wil dit vertragen



Hoi Mark.

Wat je in je sketch doet, is een seconde wachten, dan je servo ineens de hoek insturen, dan nog een seconde wachten, en dan de servo de andere hoek insturen.
Als ik je vraag goed begrepen heb, wil je dat je servo in een seconde (en niet in een fractie daarvan) naar die hoek bewegen.
Als dat zo is, dan moet je niet ineens het commando geven om je servo in een bepaalde stand te zetten, maar je moet eerst de verdraaiing in stappen verdelen.
Daarvoor moet je uitrekenen hoe groot de stappen moeten zijn.
Je moet dan dus de tijd delen door het aantal graden dat je in totaal wil verdraaien.
Daarna moet je dus kijken of er al zoveel tijd voorbij is, en dan weer een graad verder draaien.
Als de tijd en het aantal graden constant zijn, hoef je niet telkens uit te rekenen hoe zich dat verhoudt, want dan worden dat constanten.
Alleen in dat geval kun je met delays werken.
Maar eigenlijk is het altijd beter om dat niet te doen en te werken zoals dat ook in het voorbeeld "blink without delay".

Hoe kleiner de stappen en de tijd ertussen, des te "soepeler" zal de beweging zijn.

Ik weet niet wat er in jantjes gewiebel gebeurt (ik heb het ook niet bekeken), dat ziet er uit als een zogenaamde black box.
Dat betekent: geen idee wat er intern gebeurt, als het maar werkt.
Natuurlijk kun je daar ook van leren, door uit te pluizen wat en hoe er dan gewiebeld word (de library ontleden dus).
Maar DeepZ' sketch doet wel zo ongeveer wat hierboven beschreven staat.
Het gaat er hier natuurlijk niet om dat je die sketch zo in je Arduino plempt en kijkt of het werkt, maar meer of jij ook begrijpt wat daar gebeurt.
Als dat niet zo is, dan kun je dus meer gerichte vragen stellen hierover.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

wokkel94

Bedankt allemaal voor de hulp

ik heb ergens anders deze code gevonden en die doet het ook voor mij !

https://github.com/netlabtoolkit/VarSpeedServo

is met een andere libary en werkt prima

Jantje

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

wokkel94

Ik krijg de libary die ik hierboven had gepost maar niet aan het werk

dus heb het op een nog andere manier gedaan

maar dit werkt voor geen meter ik snap het allemaal niet meer is het dan zo moeilijk om een script te maken
ik ben een beetje ten einde raad ik vind nergens wat en het werkt niet wat ik probeer of ik begrijp het niet

als iemand mij wil helpen met het uitwerken van mijn script alvast bedankt
dit wil ik :

ik heb 2 servo's en die dienen als ophaalbrug voor de lego london gate bridge

stappenplan:
stap 1:  druk op knop
stap 2: servo 1 en 2 gaan van 0° naar 90° maar doen over deze stap 5 seconden
stap 3: pauze 10 seconden
stap 4: servo 1 en 2 gaan van 90° naar 0° in 5 seconden
stap 5: herhaal stap 2,3 en 4 drie keer
stap 6: na de derde keer stap 2,3 en 4 te herhalen ga naar stap 1

dat is het dit lukt mij prima met
servo1.write(90);
servo2.write(90);
delay (10000);
servo1.write(0);
servo2.write(0);

maar zo kan ik de servo snelheid niet aanpassen wat ik dus met

  for (pos1 = 90; pos1 < 0; pos1 += 1)
  for (pos2 = 80; pos2 < 10; pos2 += 1)

    servo1.write(pos1);
    delay(150);
    servo2.write(pos2);
    delay(150);

wel kan
maar zodra ik het hiermee doe slaan mijn servos op hol

hieronder mijn laatste script

[spoiler]
Code: [Select]
#include <Servo.h>

Servo servo1;  // create servo object to control a servo
Servo servo2;  // a maximum of eight servo objects can be created

int pos1 = 0;    // variable to store the servo position
int pos2 = 0;

// this constant won't change:
const int  buttonPin = 2;    // drukknop positie
int buttonState = 0;         // huidig aantal gedrukte keren

void setup()
{
  servo1.attach(9);  // attaches the servo1 on pin 9 to the servo object
  servo2.attach(10);
  servo1.write(90);
  servo2.write(80);
 
  // Herkent de drukknop als ingang:
  pinMode(buttonPin, INPUT);
 

  // initialize serial communication:
  Serial.begin(9600);
}

void loop()
{
  // leest de drukknop ingang pin:
  buttonState = digitalRead(buttonPin);

  // if the state has changed, increment the counter
  if (buttonState == HIGH) {
    // if the current state is HIGH then the button
    // wend from off to on:
{
  for (pos1 = 90; pos1 < 0; pos1 += 1)
  for (pos2 = 80; pos2 < 10; pos2 += 1)

    servo1.write(pos1);
    delay(150);
    servo2.write(pos2);
    delay(150);
}
delay (10000);
{
  for(pos1 = 0; pos1 < 90; pos1 += 1)  // goes from 0 degrees to 180 degrees
  for(pos2 = 10; pos2 < 80; pos2 += 1)
   
    servo1.write(pos1);
    delay(150);
    servo2.write(pos2);
    delay(150);
  }
delay (10000); 
  {
  for (pos1= 90; pos1 <0; pos1 += 1)
  for (pos2 = 80; pos2 < 10; pos2 += 1)

    servo1.write(pos1);
    delay(150);
    servo2.write(pos2);
    delay(150);
  }
delay (10000); 
{
  for(pos1 = 0; pos1 < 90; pos1 += 1)  // goes from 0 degrees to 180 degrees
  for(pos2 = 10; pos2 < 80; pos2 += 1)
   
    servo1.write(pos1);
    delay(150);
    servo2.write(pos2);
    delay(150);
}
  }


  if (buttonState == LOW) {
   
    {
       
  }}
  else {
  }   
}






[/spoiler]
 

MAS3

Natuurlijk werkt dit niet.
Je gaat een for.. loop beginnen, en direct in die for.. loop begin je met een for.. loop.
Dan ga je ook nog eens de verkeerde kant op tellen.
Dus wat je zegt met:
Code: [Select]
  for (pos1 = 90; pos1 < 0; pos1 += 1)
  for (pos2 = 80; pos2 < 10; pos2 += 1)

Is : positie 1 is 90.
Zolang positie 1 kleiner als nul is, telkens met 1 verhogen (what the ???)
En dat ga je dus net zo lang doen tot de voorwaarde niet meer klopt (dan moet positie 1 dus niet meer kleiner zijn dan nul).
Je gaat dus van negentig optellen naar nul, zolang de variabele die begint bij negentig kleiner is als nul.
Ik kan je verklappen: dat gaat niet gebeuren.
Nou ga je terwijl je gaat optellen naar een kleiner getal, gelijk nog een keer een soortgelijke test doen.
Die test verhoogt een andere variabele die begint bij 80,  zolang die variabele kleiner is als 10.
Hoe vaak zou die test worden uitgevoerd ?

Waarom vergelijk je de eerste simpele sketch met de tweede ingewikkelder maar foute sketch ?
Wat je daar beschrijft zijn 2 hele verschillende dingen.
Als je de goede vergelijking pakt, en ook nog naar de goede kant gaat tellen, doen ze nog niet allebei hetzelfde, het komt er niet eens in de buurt.

Je hoeft maar 1 variabele te tellen.
Die variabele schrijf je naar beide servo's.
Dan wacht je heel even.
En dan ga je dit weer van voor af aan doen (de variabele vergroten of verkleinen, net wat je wil.

Je maakt het jezelf veel te moeilijk, das nergens voor nodig.
Houd het simpel.
Probeer het eerst met 1 servo voor mekaar te krijgen, en bedenk dan wat je moet doen omdat met 2 stuks synchroon te doen.
Als je dat eenmaal voor mekaar hebt, snap je zelf niet meer waar al die moeilijkheid vandaan kwam.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

wokkel94

Ja inderdaad niet goed naar gekeken :(

for(pos1 = 90; pos1 >= 10; pos1 -= 1) // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    servo1.write(pos1);              // tell servo to go to position in variable 'pos'
     
    pos2 = pos1 - 8;
    servo2.write(pos2);
    delay(15);                       // waits 15ms for the servo to reach the position
  }

heb hem nu zo

MAS3

Vergeet niet om code tags te gebruiken als je code plaatst.

Je maakt een verschil tussen servo 1 en servo 2.
Ik heb gemist dat je daar over vertelt, dat dat de bedoeling is en waarom.
In je simpele code waar direct 90 graden gedaan word, is dat verschil er niet.
En er zal zo ook altijd (na de eerste keer heen en weer) een verschil zijn tussen de standen van de servo's, dus ook in de eindstand.
Is dat wel de bedoeling ?
Als dat niet de bedoeling is, dan is dat heel goed oplosbaar.
Maar dan moeten we eerst weten of de beweging nu wel in de buurt komt van wat je wil.
Dat betekent dus uploaden en testen.
Heb je je model al klaar, of ben je nog 'droog' aan het oefenen ?
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up