Contrôle d'un servomoteur, le delay

Bonjour,
Débutant, je souhaite arrêter un servomoteur durant 10 secondes puis le relancer par la suite dans la même loop. Avec un moteur cc il suffit d'un delay, mais pour le servo le delay ne sert qu'a temporiser la rotation...j'ai du mal à saisir...

 //Début de ma séquence
  digitalWrite(ETOILES, LOW);
  delay(5000); 
 
//le servo s'actionne
for (pos = 180; pos >= 0; pos -= 1) { 
    myservo.write(pos);             
    delay(30);  
// le servo s'arrête 10 sec     
}

 //puis suite de ma séquence...

  digitalWrite(FLASH, LOW);//allumer FLASH
  delay(300); 
  digitalWrite(FLASH, HIGH);//eteindre FLASH
  delay(6000); 

  for (pos = 180; pos >= 0; pos -= 1) { // 
    myservo.write(pos);             
    delay(30); 

// le servo s'arrête 10 sec                   
  }
 // puis suite de ma séquence...

Voila, quelqu'un aurait une piste?
Merci

kroust:
Bonjour,
Débutant, je souhaite arrêter un servomoteur durant 10 secondes puis le relancer par la suite dans la même loop. Avec un moteur cc il suffit d'un delay, mais pour le servo le delay ne sert qu'a temporiser la rotation...j'ai du mal à saisir...

bonjour
un "servo" est un actuateur commandé (par un signal "servo") , il prend et reste à la derniere position angulaire assignée

  • en l'absence d'un signal servo , un effort mecanique suffisant peut le faire ""bouger"
  • en presence d'un signal servo , le servo va agir pour compenser les efforts mecaniques externes

Merci pour ces infos, donc dans mon cas d'un servo 360 avec une roue, je ne peux pas lui dire de parcourir 30 cm, s'arrêter 10 secondes puis repartir? peut être en utilisant la méthode .detach() ?

kroust:
Merci pour ces infos, donc dans mon cas d'un servo 360 avec une roue, je ne peux pas lui dire de parcourir 30 cm, s'arrêter 10 secondes puis repartir? peut être en utilisant la méthode .detach() ?

expose mieux ton probleme, ce que tu a sous la main , ce que tu souhaite faire exactement

les "servo 360" sont generalement des servos modifiés (suppression de butées) pour faire de la variation de vitesse et plus du positionnement.

Voila un schéma. J'ai fais un montage avec un moteur cc qui fonctionne, seulement je n'ai pas assez de contrôle sur la vitesse c'est pourquoi le servo moteur serait plus adapté pour mon projet.

Dans le cas d'un "servo 360", lorsqu'on envoie une position neutre (90°) le moteur s'arrête.

kroust:
Voila un schéma. J'ai fais un montage avec un moteur cc qui fonctionne, seulement je n'ai pas assez de contrôle sur la vitesse c'est pourquoi le servo moteur serait plus adapté pour mon projet.

moteur cc, servo , ou autre
il manque là retour de l'info "fiable" de deplacement (déplacement effectivement effectué)
generalement là , l'info de deplacement est recupérée/reprise au travers d'encodeurs
Pour un tour de roue (circonference) = X impulsions

Une condition alors? du genre si ma roue exécute x tours alors je detach le servo...

Pour l'info des 90°, je vais essayer d 'envoyer une nouvelle position plus loin dans mon script

kroust:
Une condition alors? du genre si ma roue exécute x tours alors je detach le servo...

où/comment dispose tu actuellement de cette information essentiellement "primordiale" ? :sunglasses:

Merci pepe pour cette explication très clair! Donc si j'essaye ceci:

#include <Servo.h>
Servo myservo;

 // int pos = 0; //la position n'est donc plus utilisée donc je remplace par vitesse?

int vit= 0;

void setup() {
myservo.attach(9, 1, 2); //largeurs d'impulsions
}

void loop() {
  
  for (vit= 0; pos <= 360; pos += 1) { // 
    // marche avant
    myservo.write(vit);              
    delay(30);   
   }
 //puis suite de ma séquence...

  digitalWrite(FLASH, LOW);//allumer FLASH
  delay(300); 
  digitalWrite(FLASH, HIGH);//eteindre FLASH
  delay(6000); 
 

 for (vit= 0; pos <= 360; pos += 1,5) { // 
    // arrete le servo
    myservo.write(vit);              
    delay(30);   
   }

  }

...

Merci pour ces infos et le temps passé à les écrire. Je vais essayer d'appliquer tout ceci et réécrire mon croquis de ce pas.

Bonjour,
Voia j'ai réussi à modifier mon servo 180° pour en faire un rotation continue. Mon code

#include <Servo.h>

//#define writeSpeed(v) write(v+90)

int vit;

Servo monServomoteur;

void setup() {
 monServomoteur.attach(9, 1000, 2000);
monServomoteur.write(84);
}

void loop() {

 for (vit = 84; vit <= 180; vit += 2) { 
// marche avant
monServomoteur.write(vit);           
 delay(100);  
 
  }
//monServomoteur.detach();
}

Le servo tourne bien, mais lorsque je tente un retour avec la valeur 0 (for (vit = 84; vit <= 0; vit += 2), ça ne fonctionne pas. De plus, je me demande si il est possible de conserver une vitesse fixe? (car c'est pour cette raison l'utilisation du servo).

Pour la macro je vais essayer de l'appliquer

Bonjour,

Il faut décrémenter vit

for (vit = 84; vit >= 0; vit -= 2)

Merci, je venais juste de trouver ! :slight_smile:

Pour la vitesse de rotation cela reste encore obscure...

Au final : J'arrive a avoir les vitesses voulues et le temps de rotation.

#include <Servo.h>

int broche_servoA = 9;
int rotation_servoA = 1520;// VITESSE 1 
int rotation_servoB = 1000;// ARRIERE 
int rotation_servoC= 1500;// VITESSE 1 
int rotation_servoD= 1484;// NEUTRE  


Servo servoA;

void setup() {

 servoA.attach(broche_servoA);
 servoA.writeMicroseconds(rotation_servoA); 

}

void loop() {

   servoA.writeMicroseconds(rotation_servoA)  ;    // VITESSE 1        
 delay(3000);  
  servoA.writeMicroseconds(rotation_servoC);  // VITESSE 2
 delay(2000);   
   servoA.writeMicroseconds(rotation_servoD); // NEUTRE
 delay(5000);  
    servoA.writeMicroseconds(rotation_servoB)  ;    // // ARRIERE 1       
 delay(2000);  
 
  }