Tutorial - Driver ESC HW 30A para Quadcopters

LOS MOTORES BRUSHLESS
Los motores brushless son motores eléctricos de imán permanente y de conmutación electrónica de alimentación en las bobinas. Su construcción de tres bobinados colocados a 120° y generan un campo magnético giratorio por medio de conmutación.

A diferencia de un motor DC normal, encontraremos tres cables de salida de control, por lo que es necesario un controlador especial para determinar tanto la orientación del rotor y su posición respecto a las bobinas del estator.

Los motores sin escobillas permiten un gran rendimiento y una gran potencia pero con un consumo considerable. Podemos ver algunas ventajas y desventajas en comparación a los motores comerciales de escobillas:

Ventajas:

  # Mayor eficiencia.
  # Mayor rendimiento.
  # Mayor potencia.
  # Alta velocidad.
  # Poco ruido.
  # Precisión en el control de velocidad.
  # Par elevado.

Desventajas:

  # Costo elevado.
  # Necesita un controlador especial ESC dedicado (Electronic Speed Control).

ESC (ELECTRONIC SPEED CONTROLLERS)

Son circuitos electrónicos diseñados con el propósito de variar la velocidad de los motores eléctricos, su dirección, y en muchos casos funcionar como freno dinámico. Estos controladores se encargan de generar tres fases eléctricas para controlar el motor.  

Los ESC crean básicamente una fuente de poder AC trifásica, a partir de una entrada de voltaje DC. Al momento de seleccionar un driver ESC debemos fijarnos que los motores brushless pueden ser de dos tipos:

  # Outrunner (usados en aeromodelismo)
  # Inrunner


En la mayoría de casos, estos driver son programables y se necesitan tarjetas especiales para poder configurarlos, aunque existe información y métodos para poder hackearlos y programarlos por otros medios (Arduino).


PROGRAMACIÓN DEFAULT Y PRUEBA
Para este ejemplo usamos un motor brushless EMAX CF2822 que tiene las siguientes características:

# KV: 1200
# Potencia de salida: 140 W
# RPM/V: 1200
# Características según hélice:
                                                   * Hélice 10 x 5: 7100 RPM
                                                   * Hélice 10 x 4.7: 6100 RPM

# Corriente de consumo: 14.5 A
# Eficiencia máxima: 82%
# Peso: 39g



En el caso del ESC, usamos un HW 30A que tiene las siguientes características:

# Máxima corriente continua: 30 A
# BEC (Battery Eliminator Circuit): 2 A
# Resistencia: 0.005 ohm
# Fets: 12
# PWM: 8 kHz
# Temperatura de protección: 110 °C

El conjunto armado se compone de una hélice de 10 x 4.5 in, un soporte de motor de aluminio, un motor brushless, un ESC y un controlador Arduino.

# PIN 11 : Arduino UNO => SEÑAL : ESC (Cable blanco)
# GND : Arduino UNO  => VCC : ESC (Cable rojo)
# 5V : Arduino UNO  => GND : ESC (Cable negro)
# GND : Batería  => GND : ESC (Cable negro)
# 11.1V : Batería  => VCC : ESC (Cable rojo)
# ENTRADA BOBINADO : Motores (Cables negros) => SALIDA MOTOR : ESC (Cables azules)

Al momento de conectar el motor al ESC, debemos percatarnos conectar los cables centrales, la rotación dependerá de la posición que coloquemos los cables faltantes. El circuito de prueba se muestra a continuación:



El conjunto de hélice y motor se muestra en el siguiente esquema:



El programa usado tiene un menú con dos opciones:

# La opción "a" entra a un modo de programación, en el cual se introduce una señal PWM de 2000us.
# La opción "b" entra a un modo de prueba que permite probar el motor al introducir la velocidad en porcentaje de 0 a 100 %.

NOTA:

# Dentro de la opción "a" tenemos dos más:
   Al introducir "c" asignamos como valor mínimo 700us.
   Al introducir "d" asignamos como valor mínimo 1000us.

Con ello, podemos tener un rango mayor o menor de control de los motores y dependerá del modelo usado. El programa es el siguiente:
/*
   PROGRAMA DE PRUEBA: ESC HW 30A
   CONEXION:
             PWM: Arduino Pin 11
             GND: Arduino GND
             VCC: Arduino 5V
   
   El siguiente programa nos ayuda a configurar los driver ESC en modo default para poder usarlos con
   la funcion servo con dos distintos rangos. Seguir las instrucciones del menu. Despues de configurado
   el driver, se pueden hacer pruebas en vacio del motor.
             
   Autor: Renato H.
   http://beetlecraft.blogspot.pe/
  
   El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera 
   ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del autor
*/

#include <Servo.h> // Libreria de manejo de servos
Servo esc;         // Construccion del objeto ESC usando la libreria Servo

int valor_esc_max = 2000, valor_esc_min, por_esc; // Variables para configuracion del driver
float valor_esc; // Variable de conversion de porcentaje a microsegundos
char cabecera;   // Variable

void setup() {
  esc.attach(11); // ESC configurado para ser usado en el pin 11
  
  Serial.begin(9600); // Inicializacion del puerto serial a 9600 bps
  // Menu inicial
  Serial.println("Programa de programacion default y prueba de driver ESC HW 30A");
  Serial.println("Menu: ");
  Serial.println("a : Entrar al modo de programacion");
  Serial.println("b : Entrar al modo de de prueba");
}

void loop() {
  if (Serial.available()) {  // Verificacion que el puerto serial recibe datos                           
   delay(10);
   cabecera = Serial.read(); // Lectura de la cabecera para ingresar al menu
   menu(cabecera);           // Ingresando a la funcion del menu deseada
   while (Serial.available() > 0){Serial.read();} // Rutina de limpieza del buffer del puerto serial
  }  
}

void menu(char menu_pointer){ // Rutina de menu
  switch (menu_pointer) {
    case 'a':
      esc.write(valor_esc_max); // Asignacion del valor minimo de 700 ms
      // Menu
      Serial.println("Ingresando al modo de programacion...");
      delay(500); Serial.println("Encender la fuente o conectar la bateria");
      delay(1000); Serial.println("Ingresar c para valor minimo de 700 ms");
      delay(1000); Serial.println("Ingresar d para valor minimo de 1000 ms");        
    break;
    
    case 'c':
      valor_esc_min = 700;      // Asignacion del valor minimo de 700 ms
      esc.write(valor_esc_min); // Programacion del valor minimo en el ESC
      // Menu
      Serial.print("Valor maximo: "); Serial.println(valor_esc_max);
      Serial.print("Valor minimo: "); Serial.println(valor_esc_min);
      Serial.println("Ingresar b para entrar a modo de prueba... ");
    break;
    
    case 'd':
      valor_esc_min = 1000;     // Asignacion del valor minimo de 1000 ms
      esc.write(valor_esc_min); // Programacion del valor minimo en el ESC
      // Menu
      Serial.print("Valor maximo: "); Serial.println(valor_esc_max);
      Serial.print("Valor minimo: "); Serial.println(valor_esc_min);
      Serial.println("Ingresar b para entrar a modo de prueba... ");
    break;    
    
    case 'b':
    // Menu
    Serial.println("Ingresar b con un valor de 0 a 100");
    Serial.println("Ejemplo: b0 para 0%");
    Serial.println("Ejemplo: b100 para 100%");
      while (Serial.available()){
        por_esc = Serial.parseInt(); // Lectura del porcentaje de velocidad deseado
        // Conversion del porcentaje al valor en microsegundos por interpolacion
        valor_esc = (valor_esc_max - valor_esc_min); 
        valor_esc = valor_esc / 100;
        valor_esc = por_esc * valor_esc;
        valor_esc = valor_esc_min + valor_esc;
        // Menu
        Serial.print("ESC Porcentaje: "); Serial.print(por_esc);
        Serial.print(" || ECS Microsegundos: "); Serial.println(valor_esc, 0);
        Serial.println(" ");        
     }
      esc.writeMicroseconds(valor_esc); // Escritura del valor deseado en el ESC
    break;
  }
}

La demostración del uso del anterior programa se muestra en el siguiente video:


Autor: 

1 comentario:

  1. :D Me ha sido de mucha ayuda!, poca informacion como esta, me gustaria aprender, mas acerca de como aprender a programarlo en vez de solo copiar el programa. Saludos.

    ResponderEliminar