Objetivos

 

  • Presentaremos el controlador LMD12800.
  • Describiremos características.
  • Veremos un programa para controlar la velocidad
  • Haremos un ejemplo de freno eléctrico.[/three-fourth] [clear/]
  •  

    Material requerido.

     

      Tienda España Tienda Mexico
    Vista principal  Arduino UNO
    controlador de motores  controlador LMD12800

     

    Mas controladores de motores

     

    Un cliente me comentó un problema que tenía con un controlador de motores, ya de una cierta potencia, y de cómo no le funcionaba bien el freno, lo que le estaba causando bastantes problemas porque el motor se iba a donde Dios le daba a entender, que siempre era mucho más allá de donde debería haberse detenido.

    Como no había usado nunca estores motorcitos de 24V y 80 Vatios (De los que no conviene que te pillen los dedos) me animé a hacer unas pruebas por varios motivos. En primer lugar, porque me encanta jugar con motores y si son grandes más que mejor. En segundo lugar, porque hasta ahora solo había usado motores de juguete, como para pequeños robots con Arduino, pero nunca un motor serio y ya de una cierta potencia y tenía curiosidad. Y, en tercer lugar, porque, aunque había usado y hemos visto varios tutos de cómo controlar un motor de CC desde Arduino con algún controlador tipo el L293D o el L298N, no estaba muy seguro de como gobernar el que estos clientes usaban, el LMD18200 que parecía algo serio.

    Como comprenderéis todo el asunto me hacía sonreír y allá que me fui a empezar a hacer las pruebas. Lo primero buscar en Internet algo sobre Arduino y el LMD 18200…. Poco menos que nada de nada (Mal empezamos). Lo siguiente buscar la Datasheet del LMD 18200. Esto fue mucho más fácil.

    Imagen del chip integrado

    Leyendo un poco por ahí, enseguida vi que era un motor driver del tipo H-Bridge, del tipo que ya nos son familiares, pero con la particularidad de que puede soportar hasta 3A y una tensión hasta de 55V, lo que lo convierte en integrado ideal para gobernar motores DC de potencia media baja, pero que hablamos ya 150W. Es decir, nos vendría genial cuando necesitemos gobernar motores serios, como para mover una pequeña cinta transportadora o similares.

    controlador de motores

    Mi cliente me había pasado un motor de 24V y hasta 5A junto a una fuente de 24V y un controlador LMD12800 embebido en una tarjetita para mayor facilidad de uso, (Que no había visto en mi vida), y de la que prácticamente no encontré ninguna información en internet. ¿Pero cuando nos ha echado atrás hacer pruebas con cacharritos? ¿No?

    Echando un vistazo, vi enseguida unos rótulos bastante familiares en el controlador:

    vista superior

    ¡Ummmhhh! Bien a la derecha de la foto V+ y GND. La alimentación del motor a 24V y abajo OUT1 y OUT2, las bornas del motor. Hasta aquí todo normal, a ver a la derecha…. GND, esta nos la sabemos. PWM, vale, la velocidad del motor se controla con una señal PWM como siempre. DIR: un rápido vistazo a la Datasheet nos informa de que en HIGH indica un sentido de giro y LOW el contrario. Todo normal…. ¿Pero qué es eso de BRAKE?

    logica del controlador

    Nuevo viaje a la Datasheet y resulta que es un freno eléctrico que gobierna el giro del motor y que lo clava cuando ponemos BRAKE a HIGH. Mira tú, no había usado algo así nunca, esto hay que probarlo.

     

    Esquema de conexión

     

     

    Vamos a montar un pequeño circuito con un Arduino uno como controlador, mas tarjeta controladora del motor y el motor …. Y un joystick XY, para poder aumentar o disminuir la velocidad de giro y un botón pulsador que cuando se pulse, active el freno.

    esquema de conexion

    Todo parece bastante normal, así que toca pasar a la parte de la programación para probar el control. Veamos cómo.

     

    Programando el controlador LMD12800

     

    En una primera aproximación podríamos leer el joystick directamente y hacer que la velocidad del motor sea directamente igual a la posición del mismo. Es decir que por encima de 500 la velocidad aumente y por debajo vaya disminuyendo (Ya que el joystickda lecturas entre 0 y 1024, con el centro, 512, en posición de reposo. Pero esto no es buena idea porque no solemos tener demasiado buen pulso como para conseguir que sea algo estable, y además tiene el inconveniente de que al soltar el joystick el motor se quedaría girando al 50% de velocidad, lo que parece poco practico

    En lugar de eso, la idea es ir leyendo el joystick vertical, y  que hagamos aumentar o disminuir una variable que represente la velocidad del motor, de modo que, al soltar el joystick, la velocidad quede establecida y se mantenga por si sola.

    Pues una vez dicho esto, vamos a empezar con el asunto. Por una vez no hay que usar librerías. Vamos a manejar a pelo el controlador, pero si que vamos a definir algunas variables instrumentales, para fijar los pines a usar y sus nombres:

    #define PWM 9
    #define DIR 8
    #define BRAKE 10
    #define SWITCH 2
    
    int Speed = 0 ;
    int freno = 1 ;   // Para arrancar sin freno

    El manual de LMD18200 nos dice que le debemos indicar la velocidad del motor con una señal PWM, modulada en amplitud de pulsos, y por eso vamos a usar el pin 9 de nuestro Arduino UNO (Recuerda que no todos los pines del UNO so capaces de este tipo de señales)

    Vamos a definir en el setup() los pines de entrada y salida:

    void setup()
    {   Serial.begin(115200);
        pinMode(PWM, OUTPUT);
        pinMode(DIR, OUTPUT);
        pinMode(BRAKE, OUTPUT);
    
        pinMode( SWITCH, INPUT_PULLUP);
    }

    Lo único que merece la pena comentar, es que vamos a leer un pulsador integrado en el joystick y para eso necesitamos una resistencia de Pull Up, que, en vez de incluirla en el circuito externo, instruimos a nuestro Arduino para que la ponga el internamente. Y con esto, ya podemos pasar al loop(). Empezamos leyendo el joystick:

    int valor = analogRead(A1) ;

    Ahora nos interesa que, si el joystick está por encima de, digamos, 600 (de los 1024 posibles) aumentemos la velocidad y si está por debajo de 400, disminuya. Esto nos deja una franja de seguridad de 401 a 599 en los que la velocidad no varía, especialmente al soltar el joystick, que se quedara sobre 500 (La mitad)

    if ((valor > 600)  && (Speed < 1013 ))     // para no pasar de 1023
         Speed = Speed +10 ;
    else if( valor <400 && Speed > 10)
         Speed = Speed - 10 ;
    delay (200);   // Para evitar cambios bruscos de velocidad

    La función del ultimo delay() es evitar que, si mantenemos el joystick en la posición de acelerar, no lo haga demasiado deprisa (O sea, para que la aceleración sea moderada, pero puedes jugar con este valor). Nos toca ahora fijar la velocidad del motor de acuerdo al valor de la variable Speed:

    analogWrite(PWM, Speed);
    delay(50);

    Con esto ya tenemos funcionando la variación de la velocidad del motor, pero ahora nos toca aplicar el freno cuando pulsemos el joystick:

    bool freno = ! digitalRead(SWITCH);           // Atentos aqui

    Leemos el Switch del Joystick y lo asociamos, invertido, a la variable booleana freno.

    • Por si te mosquea lo de negar la lectura: Ten en cuenta que el botón devolverá HIGH cuando no está pulsado (recuerda que hemos puesto un Pull Up) y entregará LOW mientras el botón se mantenga pulsado.
    • Como quiero que freno sea True cuando se pulsa el botón y False, cuando no se pulsa, no nos queda otra que invertir el valor de la lectura directa. 

    Ahora tenemos que frenar el motor con el pin BRAKE, cuando la variable freno sea positiva:

    if (freno)
    { pinMode(BRAKE, HIGH);        // Ordenamos la frenada
      Speed = 0 ;                  // Para el motor: Velocidad = 0
    }

    Y con eso tenemos todo, ¿A que ha sido más fácil de lo que te temías? Aquí os dejo el programa completo:

    frenop

    ¡Accede al contenido!

    Aquí va un mini video con la operación de todo el asunto para que veáis que no os engaño: