Bonjour. Avant de vous présenter mon problème je m'excuse par avance pour la répétition de mes messages sur le même sujet depuis quelques mois.
Je suis donc toujours cet étudiant en deuxième année de prépa PSI qui essaye de faire tourner un moteur brushless. L'objectif est simplement de le faire tourner avec un programme Arduino à une vitesse constante et de pouvoir mesurer sa vitesse.
Ce que j'ai réussi à faire :
-> Utiliser un capteur à effet hall pour mesurer la vitesse : En plaçant un petit aimant de poids très négligeable et sur l'axe du moteur, lorsque l'information transmise par le capteur passe de 0 à 1 ou inversement (lecture digitale), ce qui correspond à la détection du pôle nord magnétique par le capteur, on peut compter le nombre de tours sur un intervalle de temps.
-> Donner une vitesse constante à mon moteur brushless. Il s'agit là de la première partie du programme qui utilise notamment l'information analogique d'un potentiomètre. En prenant identifiant l'esc comme un servo, j'arrive à obtenir une vitesse constante en communiquant l'information à mon ESC.
Mon problème qui ammène ce post :
-> Ce que je souhaite, c'est connaître la vitesse de mon moteur en fonction de la tension transmise par l'ESC. (pour pouvoir comparer avec le Kv constructeur en fait).
Je dois l'avouer j'ai un peu bidouillé jusqu'à ce que le moteur tourne. Je ne comprends pas très bien le rôle de la fonction servo() pour l'ESC.
Ce que je sais c'est que l'ESC est alimenté par une tension continue qu'il va transmettre au moteur + ou - à l'aide d'un signal PWM. Je ne comprends pas très bien en revanche comment ce fonctionnement se traduit dans mon programme...
Du coup je ne comprends pas très bien la valeur de tension reçue par mon moteur, mes calculs de Kv sont aberrants
-> J'ai également du mal à comprendre la fonction map() que j'utilise. Selon moi c'est un simple coefficient de proportionnalité en fait qui permet de parcourir deux intervalles de longueur différentes avec le même pas.
-> Je doute de la fiabilité de mon travail :
-J'obtiens bien un nombre de détections de l'aimant (donc un nombre de tours pour un intervalle de temps choisi), mais dans mon programme il y'a une ligne delay(1) qui semble être une pause nécessaire de 1ms avant répétition éventuelle de la boucle mais qui induirait de grosses erreurs en nombre de tours par la suite (si par exemple un tour n'est pas compté pendant cette milliseconde)
-Le potentiomètre à été une solution facile mais il est évident que je n'obtiens jamais la même vitesse suivant comment je le tourne. Je suis ouvert à toute proposition autre pour améliorer mon programme...
Je vous laisse mon programme pour mieux comprendre mon problème. Je m'excuse pour le vocabulaire un peu imprécis que j'emploie. Je pourrai si vous le souhaitez insérer une image par la suite pour vous montrer le montage. Bonne soirée à tous et merci d'avance pour vos réponses.
#include <Servo.h>
int valeur = 0; // Variable potentiomètre
Servo esc ;
int capteurpin = 2;
int sensorValue;
int lastsensorValue = LOW;
int compteur = 0 ;
unsigned long temps = 0;
unsigned long duree = 1000;
void setup() {
esc.attach(8);
esc.writeMicroseconds(1000); // On attribue la valeur min
Serial.begin(9600);
temps = millis();
}
void loop() {
// Lecture du potentiomètre pour régler la vitesse
valeur = analogRead(A0);
int valeuresc = map (valeur , 0 , 1023, 1000, 2000);
esc.writeMicroseconds(valeuresc); // On attribue la variable mappée qu'on attribue à l'esc
sensorValue = digitalRead(capteurpin);
if (( sensorValue == HIGH) && (lastsensorValue == LOW)) compteur++;
lastsensorValue = sensorValue;
delay(1);
if (millis() - temps > duree) {
temps = millis();
Serial.println(compteur);
Serial.println(valeur);
compteur = 0;
}
}