J'utilise Arduino Uno et l'IDE 1.8.13 sous Windows 10 pour commander une machine tournante : deux fourches optiques comptent les tours de deux disque à fentes non solidaires, Ces fourches délivrent des signaux carrés qui me semblent corrects à l'oscillo et sont reliées aux interruptions des broches 3 et 4 . Mais le décompte fourni par l'un des deux disques est farfelu : je compte visuellement 10 tours et Arduino indique 1900 par exemple.
L'échange des broches ne change pas le problème. Est-ce que vous avez eu ce genre de problème ? Avez-vous une idée ou un conseil à me donner? Merci
Pardon : je viens d'essayer de changer le circuit de miseen forme du signal (trigger de Schmitt) et tout est rentré dans l'ordre. Pourtant l'oscillo ne montrait pas d'anomalie. Parasites ? Désolé pour la perte de temps.
hello
sur UNO tu as les interruptions sur D2 et D3.
j'aurais aimé voir ton programme.
Bonjour
Voici mon programme (machine à bobiner-débobiner) pour débobiner et mesurer la longueur de fil
//Générique débobinage 20/11/2022
//Déclarations spécifiques
int delai = 5000;
int pasparcouche = 2400;
int N = 12;
//Déclarations générales
unsigned long now = 0;
unsigned long old = 0;
bool sens;
volatile int flaghall = 0;
volatile int ODO = 0;
volatile int HALL = 0;
int pinHall = 2;
int pinOdo = 3;
int motor_pin_1 = 4;
int motor_pin_2 = 6;
int pinFc = 10;
int pinStop = 11;
int pinDp = 12;
int pinEn = 13;
int pas_courant = 1;
int nbrpas=0;
int I=0;
int SPIRES=0;
void setup() {
pinMode(pinHall, INPUT);
pinMode(pinOdo, INPUT);
pinMode(pinDp, INPUT);
pinMode(pinFc, INPUT);
pinMode(motor_pin_1, OUTPUT);
pinMode(motor_pin_2, OUTPUT);
pinMode(pinEn, OUTPUT);
pinMode(pinStop, OUTPUT);
digitalWrite(pinStop, LOW);
attachInterrupt(digitalPinToInterrupt(pinHall), hall, RISING);
attachInterrupt(digitalPinToInterrupt(pinOdo), odo, RISING);
Serial.begin(9600);
Serial.println("départ");
old = micros();
//home
digitalWrite(pinEn, HIGH);
sens = false;
while (digitalRead(pinFc) == LOW) {
now = micros();
if (now - old >= delai) {
stepper(pas_courant, sens);
old = micros();;
}
}
digitalWrite(pinEn, LOW);
sens = true;
}
void loop() {
Serial.println("boucle");
while (digitalRead(pinDp) == HIGH) {
if (nbrpas == pasparcouche) {
sens = !sens;
nbrpas = 0;
Serial.println("Changement de sens");
}
if (flaghall == 1) {
old = micros();
flaghall = 0;
digitalWrite(pinEn, HIGH);
I = 1;
while (I <= N) {
now = micros();
if (now - old >= delai) {
stepper(pas_courant,sens);
nbrpas++;
I++;
old=micros();
}
}
digitalWrite(pinEn, LOW);
SPIRES=SPIRES + N;
}
}
digitalWrite(pinStop, HIGH);
Serial.print("Valeur ODO : ");
Serial.print(ODO);
Serial.print(", correspondant à ");
Serial.print(ODO * 9.5 / 100);
Serial.print(" mètres de fil. Nombre de spires :");
Serial.println(SPIRES);
while (digitalRead(pinDp) == LOW) {
delay(1000);
old = micros();
}
}
void stepper(int pas, bool dir) {
if (dir) {
pas++;
if (pas == 4) {pas = 0;}
}
else {
pas--;
if (pas == -1) { pas = 3;}
}
pas_courant=pas;
switch (pas) {
case 0: // 01
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
break;
case 1: // 11
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
break;
case 2: // 10
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
break;
case 3: // 00
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
}
}
void hall() {
flaghall = 1;
HALL++;
}
void odo() {
ODO++;
}
ok, merci ![]()