Bonsoir a tous,

que ca fait plaisir de revenir un peu sur le forum de l'embarqué...

Actuellement j'essaye de piloter un servo-moteur SM-S4303R avec une arduino uno (je m'y suis mis par curiosité), cependant je n'arrive pas a créer un mouvement 0°-180°-0°-180° etc... de manière répétable il semblerait que le zéro ce décale lors de chaque retour.

Ceci est mon premier pb puis pour le second je n'ai pas encore trouvé un doc me donnant le train d'impulsion pour piloter ce servo-moteur.

Exemple:

Nom : train3imp.png
Affichages : 2775
Taille : 58,6 Ko

1 ms ==> 0°
1.5ms ==> 180°
2ms ==> 360°

Ci-joint un bout de code qui ne fonctionne pas très bien mais ca peut vous donner un idée:

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
Commande de servo-moteur par impulsion
Le servo est connecté au pin 8 de l'arduino
*/
int periode=20;// période entre chaque début d'impulsion en microsecondes
int pinServo=8; // variable pour le pin connecté à la commande du servo
 
void setup() {
  pinMode(pinServo,OUTPUT);// on prépare le pin en mode OUTPUT
  digitalWrite(pinServo,LOW); // on l'initialise à l'état bas
}
 
//boucle principale
void loop() {
  for (int angle=0;angle<=180;angle+=20){//on fait varier l'angle de 0 à 180° par tranche de 20°
    setAngle(angle);// on appelle la fonction setAngle définie plus bas
  }
}
 
//fonction setAngle pour envoyer les impulsions
void setAngle(int a){
  int duree=map(a,0,179,1000,2000);// on transforme l'angle en microsecondes et on stocke dans la variable duree
  int duree_back=map(a,0,179,2000,1000);// on transforme l'angle en microsecondes et on stocke dans la variable duree
  digitalWrite(pinServo,LOW);//on met le pin à l'état bas
 
  // la boucle qui suit est nécessaire 
  // pour laisser le temps au servo d'aller à sa position
  for (int t=0;t<25;t++){ 
    digitalWrite(pinServo,HIGH);// on envoie l'impulsion
    delayMicroseconds(duree); // pendant la bonne durée
    digitalWrite(pinServo,LOW); // on stoppe l'impulsion
    delay(periode-(duree*0.001)); // on attend le temps restant pour atteindre la période
  }
  for (int t=0;t<25;t++){ 
    digitalWrite(pinServo,HIGH);// on envoie l'impulsion
    delayMicroseconds(duree_back); // pendant la bonne durée
    digitalWrite(pinServo,LOW); // on stoppe l'impulsion
    delay(periode-(duree_back*0.001)); // on attend le temps restant pour atteindre la période
  }
}

Merci de votre aide