Calibrer ses ESC avec un Arduino - drone ch. 3

Bonjour à tous,

Dans ce troisième chapitre, nous allons nous intéresser au calibrage des ESC. C'est une étape indispensable sans laquelle vous ne pourrez faire tourner vos moteurs à votre convenance.

Bien évidemment, ce calibrage se fera à l'aide d'un Arduino smiley

1. Introduction

Maintenant que vous avez acheté tout votre matériel, arrive le moment de tester tout ça. Cependant, il va d'abord falloir calibrer vos ESC pour pouvoir les utiliser.

On n'a pas moyen de se passer de cette étape de calibrage ?

Que neni. Les ESC sont conçus être compatibles avec un maximum de radiocommandes/ordinateur de bord mais, en contrepartie, ils ont besoin d'être calibrés pour fonctionner avec votre matériel.

Concrètement, la calibrage n'a rien de compliqué: il s'agit d'envoyer aux ESC les extremums des commandes de gaz soit, en clair, le signal correspondant à la commande "arrêt moteur" et le signal correspondant à la commande "plein gaz".
Ainsi, les ESC connaîssent leur plage de fonctionnement.

2. Rappels sur la commande PWM

Nous avons vu dans le chapitre précédent que les ESC se comportent comme des servomoteurs. Aussi, nous allons devoir générer un signal PWM bien particulier pour les contrôler.

Voici ses caractèristiques principales:

  • Durée minimale à l'état haut: $1ms$
  • Durée maximale à l'état haut: $2ms$

Ce qu'il faut bien comprendre ici c'est qu'un servomoteur se positionne par rapport à la durée à l'état haut uniquement et non par rapport au rapport cyclique comme on pourrait être amené à le penser.

Voici pour rappel la définition du rapport cyclique d'un signal rectangulaire:

$\alpha = \dfrac{\tau}{T}$
$\alpha$  rapport cyclique
$\tau$ temps à l'état haut sur une période
$T$ période

Pour bien illustrer ce comportement, prenons deux exemples avec la même durée à l'état haut mais avec des fréquences de PWM différentes:

Exemple 1: F = 50Hz
$F =50Hz \rightarrow T$ = $20ms$
$\tau$ = $1.5ms$
$\alpha$ = $\dfrac{1.5}{20} = 7.5\%$
Exemple 2: F = 200Hz
$F = 200Hz \rightarrow T$ = $5ms$
$\tau$ = $1.5ms$
$\alpha$ = $\dfrac{1.5}{5} = 30\%$
Contrôle d'un servomoteur par un signal PWM

On constate bien qu'avec des fréquences de PWM différentes, le rapport cyclique est également différent. Et pourtant, le servomoteur se positionnera avec le même angle dans les deux cas.

C'est donc bien la durée à l'état haut qui compte, peu importe la fréquence de fonctionnement.

3. Présentation de la bibliothèque Servo

Fort heureusement pour nous, il existe une bibliothèque Arduino qui va nous permettre de générer facilement le signal PWM: la bibliothèque Servo.

Cette bibliothèque permet de contrôler jusqu'à 12 moteurs sur un Arduino Uno, ça nous laisse de la marge avec nos 4 ESC smiley

Son utilisation est relativement simple comme vous pouvez le voir sur cet exemple:


#include <Servo.h> 

// Déclaration d'un servo.
Servo myservo;

void setup() 
{ 
  // On attache le servo au pin #9 de l'arduino.
  myservo.attach(9);

  // Et on écrit la valeur 90, ce qui correspond à un angle 0°.
  myservo.write(90);
} 

void loop() {}

La fonction qui permet d'envoyer la valeur souhaitée est la fonction write() qui accepte en paramètre une valeur comprise entre 0 et 180.

Pour un servomoteur classique, la valeur 0 le positionnerait à -90° tandis que la valeur 180 le positionnerait à +90°.
Dans le cas de nos ESC, la valeur 0 stoppe la rotation du moteur alors que la valeur 180 le fait tourner à plein régime.

4. Câblage

Il est maintenant temps de brancher tout ça. Commencez par relier vos moteurs à vos ESC.

Pour rappel, les moteurs brushless se comportent comme des moteurs triphasés, aussi le sens de branchement du trio de fils n'affectera que le sens de rotation. On s'en fou pour cette étape mais notez tout de même les sens de branchement pour plus tard.

Ne placez surtout pas vos hélices maintenant ou vos moteurs risquent de partir dans tous les sens. Vous ne voulez pas déjà abimer vos hélices ou vos doigts smiley

Ensuite, reliez vos ESC à votre Arduino comme suit:

  • ESC 1: pin #4 de l'Arduino
  • ESC 2: pin #5 de l'Arduino
  • ESC 3: pin #6 de l'Arduino
  • ESC 4: pin #7 de l'Arduino
Cablage d'un ESC à l'Arduino

Attention à ne PAS alimenter l'Arduino avec la sortie BEC d'un ESC. L'Arduino sera alimenté en USB.

5. Calibrage

Arrive le moment tant attendu du calibrage. Et comme je suis sympa, je vous ai écrit un sketch Arduino qui vous permettra de calibrer vos ESC facilement:


/**
 * Usage, according to documentation(https://www.firediy.fr/files/drone/HW-01-V4.pdf) : 
 *     1. Plug your Arduino to your computer with USB cable, open terminal, then type 1 to send max throttle to every ESC to enter programming mode
 *     2. Power up your ESCs. You must hear "beep1 beep2 beep3" tones meaning the power supply is OK
 *     3. After 2sec, "beep beep" tone emits, meaning the throttle highest point has been correctly confirmed
 *     4. Type 0 to send 0 throttle
 *     5. Several "beep" tones emits, wich means the quantity of the lithium battery cells (3 beeps for a 3 cells LiPo)
 *     6. A long beep tone emits meaning the throttle lowest point has been correctly confirmed
 *     7. Type 2 to launch test function. This will send 0 to 180 throttle to ESCs to test them
 */

#include <Servo.h>

Servo motA, motB, motC, motD;
char data;

/**
 * Initialisation routine
 */
void setup() {
    Serial.begin(9600);
    
    motA.attach(4, 1000, 2000); // 1000 and 2000 are very important ! Values can be different with other ESCs.
    motB.attach(5, 1000, 2000);
    motC.attach(6, 1000, 2000);
    motD.attach(7, 1000, 2000);
    
    displayInstructions();
}

/**
 * Main function
 */
void loop() {
    if (Serial.available()) {
        data = Serial.read();

        switch (data) {
            // 0
            case 48 : Serial.println("Sending 0 throttle");
                      motA.write(0);
                      motB.write(0);
                      motC.write(0);
                      motD.write(0);
            break;

            // 1
            case 49 : Serial.println("Sending 180 throttle");
                      motA.write(180);
                      motB.write(180);
                      motC.write(180);
                      motD.write(180);
            break;

            // 2
            case 50 : Serial.print("Running test in 3");
                      delay(1000);
                      Serial.print(" 2");
                      delay(1000);
                      Serial.println(" 1...");
                      delay(1000);
                      test();
            break;
        }
    }
}

/**
 * Test function sending angle to the ESCs from 0 to 180 degrees
 */
void test()
{
    for (int i=0; i<=180; i++) {
        Serial.print("Speed = ");
        Serial.println(i);
        
        motA.write(i);
        motB.write(i);
        motC.write(i);
        motD.write(i);
        
        delay(200);
    }

    Serial.println("STOP");
    motA.write(0);
    motB.write(0);
    motC.write(0);
    motD.write(0);
}

/**
 * Displays instructions to user
 */
void displayInstructions()
{  
    Serial.println("READY - PLEASE SEND INSTRUCTIONS AS FOLLOWING :");
    Serial.println("\t0 : Sends 0 throttle");
    Serial.println("\t1 : Sends 180 throttle");
    Serial.println("\t2 : Runs test function\n");
}

Vous pouvez retrouver la dernière version de ce code sur mon repo github.

Commencez d'abord par uploader le sketch sur votre Arduino. Ensuite et SANS que les ESC ne soient encore alimentés:

  1. Connectez votre Arduino à votre PC grâce à son câble USB, ouvrez un terminal depuis Arduino Software et tapez 1.
    Cela va faire entrer les ESC en mode de programmation.
  2. C'est le moment d'alimenter vos ESC. Vous devriez entendre 3 bips "bip1 bip2 bip3" signifiant que votre alimentation est OK.
  3. Après 2 secondes, vous devriez entendre "bip bip" signifiant que la position "plein gaz" (valeur 180) à bien été enregistrée par les ESC.
  4. Tapez maintenant 0 dans le terminal pour envoyer la commande "arrêt moteur" (valeur 0) aux ESC.
  5. Plusieurs bips sont émis correspondant au nombre de cellules de votre batterie (et donc à son voltage). Par ex, 3 bips pour une LiPo 3S.
  6. Un bip long est émis signifiant que la position "arrêt moteur" a bien été enregistrée par les ESC.
  7. Les ESC sont maintenant qualibrés. Tapez 2 dans le terminal pour démarer la fonction de test. Cette fonction va envoyer une commande de gaz partant de 0 pour progressivement arriver à 180.
    Vous devriez voir vos moteurs commencer à tourner de plus en plus vite jusqu'à atteindre leur vitesse de rotation maximale.

Vous n'êtes pas obligés de brancher vos 4 ESC en même temps, vous pouvez les calibrer un par un si vous le souhaitez.

6. Conclusion

Vos ESC sont maintenant qualibrés pour votre Arduino et prêts à l'emploi. Vous pouvez d'ores et déjà vous amuser avec en attendant le prochain chapitre qui portera sur la réalisation du cadre et de la power distribution board.

A bientôt sur Fire-DIY !

Vos réactions (21) :

faycalsaf

bonjour je viens de lire vos 3 chapitres et je trouve ça super de pouvoir introduire un arduino sur un drone . Par contre je ne trouve pas les autres chapitre.
merci pour ce tuto

03/08/2017 à 17:15

lobodol

Salut faycalsaf, content que ça te plaise :)
Pour le moment il n'y a que ces 3 là, la suite est en cours de réalisation/écriture.

Tu peux liker notre page Facebook si tu veux être tenu au courant des dernières actu. Sinon, le site a un flux RSS si tu préfères: https://www.firediy.fr/rss.xml

Ciao !

03/08/2017 à 17:17

faycalsaf

Merci hâte de suivre la suite

05/08/2017 à 16:21

Edorion

Bonjour !!
Je suis en train de plancher sur la fabrication d'un drone maison, et je ne sais pas quoi choisir pour les pièces, je demande donc ^^ (je sais ce site est pas adapté)

donc je voudrais choisir toutes les pièces pour pouvoir le faire, sauf le chassis et les hélices, j'ai donc choisi :
-Moteurs : Quanum BE1806-2300kv Race Edition Brushless Motor 3~4S
-ESC : DYS XSC 20amp Mini BLHeliS w/OneShot142 Multi-Rotor ESC (Solder version)
-Controlleur de vol : Skyline32 Mini Flight Controller w/Baseflight & Cleanflight
-Distribution board : Micro Power Distribution Board with 5V BEC (2~4S LiPoly)
-Batterie : MultiStar 1400mAh 3S 40C Multi-Rotor Lipo Pack (with LED indicator)

Dites-moi si les pièces vont pas ensemble, si il y a mieux (tant que je reste dans le budget de 100€, mais pas plus !!!)

P.S.: si vous connaissez un site plus adapté de type forum je suis pour ^^
P.P.S.: J'adore le concept du tuto, super bien réalisé ! vivement la suite !

08/08/2017 à 15:54

lobodol

Salut, je suis en vac donc je te répondrai plus en détail à mon retour. En attendant, tu peux aller poser tes questions sur le forum.

09/08/2017 à 11:28

Panda200o

Super ton tuto sachant que je souhaite réaliser un drone avec mon arduino ça tombe bien et tu dois être l'un des premiers à proposer ça.
J'attends la suite avec impatience !

18/08/2017 à 18:38

lobodol

Merci Panda200o, content que ça te plaise. La suite arrive mais c'est comme Game of Thrones, un peu long à arriver :P
Hésite pas à partager tes expériences sur le forum :)
Ciao !

18/08/2017 à 18:51

Axelgmp

Super comme tuto tres interessant, j'attends le suite avec impatience

11/09/2017 à 12:46

bzy

Super tuto, programme clair, j'avais oublié certaines notions de programmation qui me sont revenues en voyant ton code! Merci bien ;)

21/09/2017 à 19:33

La team SIN

Bonjour lobodol. Tout d'abord nous tenons à vous remercier pour cette très bonne série d'article intéressante et très instructive.
Nous sommes des terminales STI2D en option SIN et nous avons décider pour cette année d'adopter le projet construction d'un drone. D'où l'utilité de vos articles ;-)
Nous aimerions vraiment rentrer en contact avec vous pour avoir quelques conseils et quelques précisions sur ce projet.
Vous pouvez nous nous joindre à l'adresse mail suivante p****2@gmail.com
Nous vous remercions par avance de prendre contact avec vous.
Cordialement.

29/09/2017 à 11:38

Zelione

Bravo pour ces 3 leçon. Prof de techno en collège, on a démarré la conception d'un drone et le cours ur les moteur est excellent : j'ai tout compris. Plus confus le calibrage (peu d'explication sur le fonctionnement du programme arduino). J'ai vraiment hâte de lire la suite.
Bravo.

PS : je reprends quelques informations pour mettre sur mon site (www.zelione.fr)

30/09/2017 à 12:34

fragof

Très bon tuto j'étais en train de construire un drone avec un flight controler du type naze32 rev 6, qui est assez compliqué a configurer.Je suis tombé sur tes articles et je me suis dit peut-être qu'avec un bon professeur comme toi ça va être plus simple. J'ai déjà commencé j'ai voulu calibrer les esc ça semble marcher mais j'ai une question a ce propos lorsque le test est fini que le moteur est arrêté est-ce normal que si on appuie sur le "1" (vitesse maximum) le moteur ne démarre pas mais le test lui marche bien. Pour re reste je suis comme beaucoup d'autres j'attend avec impatience la suite de ce beau projet.

02/10/2017 à 21:03

lobodol

Salut et merci pour ton soutient :)

J'ai envie de penser que non, ça n'est pas normal que les moteurs ne tournent pas lorsque tu saisis "1". Il est possible que la fréquence de fonctionnement de tes ESC soit légèrement différente des miens (à trouver dans la doc technique). Auquel cas, il faut que tu mettes à jour le code, la partie suivante:

motX.attach(4, 1000, 2000);

1000 et 2000.

La suite arrive, mais je prends le temps de faire ça bien jusqu'au bout :)

02/10/2017 à 22:24

simon

Merci beaucoup pour les informations et les codes. Pqr contre j´ai aussi um probleme avec le calibrage des ESC : tout d'abord quand je branche la batterie j'entends un double bip et ensuite plus de bips, ni quand j'envois 0 par contre le test semble marcher... Je suis un peu perdu la !

18/10/2017 à 18:59

lobodol

Salut simon, je me suis basé sur la documentation technique de mes ESC pour écrire le code.
Je l'ai jointe à l'article au besoin. Lis la doc technique de tes ESC, peut-être qu'ils ne fonctionnent pas de la même manière

18/10/2017 à 20:37

simon

Merci pour votre réponse aussi rapide mais c'est um esc que j'ai récupéré sur un R/C helicopter et je n'arrive pas a trouver de documentation dessus... C'est un speed controller de chez walkera modele WK WST 30a, c'est tout ce que j'ai dessus... Mon projet consiste a réaliser un hydroglisseur autonome capable de se diriger et d'avancer em fonction des données recues par un IMU.
Merci de votre aide

19/10/2017 à 15:30

simon

J'utilise une LI-PO battery 3 cell 11.1V, le probléme pourrait il venir de la ?

19/10/2017 à 15:38

lobodol

Salut, merci de créer une sujet sur le forum afin qu'on puisse étudier ton problème dans de bonnes conditions :)
La section commentaire n'est pas vraiment pratique pour ça

19/10/2017 à 16:14

jenavigue

j'essaye de m'inscrire pour accéder au forum, mais je n'ai pas de validation !

23/11/2017 à 11:34

lobodol

@jenavigue: Les utilisateurs d'Internet Explorer sont priés au choix de changer de navigateur ou de se couper les mains !

23/11/2017 à 15:50

Quarkx

MERCI pour ces tutos parfaits

06/12/2017 à 16:39

Vous avez besoin d'aide ? Utilisez le Forum plutôt que les commentaires.

Un commentaire ?

* Champs obligatoires