Besoin d'aide moteur brushless

Bonjour je me suis dis youpi une chose facile les moteusr brushless avec un esc sa se contrôle comme un servo c’est super facile ben NON.

Alors voila j’ai un moteur brushless et je voudrais juste faire tourner dans un premier temps. Mon problème c’est qui fait des bip totalement irrégulière et a chaque bip il y a une tentative de rotation avant de reprendre sa position d’origine.
C’est un moteur EMAX MT2213

voila le programme il et très simple je veux juste qu’il tourne:

#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).

void setup()
{
  
  mServo.attach(9); // Attache le moteur à outPinPPM (sortie 9), 
  mServo.write(90);  // 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()
{
  
  mServo.write(60); // Envoie la valeur de largeur d'impulsion voulue à l'ESC pour obtenir la vitesse moteur souhaitée.
  
}

Pour un moteur simple on utilise un montage autour du ULN2003A ou de darlingtons ce qui est pareil, via les PWM pour gérer la vitesse.

|500x337

C’est un brushless dont il parle …

Voilà les avancées que j'ai faite:

Niveau calibrage du esc normalement le esc devrait avoir une led et faire des bip se qui nous guide sur le mode de programmation. Mais dans mon cas se n'est pas la cas, c'est le moteur qui fait des bip mais je ne connais pas leur correspondance.

J'ai vue plusieurs poste ou il disait qu'il faut envoyer au ESC l'impulsion max et puis alimenter le ESC et 2 secondes après envoyer l'impulsion mini se qui nous fait passer en mode programmation. Après sa plus d'info sur comment le programmer. Une idée ?

J'ai aussi lu que ESC à une sécurité. S'il reçois pas une fréquence 50hz en continue et pas seulement à l'envoi de la commande il se mais en sécurité. Cette info ma beaucoup intéressé car je vois que le moteur bouge d'un poil avant de reprendre sa position et se stoppé. Mais comment maintenir cette fréquence de 50hz ?

Certains parle de la librairie softwareservo.h qui a une fonction refrech je vais aller chercher de se côté. Si vous avez des idées pour m'aider elle seront les biens venu.

L'esc étant possédant une intelligence, c'est en quelque sorte un peu libre ... Toutefois c'est bizarre puisque comme c'est pour du modélisme c'est sensé quand même respecté certains protocole (après je connais pas ce domaine donc je peux pas te donner de réponse précise).

Dans la lib servo tu as une méthode writeMicroseconds() :

writeMicroseconds() - Sets the servo pulse width in microseconds

Donc en mettant comme argument 20 tu devrais générer du 50 Hz

writeMicroseconds() permet de programmer la durée de l'impulsion pas sa récurrence.

Autant pour moi alors c'est du 50 Hz de base.

Oui sa j'ai déjà testé j'ai fait en write () et en writeMicroseconds () sa fait des bip et on sans le moteur entamé une rotation et se stoppé. C'est la le problème de se que j'ai lu on envoie la commande writeMicroseconds (1300) par exemple donc un signal en 50hz mais le signal et envoyé que au moment de l'envoie de la commande il est pas continue. C'est la qu'il parle de la fonction refrech de la librairie softwareservo.h mais comment l'utiliser ?

Les servos fonctionnent avec un signal permanent. Le signal doit avoir une récurrence de 20ms typique mais ils sont généralement assez tolérants.

Je serais très surpris que la librairie servo ne génère pas le signal en continu.

T'aurais pas un problème d'alimentation sur ton arduino?

fdufnews:
Je serais très surpris que la librairie servo ne génère pas le signal en continu.

bonjour
elle gere la sortie en continu
et le signal est conforme

testé avec ça a l’oscillo

#include <Servo.h>

Servo myservo;  // create servo object to control a servo


void setup()
{
  myservo.attach(9);  
  myservo.write(90);   
}

void loop() 
{ 
                             
}

Voilà se que j'ai trouver le 2ème poste et très intéressant. http://forum.arduino.cc/index.php?topic=168417.0

d’apres ce que j’ai compris
il y aurait une pseudo securité prevue par l’esc
il doit à sa mise sous tension recevoir un signal vitesse basse (servo 1ms) pendant un temps X avant d’accepter de faire son job.

essaye le prog ci-dessous (servo en pin9)
c’est pas beau mais c’est pour un test :grin:
testé à l’oscillo :
pendant 5 sec au reset de l’arduino , il genere à 50 Hz un signal servo au mini (1ms)
ça laisse le temps de brancher l’esc
apres 5 secondes , il fait de l’acceleration/deceleration par paliers de 25ms
il y a absolu continuité d’un signal à 50 Hz

#include <Servo.h>

Servo myservo;  


void setup()
{
  myservo.attach(9);  
  myservo.write(0); 
  delay(5000);  
}

void loop() 
{ 
for (int i=0; i <= 150; i++){ 
myservo.write(i); 
      
      delay(25); 
   } 
        for (int i=150; i > 0; i--){ 
myservo.write(i); 
      
      delay(25);                
} 
}

C'est a peut près le code que je me suis dis de tester se soir ve vois sa et vous fait un retour. Oscillo veux dire oscilloscope ? Car j'en ai pas.

Youpi j’ai fait démarrer le moteur il tourne même.
Merci a Artouste mais surtout a mon erreur je m’explique.

J’ai testé sont programme qui n’as pas marché. J’ai fait pliens d’autres test qui non toujours pas marché. Et en dernier espoir j’ai voulu testé le programme de dessus en writeMicroseconds () mais j’ai fait une erreur. J’ai changer les valeurs en mettant 2000 max au lieu de 150 sans changer le write en writeMicroseconds et la sa a marché au bout de quelques secondes environ 30 seconde et oui bien sur le programme a démarré a 0 mais pas le moteur. Donc j’ai fait un retour série de (i) pour voir a quelle valeur il démarré. Après sa j’ai pu déterminer la valeur mini ~ 1500 pour démarrer et la valeur max ~ 2100 je pense que je vais déterminer plus précisément avec un bouton a voir.
Le code utiliser :

#include <Servo.h>
 
Servo myservo;
 
 
void setup()
{
  Serial.begin(9600);
  myservo.attach(9);
  myservo.write(1500);
  delay(5000);
}
 
void loop()
{
for (int i=1500; i <= 2100; i++){
myservo.write(i);
Serial.println (i);
    
      delay(25);
   }
        for (int i=2100; i > 1500; i--){
myservo.write(i);
Serial.println (i);
      delay(25);              
}
}

Dans tous les cas sa marche mais j’ai aucune idée pourquoi sa marche ?
Sa dois être une question de calibrage mais comment le calibré ?
Après le moteur tourne que dans un seul sans comment changer le sens de rotation ?
Sur les forums il est dit que de write (90 à 180) c’est un sens et de (90 à 0) c’est l’autre mais je suis loin de ces valeur.

Salut,

Il n'est pas possible de faire changer le sens de rotation d'un moteur brushless à partir de l'arduino, il faut permuter deux des trois fils d'alimentations du moteur, ce type de moteur s'apparente à un moteur triphasé, donc pour inverser le sens de rotation il faut permuter deux phases.

@+

Merci de l'info j'ai fait la découverte d'un connecteur usb à esc. Afro USB et il sert a configurer les esc, youpi voila la réponse a toute mais question. Grâce à se connecteur et un logiciel on peut très facilement calibré un ESC et aussi modifier sont sens de rotation il coute dans les 15€. Vue que mon ESC et une version lite donc sans led ni avertisseur sonor se conneteur et indispensable, car la configuration avec l'arduino devient un casse tête infernal. Merci a vous. Je ferai une dernière retour dans j'aurais tester se connecteur.

Souhaites tu changer le sens de rotation du moteur en fonctionnement ?, si oui je ne comprend pas comment cela peut fonctionner sans inversion de 2 fils, à tu une doc du Afro USB.

@+

Non pas du tout les moteurs auront un sens fixe. Non je n'est pas de doc j'ai trouver une vidéo tuto qui expliqué comment faire. Mais je les plus prit pour le calibrage que le sens de rotation.

Et si il y a des ESC double sens, utile pour la marche arrière. Évidemment on n'en rencontre pas tellement sur les avions ^^

Cherche la lib motor.h, il me semble qu'elle existe et est plus adaptée pour le contrôle de moteur BLDC que la lib servo