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 :

Asservissement en courant Arduino


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 84
    Par défaut Asservissement en courant Arduino
    Bonjour à tous,

    Je viens de nouveau demander de l'aide sur ce forum en espérant qu'on pourra de nouveau m'aider.

    Description du système:
    Je dispose d'une carte Arduino UNO, d'un driver, de deux moteurs ainsi que d'un capteur de courant de type analogique.
    Le capteur de courant peut mesurer un courant allant de -5A à +5A. Mes moteurs consomment entre 70mA (à vide) et 1,6A (chage maximal et vitesse max).
    Le capteur de courant fonctionne de la manière suivante:
    Une tension de base de 2,5V est renvoyé sur un pin analogique de l'Arduino +/- 66mV en fonction du courant mesuré. 2,5V correspondant à 0A.

    Description de l'application souhaité:
    Je souhaiterais utiliser le capteur de courant pour réaliser un asservissement en courant. En effet, plus la charge sur les moteurs est importante plus les moteurs consomment.
    De ce fait, j'aimerais pouvoir réaliser la possibilité de stopper mes moteurs si le courant dépasse une certaine valeur. Autrement dit, j'aimerais pouvoir controler mes moteurs en fonction du courant mesuré à leurs bornes.

    Problème:
    Seulement voila le problème, je ne sais absolument pas comment réaliser cette boucle qui me permettrait de mesurer, par exemple, toute les 20ms le courant traversant les moteurs et utiliser cette mesure dans mon programme pour controler mes moteurs.

    Auriez-vous des conseils à me donner s'il vous plait?

    Je reste à votre disposition en cas de question. Par avance merci.

  2. #2
    Membre expérimenté
    Avatar de ChipsAlaMenthe
    Homme Profil pro
    Ingénieur en eau chaude et ballon rond
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur en eau chaude et ballon rond
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Par défaut
    Salut à toi! ^^

    Alors, concernant ce problème, j’ai déjà traité cela auparavant ^^.

    Etant donné que tu connais à chaque tour de boucle la valeur de ta tension grâce à ton capteur, c’est par ici qu’il faut commencer.

    Sur l’Arduino tu peux mesurer le temps écoulé depuis le début de son allumage, regarde du côté des timers aussi. (alors désolé de ne pas pouvoir te donner de code mais je ne suis pas chez moi en ce moment et ça remonte aussi à plus de deux ans ^^).

    Du coup, en récupérant la valeur du temps écoulé depuis le début de l’allumage, tu peux faire une différence avec l’ancienne valeur pour calculer un delta. Si ce delta est inférieur à 20ms alors ne le contrôle pas, sinon si c’est supérieur tu peux le contrôler ^^.

    Si cette réponse ne te satisfait pas, tu peux aussi utiliser les interruptions sur l’Arduino, c’est fiable, et au moins là tu auras toutes les 20ms ta valeur (avec un petit retard parfois mais léger ^^).


    J'espère que cette réponse te satisfait si j'ai bien compris tout ton problème

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 84
    Par défaut
    Bonjour,

    Vous avez bien compris mon problème. Seulement, je n'arrive pas à comprendre quelle fonction je dois utiliser pour récupérer la data fournis par le capteur.
    Je ne sais pas si je dois utiliser AnalogRead() ou une autre fonction.

    Concernant les timers, je dois télécharger une librairie pour cela non?

    Par avance merci.

  4. #4
    Membre expérimenté
    Avatar de ChipsAlaMenthe
    Homme Profil pro
    Ingénieur en eau chaude et ballon rond
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur en eau chaude et ballon rond
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Par défaut
    Re-salut ! ^^

    Alors, si tu as branché ton capteur sur l’entrée analogique, alors dans ce cas oui, tu dois utiliser Analog read de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Valeur de la pin analogique sur laquelle tu as branché ton capteur
    const int monCapteur = 3;
     
    int valeurLue = 0;
     
    void loop 
    {
        ...
        valeurLue = analogRead(monCapteur);
        ...
    }
    Pour le timer d'après mes souvenir la librairie est déjà présente donc tu n'a pas besoin de la télécharger, par contre tu dois include je crois #include <Time.h>.

    Pour les fonctions de temps, regarde la fonction "millis()" sur le site Arduino ainsi que les fonctions qui ressemblent (décrites plus bas dans la page Arduino). ^^



    Edit:
    Je ne sais pas pourquoi, mais je sens que tu vas avoir besoin à un moment de la fonction "map(...)", elle permet de recaler l'intervalle d'une valeur dans un autre ordre de grandeur, regarde sur le site Arduino pour en savoir plus, simple intuition .

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 84
    Par défaut
    Je vous remercie pour votre réponse.

    Je prends note. Je vais faire des tests. Je vous tiens au courant demain surement dans l'après midi.

    EDIT: Pour l'entrée du capteur c'est pas plutot sur le pin A0 (ou tout autre pin analogique) que je dois brancher mon capteur?

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 84
    Par défaut
    Avant de vouloir faire les tests, j'aimerais votre avis sur mon 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <Metro.h>
     
    //Define the interval
    Metro MyInterval = Metro(30);
     
    //Motor 1
    int pinAIN1 = 9; //Direction
    int pinAIN2 = 8; //Direction
    int pinPWMA = 3; //Speed
     
    //Motor 2
    int pinBIN1 = 11; //Direction
    int pinBIN2 = 12; //Direction
    int pinPWMB = 5; //Speed
     
    //Standby
    int pinSTDBY = 10;
     
    //Current sensor
    int pinCurrentSensor = 6;
    int CurrentValue = 0;
     
    void setup()
    {
    //Set the PIN Modes
      pinMode(pinAIN1, OUTPUT);
      pinMode(pinAIN2, OUTPUT);
      pinMode(pinBIN1, OUTPUT);
      pinMode(pinBIN2, OUTPUT);
      pinMode(pinSTDBY, OUTPUT);
      pinMode(pinPWMA, OUTPUT);
      pinMode(pinPWMB, OUTPUT);
      pinMode(pinCurrentSensor, INPUT);
    }
     
    void loop()
    {
      if(MyInterval.check() != 1) //Check if the metro has passed its interval
      {
        CurrentValue = analogRead(pinCurrentSensor);
        if(CurrentValue < 4)
        {
          digitalWrite(pinAIN1, HIGH);
          digitalWrite(pinAIN2, LOW);
          digitalWrite(pinBIN1, HIGH);
          digitalWrite(pinBIN2, LOW);
          digitalWrite(pinSTDBY, HIGH);
          analogWrite(pinPWMA,255);
          analogWrite(pinPWMB,127);
        }
        else
          digitalWrite(pinSTDBY, LOW);
      }
    }
    Je précise que le fichier d'en tete Metro est une librairie que j'ai téléchargé ici

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

Discussions similaires

  1. Réponses: 24
    Dernier message: 13/04/2013, 17h51
  2. Date courante
    Par missllyss dans le forum SQL
    Réponses: 5
    Dernier message: 29/08/2003, 11h09
  3. Exécuter la classe courante ??
    Par sami_c dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 17/03/2003, 17h47
  4. repertoire courant
    Par mobee dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/12/2002, 13h03
  5. [VB6] [Système] Tuer un processus courant
    Par mdoyer dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 22/10/2002, 14h47

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