Go Down

Topic: Besoin d'aide pour capteur interrupteur à lame souple vitesse de rotation en km/ (Read 157 times) previous topic - next topic

Coto92

Bonjour je dois faire un projet pour mon lycée et je suis vraiment bloquer pour mon code en arduino ou je dois acquérir ma vitesse instantanée affichée en km/h à l'aide d'un capteur interrupteur a lame souple qui fonctionne comme le capteur a effet hall et je suis coincé pour mon code

Code: [Select]
/* constantes pour la broche de mesure */
const byte PIN_SIGNAL = 9;

/** Fonction setup() */
void setup() {
 
  /* Initialise le port série */
  Serial.begin(115200);
 
  /* Met la broche en entrée */ 
  pinMode(PIN_SIGNAL, INPUT_PULLUP);
}

/** Fonction loop() */
void loop() {
 
  /* Mesure la durée de la (demi) période */
  unsigned long periode = pulseIn(PIN_SIGNAL, LOW, 1000000) * 2;
 
  /* Affiche le résultat de la mesure en RPM */
  Serial.println(1000000 / periode * 60);
  delay(1000);
}


Et quand j'appuiie sur téleverser j'ouvre mon moniteur de série et cela m'affiche le chiffre 4294967236
 tous les 1 seconde je ne comprend pas pourquoi si vous pouviez m'aidez.
Merci

icare

2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

Coto92

Bonjour,
Voici mon montage arduino : https://www.noelshack.com/2019-14-5-1554449972-arduinooo.jpg

fdufnews

Code: [Select]

  /* Mesure la durée de la (demi) période */
  unsigned long periode = pulseIn(PIN_SIGNAL, LOW, 1000000) * 2;

Tu as pensé à soritr de pulseIn sur hors-temps c'est bien cela évite de bloquer le programme lorsque tu es statique. Mais tu ne testes pas ce cas. Si tu lis la doc de pulseIn() tu verras que pulseIn() retourne 0 lorsque la fonction retourne sur hors temps. Il faut tester ce cas sinon tu fais une division par zéro dans le calcul suivant.
Code: [Select]

  /* Affiche le résultat de la mesure en RPM */
  Serial.println(1000000 / periode * 60);
Dans ce calcul il faut spécifier les constantes comme flottants si tu veux que le calcul soit pertinent
Code: [Select]

  /* Affiche le résultat de la mesure en RPM */
  Serial.println(1000000.0 / periode * 60.0);

ou modifier l'ordre des opérandes si tu veux rester en entiers, et définir les constantes comme entiers longs
Code: [Select]

  /* Affiche le résultat de la mesure en RPM */
  Serial.println(60ul * 1000000ul / periode);


Mais avant tout, t'es-tu assuré que l'ILS délivrait bien un signal de rapport cyclique 50%?

bidouilleelec

Bonjour Coto92


pulseIn() renvoie une durée d'impulsion (durée entre LOW et HIGHT) pas une période.


Quote
Serial.println(60ul * 1000000ul / periode);
Le mieux est de mettre aussi des parenthèses :

Serial.println((60ul * 1000000ul ) / periode);

Cordialement,
bidouilleelec



JMe87

Bonjour,

concernant ton cablage, tu dois placer simplement ton ILS entre pin 9 et GND. C'est tout !!

Jacques

N.B. : sur la photo tu le places entre 5V et point milieu entre ta resistance (27K ?) et la resistance interne INPUT_PULLUP >> pas correct.

hbachetti

Plutôt 270K. Elle ne doit pas avoir beaucoup d'effet face à la pull-up interne. Autant dire que l'entrée est toujours à 1.
Il faut choisir. Soit pull-up interne, soit pull-down externe.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up