le capteur magnétique linéaire à effet Hall KY-024 réagit en présence d’un champ magnétique. Il est doté d’un potentiomètre permettant de régler la sensibilité du capteur et fournit deux sorties analogique et numérique.
Matériel
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- Module capteur à effet hall KY-024
Principe de fonctionnement
Le module KY-024 se compose d’un capteur linéaire à effet Hall SS49E et d’un comparateur différentiel double LM393, d’un potentiomètre BOCHEN 3296). Le comparateur couplé avec le potentiomètre permet de comparer la valeur du capteur avec une valeur seuil afin d’utiliser le capteur comme un capteur tout-ou-rien. Deux leds sont présentes sur le module. La led1 indique que le capteur est alimenté en tension et la led2 indique qu’un champ magnétique est détecté.
Schéma
Le capteur à effet hall a une sortie analogique et une sortie numérique. La sortie analogique renvoie une image de la mesure et la sortie numérique renvoi un état haut ou bas en fonction du seuil donné par le potentiomètre. Vous pouvez utiliser l’une ou l’autre selon votre application. Le module peu être alimenté par la sortie 5V du microcontrôleur.
Code
Pour tester le capteur, nous allons lire la sortie digitale et afficher la sortie analogique. Nous utilisons donc les fonctions analogRead et digitalRead.
//initiation des pins int ledPin = 13; //pin pour la LED int digitalPin = 2; //pin pour le capteur int analogPin = A0; //pin pour le capteur int digitalVal; int analogVal; void setup() { Serial.begin(9600); // vitesse de transmission pinMode(ledPin, OUTPUT); //la pin est en sortie pinMode(digitalPin, INPUT); //la pin est en entrée } void loop() { digitalVal = digitalRead(digitalPin); if (digitalVal == HIGH) //condition "si" : la valeur numérique est au niveau haut { digitalWrite(ledPin, HIGH); //alors la led s'allume } else { digitalWrite(ledPin, LOW); // sinon la led s'éteint ou reste éteinte } analogVal = analogRead(analogPin); Serial.println(analogVal); //afficher la valeur analogique delay(100); //délai 100ms }
Pour passer la valeur analogique an valeur physique, vous pouvez utiliser la fonction map()
//transforme la valeur de 0 à 1023 vers 0 à 5V int volt=map(analogVal, 0, 1023, 0, 5); //transforme la valeur lue en Gauss int gss = map(volt, 1, 4, -1000, 1000);
Résultat
Si vous approchez et éloignez un aimant du capteur, vous devriez voir la LED s’allumer et s’éteindre et la valeur du capteur changer.
Applications
- Réaliser un Gauss Mètre pour faire des mesures de champs magnétique.
Merci de.m’avoir t’aidée
Attention la fonction map travaille sur des entiers,
//transforme la valeur de 0 à 1023 vers 0 à 5V
int volt=map(analogVal, 0, 1023, 0, 5);
//transforme la valeur lue en Gauss
int gss = map(volt, 1, 4, -1000, 1000);
ne donnera en fin de compte que 4 valeurs distincts en sorties -1000,1000, -333, 333
pour garder la dynamique de la mesure sur 10 bits,
il faut garder la dynamique du map et donc au moins travailler en mv pour volt
int volt=map(analogVal,0,1023,0,5000);
puis garder cette dynamique pour la conversion suivante
int gss=map(volt,1000,4000,-1000,1000);
le faire en une fois élimine les arrondis de calcul intermédiares
int gss=map(analogVal,204,818,-1000,1000);
204 corrrespond à une sortie de 1v et donc à -1000 mG
818 correspond à une sortie analogique de 4v et donc à 1000 mG
L’autre solution est de développer une fonction mapFloat qui traite les entrées et les points de référence en flotant et donc qui évite un peu les erreurs d’arrondis lors des calculs.
float mapf(float value, float fromLow, float fromHigh, float toLow, float toHigh) {
float result;
result = (value – fromLow) * (toHigh – toLow) / (fromHigh – fromLow) + toLow;
return result;
}
et ensuite de transtyper automatiquement le résultat de la fonction en l’affectant à un int
int gss=mapf(analogVal,0,1023,204.6,818.4,-1000,1000);
curieusement lors des tests, la rapidité de mapf ne fait pas sourire. La fonction map n’est effectivement pas très rapide (fonction native arduino).
Bonne conversion