| 12
 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;
} | 
Partager