Site icon AranaCorp

Pilotez un moteur brushless avec Arduino

L’un des objectifs principaux de la robotique est d’articuler des objets. Pour se faire, il est très courant d’utiliser des moteurs électriques. Dans le cas de robot volant, comme les drones les actionneurs ont besoin de vitesse de rotation important pour faire tourner les hélices et permettre le vol. Dans ce cas, des moteurs brushless sont souvent utilisés. La particularité du moteur brushless (sans-balai) est qu’il peut atteindre de très grande vitesse par rapport aux autres type de moteur avec un couple moins important, bien entendu.

Matériel

Principe de fonctionnement

Les moteurs brushless sont des moteurs avec trois enroulements appelés moteurs triphasé. C’est à dire, qu’il génère une rotation continue lorsqu’on déphase les courants sur ces bobines. La génération des profils de courant sur chaque bobine, afin d’obtenir la vitesse désirée, nécessite l’utilisation d’un contrôleur de vitesse (appelé ESC, Electronic Speed Controller) afin de transformer une commande PWM en vitesse de rotation.

Schéma

Le moteur nécessite un courant élevé pour fonctionner correctement, l’ESC sera donc alimenté par une source d’énergie extérieur au microcontrôleur. La commande de l’ESC est branchée à une boche PWM du microcontrôleur.

Code

A chaque démarrage du code, l’ESC doit suivre une certaine procédure pour s’initialiser correctement. Cette procédure est décrite dans la fonction initProcedure() et consiste en une succession de commande PWM pendant un certains temps (correspondant à des signaux provenant de télécommandes radio).

//Parameters
const int escPin = 3;
int min_throttle = 1000;
int max_throttle = 2000;
unsigned long currentMillis, previousMillis;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init ESC
  pinMode(escPin, OUTPUT);
  initProcedure();
}

void loop() {
  runBrushless();
}

void runBrushless() { /* function runBrushless */
  //// Test Brushless routine
  Serial.println("running");
  currentMillis = 0;
  previousMillis = millis();
  while (currentMillis < 2000) {
    currentMillis = millis() - previousMillis;
    digitalWrite(escPin, HIGH);
    delayMicroseconds(1350);
    digitalWrite(escPin, LOW);
    delay(20);
  }
  Serial.println("stop");
  currentMillis = 0;
  previousMillis = millis();
  while (currentMillis < 2000) {
    currentMillis = millis() - previousMillis;
    digitalWrite(escPin, HIGH);
    delayMicroseconds(min_throttle);
    digitalWrite(escPin, LOW);
    delay(20);
  }
}

void initProcedure() { /* function initProcedure */
  //// ESC inittialisation process
  previousMillis = millis();
  Serial.println("throttle up");
  while (currentMillis < 3000) {
    currentMillis = millis() - previousMillis;
    Serial.println(currentMillis);
    digitalWrite(escPin, HIGH);
    delayMicroseconds(max_throttle);
    digitalWrite(escPin, LOW);
    delay(20);
  } //beep- beep-
  currentMillis = 0;
  previousMillis = millis();
  Serial.println("throttle down");
  while (currentMillis < 4500) {
    currentMillis = millis() - previousMillis;
    Serial.println(currentMillis);
    digitalWrite(escPin, HIGH);
    delayMicroseconds(min_throttle);
    digitalWrite(escPin, LOW);
    delay(20);
  } // beep--
  // 1 2 3
}

Résultat

Lorsque vous allumez la carte Arduino et lancez le code, vous devriez entendre l’ESC émettre des sons pour informer de son avancement dans l’initialisation (deux beep court et un beep long). Vous devriez ensuite voir le moteur tourner.

Applications

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile