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 :

Arduino Nano et millis()


Sujet :

Arduino

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    972
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 972
    Par défaut Arduino Nano et millis()
    Bonjour à tous

    je dois entrainer à l'aide d'un petit moteur pas à pas un mécanisme d'horloge
    pour ce faire, la programmation se base sur la fonction millis() dans ce programme

    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
     
    #define MILLIS_PER_MIN 60000 // millisecondes par minute
    int port[4] = {7, 6, 5, 4};
     
    // Paramètres du moteur et de l'horloge
    #define STEPS_PER_ROTATION 1536 
     
    // attendre un seul pas du stepper
    int delaytime = 3;
     
    // séquence de la commande du moteur pas à pas
    int seq[4][4] = {
      {  LOW,  LOW, HIGH,  LOW},
      {  LOW,  LOW,  LOW, HIGH},
      { HIGH,  LOW,  LOW,  LOW},
      {  LOW, HIGH,  LOW,  LOW}
    };
     
    void rotate(int step) {
      static int phase = 0;
      int i, j;
      int delta = (step > 0) ? 1 : 3;
      int dt = 20;
     
      step = (step > 0) ? step : -step;
      for(j = 0; j < step; j++) {
        phase = (phase + delta) % 4;
        for(i = 0; i < 4; i++) {
          digitalWrite(port[i], seq[phase][i]);
        }
        delay(dt);
        if(dt > delaytime) dt--;
      }
      // power cut
      for(i = 0; i < 4; i++) {
        digitalWrite(port[i], LOW);
      }
    }
     
    void setup() {
      Serial.begin(9600);
      pinMode(port[0], OUTPUT);
      pinMode(port[1], OUTPUT);
      pinMode(port[2], OUTPUT);
      pinMode(port[3], OUTPUT);
      rotate(-10); // pour la course d'approche
      rotate(10); // l'approche fonctionne sans charge lourde
      rotate(STEPS_PER_ROTATION);
    }
     
    void loop() {
      static long prev_min = 0, prev_pos = 0;
      long min;
      static long pos;
     
      min = millis() / MILLIS_PER_MIN;
      if(prev_min == min)
      {
        return;
      }
      prev_min = min;
      pos = (STEPS_PER_ROTATION * min);
      rotate(-10); // pour la course d'approche
      rotate(10); // l'approche fonctionne sans charge lourde
      if(pos - prev_pos > 0) {
        rotate(pos - prev_pos);
      }
      prev_pos = pos;
    }
    Je constate une dérive légère sur 24h à savoir 120s
    le premier réflexe serait de diminuer
    #define MILLIS_PER_MIN 60000 =>> 59916 ( calcul estimé) pour compenser

    mais n'existe-t-il pas une autre approche plus fiable ?

    pascal
    Images attachées Images attachées  

Discussions similaires

  1. Conflit Arduino nano "clone" Yosemite 10.10.5
    Par Kogoro dans le forum Arduino
    Réponses: 0
    Dernier message: 20/06/2017, 12h57
  2. Réponses: 5
    Dernier message: 27/04/2017, 09h44
  3. A propos de LED_BUILTIN sur Arduino Nano
    Par Chamac dans le forum Arduino
    Réponses: 10
    Dernier message: 10/01/2017, 11h59
  4. Réponses: 8
    Dernier message: 23/12/2016, 19h06
  5. Thermocouple avec Arduino Nano v3.0
    Par redui dans le forum Arduino
    Réponses: 13
    Dernier message: 13/12/2016, 12h23

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