Piloter Moteur Brushless avec variteur en PWM (type RC) depuis Arduino uno SMD

Bonjour à toutes et à tous,

Je suis actuellement en stage dans le cadre de mes études et j'ai pour projet de réaliser grâce a un arduino (type défini plus bas) un banc pour la programmation d'un variateur de vitesse (la ref ci-dessous aussi).

Donc je vous le disais je boss sur un banc de prog pour un variateur pour moteur brushless dont voici la

référence ROXXY BL-Control 918 de la marque robbe (lien "http://www.live-hobby.de/en/Brushless-

Regler-Motoren/Regler/Robbe-Roxxy-BL-Control-918-Brushless-Regler-18A-8628-1-8628.html")

et je possède donc un arduino uno SMD edition (photo en PJ).

Le problème c'est qu'on veut que je que je pilote le moteur Brushless (dont je n'ai pas la ref bien sur

!!! :cry: ) en PWM (je précise pas le pwm normal le pwm pour RC).

J'aurais voulut savoir si quelqu'un savais comment je pourrais faire pour le piloter ????

J'ai déjà fait quelque recherche sur les forums de modélisme en autre sans résultat convaiquant

Puis j'ai trouver par hasard un prog qui permet de "créée" en gros un pwm;

int STATE = 1;
int Arming_Time = 0;
int PIN_PWM = 9;
int Led =13;
int pulse = 1000;


void setup() 
{
  //Serial.print(9600);
  pinMode(PIN_PWM, OUTPUT);
  for (Arming_Time = 0; Arming_Time < 500; Arming_Time += 1)
  { 
    digitalWrite(PIN_PWM,HIGH);
    delayMicroseconds(1100);
    digitalWrite(PIN_PWM, LOW);
    delay(20-(pulse/1000));
    
  }
}

void loop() 
{
  for (pulse=1150;pulse<=1700;pulse ++)
  {
    digitalWrite(PIN_PWM, HIGH);
    delayMicroseconds(pulse);
    //Serial.print("Je suis dans la premiere boucle et la valeur est :");
    //Serial.print(pulse);
    digitalWrite(PIN_PWM,LOW);
    delay(20-(pulse/1000));
    clignote1();
    
  }
  for (pulse=1700;pulse>=1150;pulse --)
{
  digitalWrite(PIN_PWM,HIGH);
  delayMicroseconds(pulse);
  Serial.println("Je suis dans la deuxieme boucle et la valeur est :");
  Serial.println(pulse);
  digitalWrite(PIN_PWM,LOW);
  delay(20-(pulse/1000));
  clignote2();

}
}
void clignote1()
{
// on allume la led
digitalWrite(Led, HIGH);
// on attends une seconde
delay(30);
// on éteint la led
digitalWrite(Led, LOW);
// on attends une seconde
delay(30);
// et on recommence (ne jamais oublier la dernière attente)
}



void clignote2()
{
// on allume la led
digitalWrite(Led, HIGH);
// on attends une seconde
delay(100);
// on éteint la led
digitalWrite(Led, LOW);
// on attends une seconde
delay(100);
// et on recommence (ne jamais oublier la dernière attente)
}

Mais ce n'est pas ce que je veut réaliser malheureusement (mais le code fonctionne au moins y a ça)

Je ne sais pas trop quoi dire d'autre c'est mon tout premier post et je reste à votre entière disposition pour tout renseignement supp

En tout cas merci d'avance a ceux qui me répondront

Cordialement Mania_Supra

Cela se commande exactement comme un servo par un Arduino. (il y a des librairies qui font ça)
Il y a plein de liens si tu cherches "ESC Brushless Arduino" sur la toile.

Salut cassiope34,

Déjà merci pour ta rapide réponse mais c'est déjà un ESC pour brushless et tu parle de le commander comme un servo ???? c'est a dire ??

En faite déjà je cherche les différences entres le PWM dit "normale" ou on modifie le rapport cyclique avec une fréquence fixe alors que moi je veut faire l'inverse comme en modelisme le PWM dit "Radiocommandé" ou on modifie la fréquence mais ou le rapport cyclique reste le même (Et on dit merci qui ?? Merci Jaquie et Mich..... heu non dsl merci wiki voila le lien pour le pwm rc :Servo control - Wikipedia
Et le pwm "normale" :Modulation de largeur d'impulsion — Wikipédia

Ton ESC tu le branche où dans ton véhicule radiocommandé.... sur le récepteur.

Et ton récepteur y commande quoi.... des servos.

Ton ESC se commande comme un servo tu charges la librairie qui va bien et surtout, surtout tu fais un peu de recherche avant de faire et dire n'importe nawak....

C'est pas trop dur.... >>> "pwm servo" >>>> google

https://www.google.ch/search?q=pwm+servomoteur&biw=1276&bih=664&source=lnms&tbm=isch&sa=X&ved=0CAYQ_AUoAWoVChMIp_zFqreKxgIVxG8UCh2TigAe#imgrc=_

salut en fait tu cherche à réaliser quoi exactement? pouvoir gérer la vitesse de rotation de t'es moteur dans le code ?

Re a tous le monde,

Merci pour vos réponse tout d'abord et je vais vous répondre tous a chacun votre tour;

-Jean-François pour ce qui est du montage il ressemble a ceci en PJ (sauf la batterie qui est en faites une alim 12V DC 1.25A et mon varia commande un moteur brushless dont je n'ai malheureusement pas la doc

-Pour toi thalios je veux réaliser a partir d'un UNO un Programme me permettant de "programmer" mon varia car dans sa config de base il ne tourne que dans un sens alors que mon tuteur veut qu'il tour dans les deux sens. Certe on peut le programmer manuellement mais le but de l'exo est que dès qu'on le branche sur ce UNO "Modifié" le varia se programme instantanément.

Tout d'abord mon objectif premier est d'arriver a piloter mon moteur et a comprendre comment il fonctionne.Suite a ça je ferais le programme qui permettra de prog le varia.

Je vous tiens au jus de mon avancement,si il vous faut plus de renseignement n’hésiter pas.

ok alors je peux te dire quelque truc. Il faut savoir qu'un esc (nom de ton variateur) doit s'initialiser avant le démarrage c'est a dire l'étalonner. Il faut donc lui envoyer pendant en général 2000 Ms sa vitesse de rotation min puis sa vitesse de rotation max. En général ca se trouve entre 900 et 2000 (vitesse de ton cycle). As tu fait cette initialisation ?
Apres si le moteur ne doit tourner que dans un sens c'est facile tu inverse ton branchement c'est a dire les trois cables sortant de l'esc qui sont branchés au moteur tu prend les cables des extrémités et inverse le branchement.
Pour qu'il tourne dans les deux sens c'est justement ce rapport cyclique à changer encore il faut trouver la plage de fonctionnement. Qu'as tu à ta disposition pour ce projet ?

Salut thalios,

quand tu parle de l'initialiser je croit que vois de quoi tu veut parler, tu parle du son quand il s'allume.
Pour ce qui est de la vitesse il me semble de connaissance que c'est de l'ordre de ce que tu m'as dit effectivement mais ça doit être ordre là ;"Servo control - Wikipedia" paragraphe 1 t'as des image et une brève expication.
Deplus ton idée d'inverser les fils (PS:déjà essayer lors du test moteur) est très bien mais tous est soudé (comme par hasard "gaine thermo dessus je précise").

Pour ce qui ai de ce que j'ai de dispo c'est vite vu
Je fouine de mon côté dans tout les cas ;

-Le web
-Mon tuteur (Quand il a le temps vu que c'est le patron)
-mes connaissances perso (pas top top !!!)
-le manuelle de prog du varia
-quel appareil de mesure style multi mètre (enfin morceau de multi qui date de la préhistoire) et un ocillo

c'est a peu près tout
Je continue a fouiner de mon côté

haha un vrai stagiaire quoi les font de tiroir c'est pour toi !! :slight_smile:

ok alors moi j'ai fait un quadri copter avec des moteurs brushless je peux te filer un bout de code qui te permettra de le faire s'initialiser puis après rentrer dans une boucle ou tu n'as qua mettre dans la console arduino la vitesse que tu désire comprise entre 0 et 100.

thalios:
haha un vrai stagiaire quoi les font de tiroir c'est pour toi !! :slight_smile:

ok alors moi j'ai fait un quadri copter avec des moteurs brushless je peux te filer un bout de code qui te permettra de le faire s'initialiser puis après rentrer dans une boucle ou tu n'as qua mettre dans la console arduino la vitesse que tu désire comprise entre 0 et 100.

Et oui monsieur :sunglasses: #ThugLife!!!

Bon trêve de plaisanterie, ça serait super intéressent pour moi d'avoir ton code (tu sais ce qu'on dit sur les informaticiens/programmeurs qu'ils sont fainéant (c'est une blague :smiley: ) )Mais j'aimerais vraiment faire ce code moi même au pire je peut recup le tiens pour faire mon projet et te le modifier et te le renvoyer par suite au cas ou tu veuille t'en reservir comme ça c'est tout benef pour nous deux

yes je suis d'humeur partageante je t'écrit ca a peut près bien pour que tu puisse tester rapidement. Et par contre je suis preneur de ton code final oui que tu auras fait avec. ( d'ici 5 min je poste le code)

Mania_Supra:
Et oui monsieur :sunglasses: #ThugLife!!!

Si tu veut une photo du multi que j'utilise en PJ tu va pleurer jt'e jure tu vas mourir de rire :smiley: :smiley: :smiley:

voila Dropbox - 20150603_170130[1].jpg - Simplify your life

thalios:
yes je suis d'humeur partageante je t'écrit ca a peut près bien pour que tu puisse tester rapidement. Et par contre je suis preneur de ton code final oui que tu auras fait avec. ( d'ici 5 min je poste le code)

Y a pas de souci c'est la moindre des choses quand même

Voila le code il est dans ces première version car la tout est en chantier dans le nouveau, il y a des techniques barbares et des trucs moches mais ca te permettra surmement de comprendre le fonctionnement des brushless.
Si le code marche pas du premier coups vérifie les parenthèse et le bordel quoi une erreur peut s'être glissée.
Si ta besoin hésite pas a me contacter.

#include <Servo.h> //utilisation de la bibliothèque servo
int vitesseActuelle;    // Vitesse actuelle du moteur
int vitesseEnReception; // Vitesse en cours de réception
Servo servo1;
int a =0;
unsigned long tempoEcriture;
 
 void setup(){
   delay(1000);
  servo1.attach(A0);
  Serial.begin(9600);
  vitesseActuelle = 0;
  vitesseEnReception = 0;
  tempoEcriture = 0;
 Serial.println("fin du setup ");
 Serial.println("Debut de l'initialisation des esc ");
  delay(1000);
}
 
void loop() {
    unsigned long tempoActuel = millis();
   

      if (tempoActuel <= 5000){  //initialisation des esc puissance max pendant 2000 Ms
        servo1.writeMicroseconds(1964);
        Serial.print("vitesse du moteur ");
         Serial.println("1964");
        tempoEcriture = tempoActuel;
      }
      if (tempoActuel >= 5001&& a==0){ //initialisation des esc au minimum pendant 2000 Ms
        servo1.writeMicroseconds(960);
        Serial.print("vitesse du moteur ");
         Serial.println("960");
        tempoEcriture = tempoActuel;
      } //initialisation des esc terminée 
      if (tempoActuel >=8002 && a==0){ //ce controle avec a est barbare mais c'est du temporaire
        a=1;
         Serial.println("Initialisation OK. Ready to flight up pour un decolage manuel pour la saisie");
      }

char inByte =Serial.read(); 
    
       Serial.println("manuel saisir les valeurs");
    while(Serial.available()!='n'){
      // Réccupération du temps actuel :
    unsigned long tempoActuel = millis();
     
    // Lecture des données du serial si il y en a :
    while (Serial.available() > 0) {
         
        char inByte = Serial.read();
         
        // Si l'on reçoit un chiffre, on l'affect à vitesseEnReception
        if ( ( inByte >= '0' ) ){//&& ( inByte <= '9' ) ) {
            vitesseEnReception = ( ( vitesseEnReception * 10 ) + ( inByte - '0' ) );
        }
         
        // Si on reçoit un \n, on affecte vitesseEnReception à vitesseActuelle
        if ( inByte == '\n' ) {
            // Petite protection pour ne pas affecter n'importe quoi dans vitesseActuelle
            if ( ( vitesseEnReception >= 0 ) && ( vitesseEnReception <= 100 ) ) {
                vitesseActuelle = vitesseEnReception;
            }
            // Puis remise à zero de vitesseEnReception
            vitesseEnReception = 0;
        }         
    
    }

  if ( ( tempoActuel - tempoEcriture ) >= 80 ){  //ici 80 mais tu peu descendre jusqu'a 20ms il me semble
        
        // Affectation de la vitesse
        // Note : ( 1000 + ( v * 20 ) ) permet d'écrire une vitesse entre 1000 et 2000 si v est entre 0 et 100
        servo1.writeMicroseconds( 1000 + ( vitesseActuelle * 20 ) );
        Serial.print("vitesse du moteur");
         //Serial.println(1000 + ( vitesseActuelle * 20 ));
         Serial.println(vitesseActuelle);
         Serial.println(" ");
        tempoEcriture = tempoActuel;      
            }
         }   
    }

ps:N'oubli pas de télécharger et d'installer la bibliothèque Servo

Si tu veut une photo du multi que j'utilise en PJ tu va pleurer jt'e jure tu vas mourir de rire :smiley: :smiley: :smiley:

voila Dropbox - 20150603_170130[1].jpg - Simplify your life

hahahah le multi !! même un galvanomètre fait moins vieux que ca !

thalios:
hahahah le multi !! même un galvanomètre fait moins vieux que ca !

Collertor le truc srx et t'a pas vu le cablâge (la ça va mieux) mais au début pour piloter une led j'avais pas de breakboard

thalios:
Voila le code il est dans ces première version car la tout est en chantier dans le nouveau, il y a des techniques barbares et des trucs moches mais ca te permettra surmement de comprendre le fonctionnement des brushless.
Si le code marche pas du premier coups vérifie les parenthèse et le bordel quoi une erreur peut s'être glissée.
Si ta besoin hésite pas a me contacter.

#include <Servo.h> //utilisation de la bibliothèque servo

int vitesseActuelle;    // Vitesse actuelle du moteur
int vitesseEnReception; // Vitesse en cours de réception
Servo servo1;
int a =0;
unsigned long tempoEcriture;

void setup(){
  delay(1000);
  servo1.attach(A0);
  Serial.begin(9600);
  vitesseActuelle = 0;
  vitesseEnReception = 0;
  tempoEcriture = 0;
Serial.println("fin du setup ");
Serial.println("Debut de l'initialisation des esc ");
  delay(1000);
}

void loop() {
    unsigned long tempoActuel = millis();

if (tempoActuel <= 5000){  //initialisation des esc puissance max pendant 2000 Ms
        servo1.writeMicroseconds(1964);
        Serial.print("vitesse du moteur ");
        Serial.println("1964");
        tempoEcriture = tempoActuel;
      }
      if (tempoActuel >= 5001&& a==0){ //initialisation des esc au minimum pendant 2000 Ms
        servo1.writeMicroseconds(960);
        Serial.print("vitesse du moteur ");
        Serial.println("960");
        tempoEcriture = tempoActuel;
      } //initialisation des esc terminée
      if (tempoActuel >=8002 && a==0){ //ce controle avec a est barbare mais c'est du temporaire
        a=1;
        Serial.println("Initialisation OK. Ready to flight up pour un decolage manuel pour la saisie");
      }

char inByte =Serial.read();
   
      Serial.println("manuel saisir les valeurs");
    while(Serial.available()!='n'){
      // Réccupération du temps actuel :
    unsigned long tempoActuel = millis();
   
    // Lecture des données du serial si il y en a :
    while (Serial.available() > 0) {
       
        char inByte = Serial.read();
       
        // Si l'on reçoit un chiffre, on l'affect à vitesseEnReception
        if ( ( inByte >= '0' ) ){//&& ( inByte <= '9' ) ) {
            vitesseEnReception = ( ( vitesseEnReception * 10 ) + ( inByte - '0' ) );
        }
       
        // Si on reçoit un \n, on affecte vitesseEnReception à vitesseActuelle
        if ( inByte == '\n' ) {
            // Petite protection pour ne pas affecter n'importe quoi dans vitesseActuelle
            if ( ( vitesseEnReception >= 0 ) && ( vitesseEnReception <= 100 ) ) {
                vitesseActuelle = vitesseEnReception;
            }
            // Puis remise à zero de vitesseEnReception
            vitesseEnReception = 0;
        }       
   
    }

if ( ( tempoActuel - tempoEcriture ) >= 80 ){  //ici 80 mais tu peu descendre jusqu'a 20ms il me semble
       
        // Affectation de la vitesse
        // Note : ( 1000 + ( v * 20 ) ) permet d'écrire une vitesse entre 1000 et 2000 si v est entre 0 et 100
        servo1.writeMicroseconds( 1000 + ( vitesseActuelle * 20 ) );
        Serial.print("vitesse du moteur");
        //Serial.println(1000 + ( vitesseActuelle * 20 ));
        Serial.println(vitesseActuelle);
        Serial.println(" ");
        tempoEcriture = tempoActuel;     
            }
        } 
    }




ps:N'oubli pas de télécharger et d'installer la bibliothèque Servo

OK merci j'essaye ça de suite tu comprend maintenant pk je demande de l'aide sur forum et pour ce qui concerne La bibli Servo elle est pas integrer a l'IDE arduino ??

bibli Servo elle est pas integrer a l'IDE arduino ??

si normalement mais vue que ta des truc qui date de la guerre vérifie quand même.