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

Go Up