fbpixel
Conducir un motor brushless con Arduino

Conducir un motor brushless con Arduino

Uno de los principales objetivos de la robótica es articular los objetos. Para ello, es muy común utilizar motores eléctricos. En el caso de los robots voladores, como los drones, los actuadores necesitan una alta velocidad de rotación para hacer girar las hélices y permitir el vuelo. En este caso, a menudo se utilizan motores sin escobillas. La particularidad del motor sin escobillas (brushless) es que puede alcanzar velocidades muy altas en comparación con otros tipos de motores con un par menor, por supuesto.

Hardware

  • Computadora
  • Arduino UNO
  • Cable USB A macho a B macho
  • Motor Brushless+ESC

Principio de funcionamiento

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.

Esquema

El motor brushless requiere una alta corriente para funcionar correctamente, por lo que el ESC será alimentado por una fuente de energía externa al microcontrolador. El control ESC está conectado a una ranura PWM del microcontrolador.

Código de gestión del motor brushless

Cada vez que se inicia el código, el sistema ESC debe seguir un cierto procedimiento para inicializarse correctamente. Este procedimiento se describe en la función initProcedure() y consiste en una sucesión de comandos PWM durante un cierto período de tiempo (correspondiente a las señales de los radiocontroles remotos).

//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
}

Resultado

Cuando encienda la tarjeta Arduino e inicie el código, deberá oír el ESC emitiendo sonidos para informarle de su progreso en la inicialización (dos pitidos cortos y un pitido largo). Entonces deberías ver el motor en marcha.

Aplicaciones

  • Construir un dron
  • Propulsar un barco a control remoto

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código