[Résolu] Compter impulsions capteur capcitif

Bonjour,

J'ai un moteur 220v controlé par un relais pilotable via arduino et j'ai egalement mis un capteur inductif derriére le moteur pour compter le nombre de tour (1 tour = 5 impulsions).

Mon probléme est que si je tourne le moteur à la main je vois bien mon compteur s'incrémenter mais si je mets le moteur en route, le compteur de s'incrémente plus et je vois qu'il se re-incrémente quand j'arrete le moteur (peut etre par ce qu'il tourne moins vite).

Voici mon code :

const int capteurInduPin = 2;
const int relaisPompePin = 6;
volatile int nbrTours = 0;
int nbrTours2 = 0;

void CompteurTours() {
  nbrTours++;
  //Serial.println("++");
}


void setup() {
  Serial.begin(9600);
  Serial.println(F("Demarrage !"));
  pinMode(relaisPompePin, OUTPUT);

  digitalWrite(relaisPompePin, LOW);

  pinMode(capteurInduPin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(capteurInduPin), CompteurTours, FALLING);

}

void loop() {
    detachInterrupt(capteurInduPin);
    //digitalWrite(relaisPompePin, LOW);

 // cli();
  nbrTours2 = nbrTours;
  delay(25);
  //sei();
 detachInterrupt(capteurInduPin);
  Serial.print("Nombre Impulsions = "), Serial.println(nbrTours);
  //delay(100);

}

Est ce mon capteur qui est trop lent ? ou un probléme de code ?

Capteur : LJ8A3-2-Z/BX-5V (pin 2 )
Relais 5v : pin 6

À quelle vitesse tourne le moteur ?

C’est quoi ces detachInterrupt?

Pourquoi commenter ces lignes et surtout pourquoi mettre ce delay ?

C'est un moteur asynchrone 220v qui tourne à 1500tr/min, mais sachant que j'ai 5 scotch en fer sur le ventilo à l'arriére, pour 1min je devrais avoir 1500*5 soit 7500impulsions par min.

le detachInterrupt c'était pour faire des tests car ca ne fonctionnait pas, mais il vaut mieux utiliser cli et sei.

Concernant le delais dans certains exemple il y était mais il ne sert à rien au final

edit : je suis sur un arduino nano, le capteur est alimenté en 5v tout comme le relais

Je pense que ta loop peut-être simplifiée :

void loop() {
  cli();
  Serial.println(nbrTours);
  sei();
}

Mais ça sera illisible... car ça ira trop vite.
Tu devrais faire un affichage du nombre d'impulsions cumulé sur une certaine durée, disons chaque demi seconde :

const int capteurInduPin = 2;
const int relaisPompePin = 6;
volatile int nbrTours = 0;
unsigned long period = 500ul; // 500 ms
unsigned long chrono;

void CompteurTours() {
  nbrTours++;
}


void setup() {
  Serial.begin(115200);
  Serial.println(F("Demarrage !"));
  pinMode(relaisPompePin, OUTPUT);
  digitalWrite(relaisPompePin, LOW);
  pinMode(capteurInduPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(capteurInduPin), CompteurTours, FALLING);
  Serial.print("Nombre Impulsions = ");
  chrono = millis();
}

void loop() {
  if (millis() - chrono > period) {
    chrono = millis();
    cli();
    Serial.println(nbrTours);
    sei();
    nbrTours = 0;
  }
}

Pense aussi à régler la console sur une vitesse supérieure, ici 115200 baud.
A tester...

merci, je viens de tester mais j'ai le meme probléme, moteur allumé voici mon resultat :
Demarrage !
Nombre Impulsions = Demarrage !
Nombre Impulsions = 0

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
3
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
6
20
8
1
0
0
0
0
0
0
0
0

C'est le nano qui alimente tout ça ou une alim 5V séparée ? Quelle puissance ton alim ?
Ton moteur génère peut-être des parasites qui perturbent le capteur ?

comme je disais quand je fais tourner le moteur à la main (ca tourne pas trés vite du coup) ca s'incrémente bien mais une fois le moteur allumé c'est autre chose.

J'ai une alim externe 220v vers 5v 2.5A qui alimente l'arduino et les capteurs.

comment puis je savoir si mon moteur génére des parasites ?

n'y a t il pas des limites physiques concernant mon capteur, si il y a trop de detections ?

On dirait que l’arduino à rebooté. Problème d’alimentation ?

je ne pense pas que ce soit un probléme d'alimentation mais peut être il est quand meme alimenté à la fois par VIN par le transfo 5v et à la fois en usb sur mon ordi pour avoir le debug

La doc indique 500Hz. Mais le pullup interne à l'ATmega est très élevé ce qui ne participe pas à une bonne performance aux "fréquences élevées"
Tu peux mettre une résistance beaucoup plus faible le capteur est capable de fournir jusqu'à 200mA. Essaye avec une résistance de 1K (voir 470 Ohms) au +5V.

V sur Vin n'alimente rien, il faut soit mettre au moins du 7V, soit utiliser l'E/S appelée 5V

Pendant toute l'écriture, les inters sont désactivées. Il vaut mieux utiliser une variable tampon.
la remise à 0 de nbrTours risque de ne pas être correcte si une interruption arrive au milieu de l'instruction. Il vaut mieux:

void loop() {
  if (millis() - chrono > period) {
    chrono = millis();
    cli();
      tampon = nbrTours;
      nbrTours = 0;
    sei();
    Serial.println(tampon);
  }
}

Mais à priori le programme ne semble pas en cause. Je pense comme @fdufnews que cela vient du capteur. Il faudrait faire l'essai avec une fréquence qui augmente, par exemple une pale montée sur une visseuse.

Pourquoi prendre un entier signé pour le nombre de tours?

la resistance il faut la mettre entre le +5v et la sortie du capteur ou juste sur la continuité du fil d'alim du capteur ?

Entre le +5v et la sortie du capteur. Cela fait une pullup avec une résistance plus faible, donc plus rapide.

Ok merci, je viens de tester avec une resistance de 1K et de 470 mais j'ai exactement le meme probléme.... ca reste à 0 des fois 1 ou 2...

J'en ai profité pour brancher le +5v sur le +5v de l'arduino au lieu du vin.

mais d'ou peut venir le probléme du coup pensez vous ?

essayez avec cette modification du code de @lesept

const byte              capteurInduPin = 2;
const byte              relaisPompePin = 6;
volatile unsigned long  nbrTours = 0;
const unsigned long     periode = 500ul; // 500 ms
unsigned long           chrono;

void CompteurTours() {
  nbrTours++;
}

void setup() {
  pinMode(relaisPompePin, OUTPUT);
  digitalWrite(relaisPompePin, LOW);
  pinMode(capteurInduPin, INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println(F("\nDémarrage !"));
  attachInterrupt(digitalPinToInterrupt(capteurInduPin), CompteurTours, FALLING);
  Serial.println("Nombre Impulsions");
  chrono = millis();
}

void loop() {
  if (millis() - chrono > periode) {
    cli();      // début section critique
    unsigned long nbrToursCopie = nbrTours;
    nbrTours = 0;
    sei();      // fin section critique
    Serial.println(nbrToursCopie);
    chrono = millis();
  }
}

je viens de tester ca me fait pareil (il y a la resistance de 470 ohm en plus)

Démarrage !
Nombre Impulsions
0
0
0
0
0
0
2
4
3
2
4
1
0
0
0
0
0
0
0
0
4
0
0
0
0
0
0
0
0
0
0
0
0
2
8
2
0
0
0

on voit que au début et à la fin quand le moteur se lance ça marche et aprés 0 tout le temps malgré que le moteur tourne

hello
selon la doc signalée par @fdufnews en #12, ton capteur inductif doit etre alimenté entre 6 et 36V DC,
c'est bien le cas ?

bonjour, non mon capteur est alimenté en 5V par une autre carte, mais ma version de capteur est vendue pour 5V, c'est meme specifié dans la ref inscrite dessus : LJ8A3-2-Z/BX-5V

Mais bon plus ca va plus je pense que ca vient du capteur , les autres que j'ai sont en effet en 6v-36v.