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 :

Contrôler mon moteur pas à pas (avec un driver)


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Contrôler mon moteur pas à pas (avec un driver)
    Bonjour,

    Je suis encore novice dans le monde d'Arduino et je doit réaliser un projet dans lequel je doit contrôler la vitesse d'un moteur et son sens de rotation.

    Ayant fait quelque recherches, je suis tombé sur ce lien : https://dronebotworkshop.com/big-stepper-motors/ qui explique comment contrôler la vitesse et le sens de rotation d'un moteur pas à pas NEMA 23 à l'aide d'un driver. Pour ce faire il incorpore dans son circuit un potentiomètre (pour contrôler la vitesse) et un bouton (pour contrôler le sens de rotation du moteur).

    Ma question est : Comment je pourrais faire pour contrôler la vitesse et le sens de rotation depuis l'algorithme sans passer par le potentiomètre et le bouton? C'est à dire que j'aimerai rentrer une certaine valeur depuis l'algorithme qui correspondrait à la vitesse de rotation du moteur et une autre valeur pour contrôler la fréquence de changement de rotation du moteur (sans utiliser de potentiomètre et de bouton).

    Voilà mon code actuel :

    Code : 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
    // Defin pins
     
    int reverseSwitch = 2;  // Push button for reverse
    int driverPUL = 7;    // PUL- pin
    int driverDIR = 6;    // DIR- pin
    int spd = A0;     // Potentiometer
     
    // Variables
     
    int pd = 500;       // Pulse Delay period
    boolean setdir = LOW; // Set Direction
     
    // Interrupt Handler
     
    void revmotor () {
     
      setdir = !setdir;
     
    }
     
     
    void setup( ) {
     
      pinMode (driverPUL, OUTPUT);
      pinMode (driverDIR, OUTPUT);
      attachInterrupt(digitalPinToInterrupt(reverseSwitch), revmotor, FALLING);
     
    }
     
    void loop() {
     
      pd = map((analogRead(spd)), 0, 1023, 2000, 50);
      digitalWrite(driverDIR, setdir);
      digitalWrite(driverPUL, HIGH);
      delayMicroseconds(pd);
      digitalWrite(driverPUL, LOW);
      delayMicroseconds(pd);
     
    }

    Merci beaucoup pour toutes réponses de votre part, je vous en suit très reconnaissant.

    (PS: j'ai essayer de cherche sur internet comment faire mais je n'y arrive vraiment pas, car je n'ai quasiment aucune notion en ce langage de programmation et quasiment aucune en Arduino....)

  2. #2
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour scientistK
    Citation Envoyé par scientistK Voir le message
    j'ai essayer de cherche sur internet comment faire mais je n'y arrive vraiment pas, car je n'ai quasiment aucune notion en ce langage de programmation et quasiment aucune en Arduino....)
    Est-tu au moins familiarisé avec l'IDE Arduino, as-tu réussi à faire "tourner" quelques exemples?
    As-tu réussi à faire tourner ton MPAP avec le programme exemple que tu as fourni?

    Citation Envoyé par scientistK Voir le message
    Ma question est : Comment je pourrais faire pour contrôler la vitesse et le sens de rotation depuis l'algorithme sans passer par le potentiomètre et le bouton? C'est à dire que j'aimerai rentrer une certaine valeur....
    Celà veut dire que tu aimerai introduire cette valeur manuellement via le moniteur de l'IDE Arduino, par exemple?

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    "Est-tu au moins familiarisé avec l'IDE Arduino, as-tu réussi à faire "tourner" quelques exemples?
    As-tu réussi à faire tourner ton MPAP avec le programme exemple que tu as fourni?"
    Oui j'ai réussi à faire clignoter une diode et j'ai réussi à faire tourner le moteur avec l'algorithme que j'ai fourni, mais je n'ai rien fait de plus. Donc je ne suis pas très très familier avec l'IDE d'Arduino.

    "Celà veut dire que tu aimerai introduire cette valeur manuellement via le moniteur de l'IDE Arduino, par exemple?"
    Oui voilà, c'est qu'en fonction des valeurs que je rentre dans l'IDE, le moteur tournera à une vitesse fixe et changera de sens de rotation à une fréquence fixe.

  4. #4
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour scientistK

    Citation Envoyé par scientistK Voir le message
    Oui j'ai réussi à faire clignoter une diode et j'ai réussi à faire tourner le moteur avec l'algorithme que j'ai fourni...
    C'est déjà un bon bout de fait .

    Citation Envoyé par scientistK Voir le message
    Oui voilà, c'est qu'en fonction des valeurs que je rentre dans l'IDE, le moteur tournera à une vitesse fixe et changera de sens de rotation à une fréquence fixe.
    Pour ce faire, je te donnes un bout de programme pour te montrer comment "capturer" des commandes et ensuite, les traiter, à méditer et étudier.
    Code : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    /*-------------------------------------------------------------------------------------------------
    	Commande de moteur pas a pas (MPAP)
    	par introduction de commandes dans le moniteur de l'IDE Arduino
     
    	jpbbricole 03.11.2019 pour scientistK
     
    	Les commandes seront, par exemple:
    	VIT=33   DIR=CW ou DIR=CCW etc.
    	Les commandes ne sont pas sensibles majuscule/minuscule
    '--------------------------------------------------------------------------------------------------
    */
     
    //---------------------- Réception de commandes du moniteur
    bool cmdNouvelle = false;                                            // Si une nouvelle commande a été reçue
    String cmdCommande = "";                                             // Texte de la commande
    String cmdParametre = "";                                            // Parametre de la commande
    int cmdParametreNum = 0;                                              // Parametre de la commande en numerique
     
    void setup()
    {
    	Serial.begin(115200);
    	delay(250);
    }
    void loop()
    {
    	serialEvent();
    	if (cmdNouvelle)                                           // Si une nouvelle commande depuis le moniteur
    	{
    		cmdExecution(cmdCommande);
     
    		cmdCommande = "";
    		cmdNouvelle = false;
    	}
    }
     
    //===================================== Commandes
    void cmdExecution(String cmdText)                                       
    {
    	cmdText.toUpperCase();                                           // Commande en majuscules
    	int cmdSepPosition = cmdText.indexOf("=");                       // Recherche du séparateur =
    	cmdCommande = cmdText.substring(0, cmdSepPosition);              // Extraction de la commande
    	cmdCommande.replace(" ", "");                                    // Enlever les espaces "parasites"
    	cmdParametre = cmdText.substring(cmdSepPosition + 1);            // Extraction du parametre	
    	cmdParametreNum = cmdParametre.toInt();                          // Parametre en numerique
     
    	if (cmdCommande == "VIT")
    	{
    		Serial.println("Mettre la vitesse du MPAP a: " + String(cmdParametreNum));		
    	} 
    	else if (cmdCommande == "DIR")
    	{
    		Serial.println("Mettre le sens de rotation du MPAP en: " + cmdParametre);        // CW et sens des aiguilles et CCW le contraire
    	}
    	// mettre les autres evaluations de commandes ici
    	else
    	{
    		Serial.println("Commande >>> " + cmdText + " <<< INCONNUE !!!");                 // Commande inconnue
    	}
    }
     
    //---------------------------------------------------------------------------------------
    // Réception de commandes depuis le moniteur
    //---------------------------------------------------------------------------------------
    void serialEvent()                                         // IDE monitor
    {
    	while (Serial.available())
    	{
    		char monChar = (char)Serial.read();                // Caractere recu du moniteur serie (IDE)
    		if (monChar == '\n')                               // Si caractere nouvelle ligne (\n)recu = fin de commande
    		{
    			cmdNouvelle  = true;
    		}
    		else
    		{
    			if (monChar >= ' ') {cmdCommande += monChar;}          // >= ' ' pour supprimer tout les caracteres de controle.
    				                                                   // plus petits que l'espace, voire table ASCII
    		}
    	}
    }
    Pour ce qui est du bout de programme fourni dans l'exemple, il fait sûrement tourner ton MPAP (je ne l'ai pas essayé!) mais il est préférable, dans ton cas, d'utiliser une bibliothèque qui gère les MPAP, ton MPAP tournera mieux et plus régulièrement et surtout, sa gestion (dans la bibliothèque) est écrite par un ou des "PROS"
    J'utilise, souvent, la bibliothèque AccelStepper bien documentée ici, installes-là et fait des essais.
    Pour toi, l'initialisation sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int driverPUL = 7;    // PUL- pin
    int driverDIR = 6;    // DIR- pin
    AccelStepper mystepper(1, driverPUL, driverDIR);
    A+
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut Passage par référence versus copie
    Salut à toutes et tous.

    Dans ce cas où le message reçu n'a pas vocation à être conservé, une petite astuce pour optimiser les performances et la mémoire sur le code proposé ci dessous.
    Au lieu de la définition de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void cmdExecution(String cmdText) {...}
    il serait intéressant d'écrire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void cmdExecution(String& cmdText) {...}
    Ce petit & n'a l'air de rien mais il va dire au compilateur de passer la chaîne en référence et non plus en copie (duplication). Le code va donc aller plus vite et mangera moins de mémoire à l'exécution (pas la peine d'allouer la mémoire pour la duplication de la chaîne et pas la peine de copier toutes les informations de la première chaîne dans la seconde, pour ensuite à la fin de la fonction passer encore du temps pour détruire l'objet et libérer la mémoire).


    Pour voir ce qu'il se passe au niveau des pointeurs voilà un petit code:

    Code : 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
    String message;
     
    void imprimeStringReference(String& unTexte)
    {
      Serial.print(F("adresse de unTexte en mode Reference = 0x")); Serial.println((uint16_t) &unTexte, HEX);
      Serial.println(unTexte);
      unTexte = "au revoir"; // on modifie en fait la String message, il n'y a pas eu de copie locale
    }
     
    void imprimeStringCopy(String unTexte)
    {
      Serial.print(F("adresse de unTexte en mode Copy = 0x")); Serial.println((uint16_t) &unTexte, HEX);
      Serial.println(unTexte);
      unTexte = "au revoir"; // on modifie la copie locale, qui ensuite est virée de la mémoire
    }
     
    void setup() {
      Serial.begin(115200);
      Serial.print(F("adresse de message = 0x")); Serial.println((uint16_t) &message, HEX);
      Serial.println();
     
      message = String("Bonjour, T=") + String(millis()) + String(" ms"); // dynamique pour éviter une optimisation du compilateur
      imprimeStringCopy(message);
      Serial.print(F("apres appel par copy, le message est: "));
      Serial.println(message);
      Serial.println();
     
      imprimeStringReference(message);
      Serial.print(F("apres appel par reference, le message est: "));
      Serial.println(message);
    }
     
    void loop() {}
    On peut voir dans ce qui est imprimé que dans la version avec duplication les adresse mémoire des instances sont différentes alors que par référence elles sont identiques

    sur mon MEGA ça donne ceci en sortie:

    adresse de message = 0x2DC <--- variable globale

    adresse de unTexte en mode Copy = 0x21C8 <--- variable locale, duplication
    Bonjour, T=0 ms
    apres appel par copy, le message est: Bonjour, T=0 ms <--- et donc on n'a pas modifié la variable globale

    adresse de unTexte en mode Reference = 0x2DC <--- on retrouve bien l'adresse de la variable globale
    Bonjour, T=0 ms
    apres appel par reference, le message est: au revoir <--- et donc on a modifié la variable globale




    ---

    En aparté, il vaut mieux éviter d'utiliser la classe String si le programme doit tourner longtemps car toutes ces copies (surtout si la taille des Strings peut changer) risquent de faire des trous dans le tas et donc au bout d'un moment on risque de ne plus pouvoir allouer de la mémoire pour une nouvelle String

Discussions similaires

  1. [Wamp] Le service Wampapache ne démarre pas avec les drivers de sql serveur
    Par 3Fred9 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 13/12/2012, 15h17
  2. mon premier pas avec builder c++ problem avec une string grid
    Par chahinerue6 dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/01/2010, 21h42
  3. Réponses: 2
    Dernier message: 31/07/2006, 08h48
  4. Mon script fonctionne avec un bouton, mais pas avec l'image!
    Par julien.63 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/04/2006, 16h26
  5. Réponses: 7
    Dernier message: 24/01/2006, 11h03

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