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