Vitesse de rotation avec un capteur effet hall

Bonjour, est-ce que c’est possible d’avoir de l’aide, j’ai un projet qui a pour but de savoir la vitesse de rotation d’un tourniquet (manège) j’ai donc pris un capteur a effet hall (dont la caracteristique est en piece jointe) mais etant vraiment pas très fort en codage arduino je vous demande de l’aide. Je sais que sa a été demander plusieurs fois pour savoir la vitesse de rotation avec un capteur a effet hall mais j’ai essayer leurs programes modifier bien evidemment avec les conseils donner en dessous mais sa ne marche pas sa affiche toujour 0.
voici le programme donner dans la caractéristique du capteur pour aider :
int Led = 13 ; // define LED Interface
int SENSOR = 10 ; // define the Hall magnetic sensor interface
int val ; // define numeric variables val
void setup ()
{
pinMode (Led, OUTPUT) ; // define LED as output interface
pinMode (SENSOR, INPUT) ; // define the Hall magnetic sensor line as input
}
void loop ()
{
val = digitalRead (SENSOR) ; // read sensor line
if (val == LOW) // when the Hall sensor detects a magnetic field,Arduino LED lights up
{
digitalWrite (Led, HIGH);
}
{
digitalWrite (Led, LOW);
}
}
J’aimerais pouvoir le changer pour que au lieu qu’il allumme la LED il affiche la vitesse de rotation sachant que j’aurais 4 aimant sur mon tourniquet je sais déja qu’il faudra faire un produit en croix qui ressemblera un peut près a sa:
//rpm = [nbre de rotations depuis le dernier calcul]/[temps écoulé en ms]*[60000ms(=1min)]/[nbre de trous]
rpm = (float)rpmcount/(millis() - timeold)*60000.0/nbTrous;

Merci de votre aide si possible :slight_smile:

IDUINO SE054 HALL SENSOR MODUL.pdf (577 KB)

Met ton code entre balises CODE et utilise l'indentation automatique dans l'IDE (CTRL T), ça donne ça :

int Led = 13 ; // define LED Interface
int SENSOR = 10 ; // define the Hall magnetic sensor interface
int val ; // define numeric variables val
void setup ()
{
  pinMode (Led, OUTPUT) ; // define LED as output interface
  pinMode (SENSOR, INPUT) ; // define the Hall magnetic sensor line as input
}
void loop ()
{
  val = digitalRead (SENSOR) ; // read sensor line
  if (val == LOW) // when the Hall sensor detects a magnetic field,Arduino LED lights up
  {
    digitalWrite (Led, HIGH);
  }
  {
    digitalWrite (Led, LOW);
  }
}

C'est plus lisible...

Pour calculer la vitesse de rotation, il faut que tu chronomètres le temps entre deux passages des aimants.
Selon que ce temps se mesure en microsecondes ou en millisecondes (donc selon la vitesse de rotation), tu peux utiliser la fonction micros() ou la fonction millis().

Le principe est le même : à chaque passage d'aimant, tu stockes le temps de passage. Tu calcules l'intervalle de temps Dt entre cette valeur stockée et la précédente valeur (par simple différence) et tu calcules la vitesse. Si c'est une vitesse angulaire, elle vaut

pi / 2 / (Dt / K)

(en supposant 4 aimants régulièrement répartis sur la circonférence), si c'est une vitesse "linéaire", c'est
pi / 2 / (Dt / K) * Roù R est le rayon du tourniquet (à l'endroit où se trouvent les aimants)
K est une constante pour obtenir des secondes : 1000 pour la fonction millis, 1000000 pour micros.

Merci je tacherais de mettre les balises code la prochaine fois

Escusez moi mais javais déja compris mon prof m'avais déja expliquer ca j'avais oublier de le dire désolé, mais juste le problème c'est que je ne suis pas très fort en arduino ducoup je sais pas comment stocké à chaque passage d'aimant le temp de passage, ni meme calculer l'intervalle de temp entre ces valeurs stockés =(

Et pour la vitesse je vais la calculer en tour par min et sachant que je vais faire a l'aide de millis et que il y a 4 aimant je sais que il faut faire le calcule suivant:
(0,25 x 1)/ (dt/60000) = nombre de tours par min (je divise par 60000 l'intervalle de temp entre chaque aimant pour pouvoir mettre en min le temp et le 0,25 c'est car entre deux aimants ca feras que un quart d'un tour soit 0,25 tour)

En quelque sorte pour ce projet je connais la partie technique mais pas la partie codage sous arduino.

Dans ton code, il faut que tu lises le chrono au passage de l'aimant et que tu calcules la vitesse instantanée à ce moment.
La fonction millis code le temps en long : tu dois définir le temps de référence par
long temps_de_reference = 0; au début du code

Ensuite, lorsque le capteur détecte le passage, tu calcules la différence de temps avec cette référence puis la vitesse. Je verrais bien un truc comme ça :

int Led = 13 ; // define LED Interface
int SENSOR = 10 ; // define the Hall magnetic sensor interface
int val ; // define numeric variables val
long temps_de_reference = 0;

void setup ()
{
  Serial.begin(9600);
  pinMode (Led, OUTPUT) ; // define LED as output interface
  pinMode (SENSOR, INPUT) ; // define the Hall magnetic sensor line as input
}

void loop ()
{
  val = digitalRead (SENSOR) ; // read sensor line
  if (val == LOW) // when the Hall sensor detects a magnetic field,Arduino LED lights up
  {
    digitalWrite (Led, HIGH); // Clignotement de la LED au passage de l'aimant
    long intervalle = millis() - temps_de_reference;
    //
    // ici le calcul de la vitesse
    //
    Serial.print("Vitesse : ");
    Serial.println(vitesse_calculée);
    temps_de_reference = millis();  // mise à jour référence pour le prochain passage
  }
  else
  {
    digitalWrite (Led, LOW);
  }
}

Franchement merci beaucoup sa m'a vraiment beaucoup aider a comprendre et aussi a j'espère réusssir mon projet.

Enfaite petit problème pour le calcul j'ai rajouter une ligne mais je pense j'ai du faire une erreur car après sa me surligne serialprintln pouvais vous me dire se que j'ai fais de mal pour le calcul merci.

int Led = 13 ; // define LED Interface
int SENSOR = 10 ; // define the Hall magnetic sensor interface
int val ; // define numeric variables val
long temps_de_reference = 0;

void setup ()
{
  Serial.begin(9600);
  pinMode (Led, OUTPUT) ; // define LED as output interface
  pinMode (SENSOR, INPUT) ; // define the Hall magnetic sensor line as input
}

void loop ()
{
  val = digitalRead (SENSOR) ; // read sensor line
  if (val == LOW) // when the Hall sensor detects a magnetic field,Arduino LED lights up
  {
    digitalWrite (Led, HIGH); // Clignotement de la LED au passage de l'aimant
    long intervalle = millis() - temps_de_reference;
    vitesse_calculée = long intervalle/60000*0,25;
    Serial.print("Vitesse : ");
    Serial.println(vitesse_calculée);
    temps_de_reference = millis();  // mise à jour référence pour le prochain passage
  }
  else
  {
    digitalWrite (Led, LOW);
  }
}

[/quote]

1 Like

La variable vitesse_calculée n'est pas définie, il faut :

float vitesse_calculée = intervalle/60000*0,25;

j'ai changée le code avec float sa a rien changée c'est encore marquée que ce n'est pas déclarée
en message d'erreur sa me met ca comme message d'erreur:

vitesse_de_rotation_avec_capteur_effet_hall:5: error: stray '\303' in program

 long vitesse_calculée = 0;

 ^

vitesse_de_rotation_avec_capteur_effet_hall:5: error: stray '\251' in program

vitesse_de_rotation_avec_capteur_effet_hall:21: error: stray '\303' in program

     float vitesse_calculée = intervalle/60000*0,25; // calcule pour convertire le temp en minute et mettre par tour et non en  1/4 de tour

     ^

vitesse_de_rotation_avec_capteur_effet_hall:21: error: stray '\251' in program

vitesse_de_rotation_avec_capteur_effet_hall:23: error: stray '\303' in program

     Serial.println(vitesse_calculée); // afficher après "vitesse :" la vitesse calculée

     ^

vitesse_de_rotation_avec_capteur_effet_hall:23: error: stray '\251' in program

vitesse_de_rotation_avec_capteur_effet_hall:5: error: expected initializer before 'e'

 long vitesse_calculée = 0;

                      ^

C:\Users\hadj\Desktop\vitesse_de_rotation_avec_capteur_effet_hall\vitesse_de_rotation_avec_capteur_effet_hall.ino: In function 'void loop()':

vitesse_de_rotation_avec_capteur_effet_hall:21: error: expected initializer before 'e'

     float vitesse_calculée = intervalle/60000*0,25; // calcule pour convertire le temp en minute et mettre par tour et non en  1/4 de tour

                           ^

vitesse_de_rotation_avec_capteur_effet_hall:23: error: 'vitesse_calcul' was not declared in this scope

     Serial.println(vitesse_calculée); // afficher après "vitesse :" la vitesse calculée

                    ^

exit status 1
stray '\303' in program

[/quote]

C’est de ma faute : il ne faut pas d’accent dans le nom d’une variable

ca me met un moin long message d’erreur mais sa me m’en met toujours un, sa me met ca:

Les options de compilation ont été modifiées, tout sera recompilé
C:\Users\hadj\Desktop\vitesse_de_rotation_avec_capteur_effet_hall\vitesse_de_rotation_avec_capteur_effet_hall.ino: In function 'void loop()':

vitesse_de_rotation_avec_capteur_effet_hall:20: error: expected unqualified-id before numeric constant

     float vitesse_calculee = intervalle/60000*0,25; // calcule pour convertire le temp en minute et mettre par tour et non en  1/4 de tour

                                                 ^

exit status 1
expected unqualified-id before numeric constant

[/quote]

Essaye avec 0.25 au lieu de 0,25

Oui c’est bon ca marche merci beaucoup!!