Aller au contenu


FiringFox

Inscrit(e) (le) 20 févr. 2012
Déconnecté Dernière activité juil. 29 2013 06:41
-----

#39022 Contrôler variateur de vitesse moteur avec Arduino

Posté par FiringFox - 25 février 2012 - 02:37

Apparemment personne n'a envie d'utiliser des brushless ici smile.gif
Une vraie galère ces recherches mais j'ai quand même appris des choses utiles:
-les brushless se contrôlent avec la librairie Arduino pour servos (Arduino servos))
-Le problème est que les ESC ont des systèmes de sécurité pour empêcher le moteur d'être à 100% au démarrage et d'autres trucs comme ça. Donc sans initialisation à 0%, le moteur refuse de démarrer.
-les moteurs brushless se contrôlent par PWM : on leur envoie des impulsions électriques, plus elles sont longues, plus le moteur va tourner vite et réciproquement. L'intervalle est souvent défini entre 700µs et 2300µs (1500µs étant la position neutre (0%) mais ce n'est pas le cas pour tous les ensembles moteur/ESC. Si ce n'est pas marqué sur le manuel ou la fiche, il faut le déterminer mais c'est assez laborieux et risqué pour le moteur/ESC.

J'ai trouvé cet article en anglais que je trouve bien explicite : Driving a brushless DC motor using an Arduino
sur lequel ce code nous est fourni (j'ai supprimé les fonctions qui servaient à afficher à l'écran des valeurs et j'ai traduit/ajouté certains commentaires pour n'avoir que ce qui nous intéresse):

#include <Servo.h> // Pour contrôler le moteur on utilise la librairie servo.

Servo mServo; // Déclaration de la variable du moteur (semblable à celle d'un servo).

int inPotPin = 1; // Analog input pin #1 reads pot value (ici l'auteur du code emploie un potentiomètre pour réguler le régime de son brushless)
int outPinPPM = 11; // PPM output pin #11 (sortie prochainement attachée au moteur).

int throttlePulse = 1500; // Valeur de la largeur des impulsions, 1500 = 0%

int pulseDelay = 300; // Délais entre chaque impulsion (cette valeur varie-t-elle selon les moteurs/ESC ?)
int pulseMin = 700; // Largeur d'impuslion minimale, 700 = -100%
int pulseMax = 2300; // Largeur d'impulsion maximale, 2300 = +100%

void setup()
{
mServo.attach(outPinPPM, pulseMin, pulseMax); // Attache le moteur à outPinPPM (sortie 11), et déclare la fourchette de largeur d'impulsion.
mServo.writeMicroseconds(throttlePulse); // Initialise le moteur en régime neutre (0%) pour que la sécurité embarquée dans l'ESC ne refuse pas le démarrage du moteur.

}

void loop()
{
throttlePulse = map(analogRead(inPotPin), 0, 1023, pulseMin, pulseMax); // Etalonne la valeur sortante du pot pour correspondre à la fourchette de largeur d'impulsion.
mServo.writeMicroseconds(throttlePulse); // Envoie la valeur de largeur d'impulsion voulue à l'ESC pour obtenir la vitesse moteur souhaitée.
delayMicroseconds(pulseDelay); // Delais entre cette impulsion et la suivante.
}

Je n'ai pas encore reçu mon matériel alors je ne peux pas affirmer que cela marche, mais dés que possible je teste et poste mes résultats wink.gif Si tout se passe bien je ferai un tutorial.

Vive les monologues ! tongue.gif