IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Train d'impulsion servo-moteur SM-S4303R


Sujet :

Arduino

  1. #1
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut Train d'impulsion servo-moteur SM-S4303R
    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 : 2643
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
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    Bonjour,

    tu devrais passer par la bibliothèque servo qui est faite pour ça. La fonction delayMicroseconds n'est pas suffisamment précise pour ce que tu veux faire.

    Si tu veux une horloge plus précise tu as la bibliothèque ElapsedMillis (et en plus les fonctions sont non bloquantes).

  3. #3
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut
    Merci pour la réponse, et merci pour le bibliothèque. Par contre j'ai mis l'oscilloscope sur la pin 8 et le signal est a l'image du code et notamment la fonction delayMicroseconds. Par exemple j'ai bien 1ms a l'état haut pour delayMicroseconds(1000) etc..
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    A continuous rotation servo cannot be commanded to go to a specific position and stop, there is no way your arduino can tell what position it is at at any specific time. What you have now is a variable speed bi-directional geared motor, not a servo.
    en d'autres termes comme il te manque le retour pour déterminer exactement la position de ton servomoteur, tu ne peux pas t'arrêter précisément où tu veux. Malheureusement pour toi, ton servomoteur se comporte comme un moteur ordinaire même si ton horloge est très précise

    Par exemple, tu pourrais ajouter un système optique (comme ceux que l'on trouve dans les souris) sur l'axe de ton servo pour avoir un retour sur la position.

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir Julien

    Tu mesures 1ms, mais avec quelle précision? Car 1ms c'est 360° ce qui fait que 3µs par ° de rotation. Et 3µs c'est faible pour être mesuré à l'oscillo, surtout si il est calibré pour afficher les 20ms de la période. Avec un oscillo réglé à 2ms pour l'écran, cela fait 0.2ms par division et 40µs par marque (écran d'un analogique) donc en triggant sur le flan montant et n'affichant que le pulse, il est difficile de voir moins que une différence de 10° d'erreur sur le timing du pulse. Ceci avec un analogique comme j'ai appris, et même avec un numérique de qualité moyenne on ne fera pas beaucoup mieux.

    J'ai utilisé une seule fois un servo avec un ATmega, mais c'était en programmation ASM pure et il y a bien 10ans. La précision était plutôt bonne.
    Et depuis j'ai vu l'arrivée de servo toujours meilleur marché. j'ai aucune idée si la qualité est restée. Car comme l'a dit Auteur, c'est une commande en boucle ouverte. L'Arduino envoie une valeur, mais n'a aucun retour.

    Après il ne vaut pas mieux passer avec la sortie PWM en mode 16 bits?

    Edit: dans mon cas (un exo d'uni avec le code déjà préparé) on utilisait une boucle de timing codée en ASM directement donc très très stable en temps.

    Bonne soirée

    Delias

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 596
    Points : 56 682
    Points
    56 682
    Billets dans le blog
    40
    Par défaut



    Citation Envoyé par Auteur Voir le message
    en d'autres termes comme il te manque le retour pour déterminer exactement la position de ton servomoteur, tu ne peux pas t'arrêter précisément où tu veux. Malheureusement pour toi, ton servomoteur se comporte comme un moteur ordinaire même si ton horloge est très précise
    je ne comprends pas, je pensais au contraire qu'un servo (ceux utilisés en modélisme) était déjà un système asservi en position, avec le retour grâce à un potentiomètre ?

    à lire : https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    Normalement, oui, un servo tu as un retour sur la position. Mais là, comme indiqué dans la doc, c'est un servo "modifié" pour moi ça ressemble plus à un moteur pas à pas qu'à un servomoteur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Électronique] Avis, retour d'experience pour controle de moteurs pas à pas, servos-moteur
    Par Invité dans le forum Embarqué
    Réponses: 7
    Dernier message: 05/06/2015, 19h20
  2. Réponses: 1
    Dernier message: 13/05/2015, 09h34
  3. génerer train d'impulsion
    Par mannoutech dans le forum Signal
    Réponses: 1
    Dernier message: 02/03/2012, 15h27
  4. Créer un train d'impulsion
    Par MarZz dans le forum Simulink
    Réponses: 10
    Dernier message: 20/01/2010, 14h48
  5. [LabVIEW 8.5] Mettre en pause un train d'impulsion
    Par geoffrey.ru dans le forum LabVIEW
    Réponses: 2
    Dernier message: 25/06/2008, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo