bclose

Mas sobre motores de Corriente continua

Variando el sentido y la intensidad de giro

Objetivos

 

 
    • Seguimos jugando con los motores de corriente continua.
    • Presentar los H bridge y porque son necesarios.
    • Un integrado, el L293D .
    • Montar un variador de velocidad del motor y también de sentido de giro.

 

Material requerido.

Imagen de Arduino UNO  Arduino UNO o equivalente.
ProtoboardUna Protoboard .
conexionesAlgunos cables de protoboard,
Paraja motriz Rueda y motor de CC de 5V.
L293D Un H bridge integrado L293D
PotUn potenciómetro de 10K

 

A vueltas con los motores de corriente continua, o motor CC

 

Hemos visto por encima las características básicas de los motores de corriente continua con escobillas (Porque hay varios tipos además de este), pero vamos a entrar un poco más en detalle de que cosas debes considerar cuando vayas a elegir uno de estos motores.

Cuando compres un motor de corriente continua debes fijarte en tres cosas básicamente:

 
  • Voltaje de funcionamiento: Que especifica los rangos de tensión entre los que el motor funcionará correctamente. Por ejemplo el que yo estoy usando se mueve entre 3 y 6V, pero no es raro encontrarlos de 9, 12 y 24V
  • Revoluciones por minuto: Que indica la velocidad que puede alcanzar a las distintas tensiones y que se suele consignar como Rpm. Típicamente en motores de Hobby andaremos entre 200 y 2.000 rpm
  • Par motor: O potencia que el motor puede desarrollar y que indica la carga útil que puede mover. En inglés se llama Torque.
 

En la sesión anterior vimos como como conectar uno de estos motores a nuestro Arduino y como variar la velocidad de giro modificando la tensión que le entregamos en bornes. La velocidad de giro del motor depende directamente de esta tensión

 
  • Mucho cuidado de no superar la tensión máxima que el fabricante nos indica como seguras o encontrareis que el olor de un motor quemado es muy característico y particularmente desagradable. 

Pero una cosa que no hicimos en la sesión previa fue invertir el sentido de rotación del motor, porque este es un tema espinoso, ya que para ello necesitamos invertir la polaridad de la tensión en bornes, y esto, queridos amigos, no podemos hacerlo usando solamente nuestros Arduinos (Porque Arduino puede proporcionar +5V pero no -5V).

Para resolver este problema tenemos que usar un poco más de ingenio y diseñar un circuito que se llama  puente en H ( H-bridge). Para comprenderlo, imaginaros el siguiente montaje a base de interruptores:

Puente en H

Cuando usamos los interruptores en la posición de la imagen izquierda el motor gira en un sentido que llamaremos directo. Pero si los colocamos en la posición de la derecha girará en sentido contrario, porque hemos invertido la polaridad de la tensión en las entradas del motor, y por tanto el sentido de giro, sin necesidad de invertir la polaridad de la tensión, cosa complicada.

A estos circuitos se les llama H-bridge, porque recuerdan vagamente a una H alrededor del motor.

Claro que invertir el giro mediante interruptores es poco práctico, y como aquí somos expertos electrónicos (Sin carcajadas, por favor), vamos a ver cómo podemos hacer la misma función usando electrónica y que no tengamos que conmutar manualmente, sino mediante señales eléctricas. Un típico H-Bridge seria parecido a este circuito:

Esquema puente en H

Olvídate por ahora de los diodos, que son para protección de la descarga inductiva del motor y proteger los transistores.  Jugando con la tensión en los pines A; B; C; D podemos conseguir que los transistores entren en corte o saturación y disponemos de un medio electrónico para abrir o cerrar el equivalente a los interruptores mediante transistores.

 
  • Observa que dos transistores son unos PNP y otros dos NPN para jugar con la polaridad de la tensión.
  • El campo magnético del rotor almacena energía, que puede ser importante, y que cuando cortamos la alimentación debe ser liberada en forma de corriente eléctrica, y adecuadamente dirigida por los diodos para impedir daños en los transistores o en la fuente de alimentación
 

Que no se asuste nadie. No voy a pediros que montéis ese circuito (aunque no sería demasiado complicado). Recordad que cuando hay una necesidad en el mercado, siempre hay alguien  dispuesto a fabricar un integrado que hace eso y más.

Y como esta no iba a ser la excepción, nos encontramos que disponemos de varias versiones de circuitos H-bridge dependiendo de la tensión y la intensidad que se debe conmutar.

Nosotros hoy vamos a utiliza un integrado barato, probado y fácil de encontrar que incluye dos H-bridge y que nos sirve para pequeños motores de corriente continua. Se llama L293D.

 

El H Bridge L293D

 

El L293D, es un pequeño integrado que incluye dos puentes H-Bridge que podemos usar para gobernar simultáneamente dos motores CC.

L293D

Si buscáis el manual del L293D,  veréis que aunque el funciona a 5V internamente, puede conmutar tensiones de hasta 36V para tus motores.

 
  • Asegurarte de que no sobrepasas la tensión máxima nominal de tus motores, es problema tuyo, así que ojo que el chip lo aguanta, pero lo de tu motor es otra historia.  

El patillaje del chip es así:

Patillaje L293D

Veamos que son los diferentes pines del L293D:

 
  • El pin 16, Vss, son los 5V con los que alimentamos el chip y el pin 8, Vs, es la tensión con la que alimentamos el motor.
  • Los pines del 1 al 7 controlan el primer motor y los pines 9 a 15 controlan el segundo motor.
  • El pin 1, Enable1, Activa el uso del motor 1. Con un valor HIGH, el motor puede girar dependiendo del valor de I1 e I2. Si es LOW se para independientemente de los valores del resto de pines
  • Los pines 2 y 7 son los pines de control para el motor 1, e irán conectados a nuestros Arduino para controlar el sentido de giro.
  • Los pines 3 y 6 son la salida a la que se conecta el motor 1, cuya polaridad se invierte en función los valores de 2 y 7.
  • En el diagrama de arriba veis que hay pines equivalentes para el motor 2 y cuales son.
  • Los pines 4, 5,12 y 13 van a GND.
 

Podemos hacer una tabla para mostrar la lógica que sigue el giro del motor en función de los tres pines:

ENABLECONTROL PIN 2CONTROL PIN 7MOTOR STATUS
LOWMotor parado
HIGHHIGHLOWGira adelante
HIGHLOWHIGHGira al revés
HIGHHIGHHIGHMotor parado
HIGHLOWLOWMotor parado

Por tanto tenemos que activar el pin enable para que el motor gire y después usamos los pines Input1 e Input2 con valore opuestos para hacer girar el motor en una dirección o en la contraria. ¿Fácil no?  Veamos cómo hacer el montaje con nuestros Arduinos.

Hagamos un resumen de conexiones

Pin L293DPin ArduinoDescripción
110Enable
29Input 1
3Motor1 +
4,5, 12,13GNDGND
6Motor1 –
78Input 2
8VinAlimentación del motor
165VAlimentación del L293D

Vamos con el esquema de protoboard.

Esquema de protoboard

 

Una vez que tenemos claras las conexiones, el diagrama de protoboard del chip L293D a nuestro Duino será algo así:

L293D

Veamos el programa que vamos a usar para controlar este motor. Vamos a usar los 3 pines de la tabla anterior. Arduino Pin 10 es el enable del Motor 1 y usamos los pines 8 y 9 para controlar el sentido de giro. Por tanto

#define E1 10  // Enable Pin for motor 1
#define I1 8     // Control pin 1 for motor 1
#define I2 9     // Control pin 2 for motor 1

void setup()
   {
        for (int i = 8 ; i<11 ; i++)                     // Inicializamos los pines
        pinMode( i, OUTPUT);
   }
void loop()
   {    digitalWrite(E1, HIGH);     // Activamos Motor1
        digitalWrite(I1, HIGH);     // Arrancamos
        digitalWrite(I2, LOW);
        delay(3000);

        digitalWrite(E1, LOW);      // Paramos Motor 1
        delay(1000);
        digitalWrite(E1, HIGH);     // Activamos Motor1

        digitalWrite(I1, LOW);      // Arrancamos con cambio de direccion
        digitalWrite(I2, HIGH);
        delay(3000);

        digitalWrite(E1, LOW);      // Paramos Motor 1
        delay(1000);
  }

El programa no puede ser más sencillo. Activamos el Enable1 para arrancar Motor1, y luego usamos I1 e I2 con valores invertidos. El motor arranca y lo paramos a los 3 segundos. A la de 1 segundo levantamos de nuevo el Enable1y al intercambiar los valores de I1 e I2 el giro del motor se inicia y en la dirección contraria.

Aquí va un mini video con el resultado:

Los lectores más astutos, se habrán dado cuenta de que no hemos variado la velocidad de giro y dado que en el programa anterior todos los valores son digitales lo vamos a tener mal para variar la velocidad de forma analógica.

Pero el truco está en que hemos conectado el pin Enable1 al pin Arduino 10 que es PWM (Así, como sin querer) y los L293D vienen diseñados para variar la velocidad de giro de los motores correspondientes con la tensión aplicada a este pin, por lo que resulta trivial variar la velocidad del motor, sin más darle valores analógicos.

Si por ejemplo añadimos un potenciómetro de nuevo conectado al A1, podemos escribir este valor directamente (dividido por 4, claro) al pin 10 como analógico, sustituyendo la línea

digitalWrite(E1, HIGH);  // Activamos Motor1

Por esta otra que escribe un valor analógico:

analogWrite(E1, analogRead(A1) /4 ) ;

Fijaremos la velocidad de giro del motor en función del valor del potenciómetro. El programa corregido, quedaría poco más o menos así:

#define E1 10  // Enable Pin for motor 1
#define I1 8     // Control pin 1 for motor 1
#define I2 9     // Control pin 2 for motor 1

void setup()
  {   
      for (int i = 8 ; i<11 ; i++)                     // Inicializamos los pines
      pinMode( i, OUTPUT);
  }

void loop()
  {   analogWrite(E1, analogRead(A1) / 4);            // Activamos Motor1
      digitalWrite(I1, HIGH);      // Arrancamos
      digitalWrite(I2, LOW);
      delay(3000);

      digitalWrite(E1, LOW);                         // Paramos Motor 1
      delay(1000);
      analogWrite(E1, analogRead(A1) / 4);           // Activamos Motor1
  
      digitalWrite(I1, LOW);        // Arrancamos con cambio de direccion
      digitalWrite(I2, HIGH);
      delay(3000);

      digitalWrite(E1, LOW);                         // Paramos Motor 1
      delay(1000);
  }

Y eso es todo.

 
  • Si montáis el circuito de prueba, tened en cuenta que la lectura de A1 solo se hace al salir del delay, por lo que variación se efectúa al principio de cada ciclo de giro y no en medio de este.
  • Sería un buen ejemplo plantear un programita en el que la velocidad se varia inmediatamente, aunque para ello tendréis que eliminar los delays.
 

Aquí tenemos un vídeo de muestra del resultado.

 

 

Resumen de la sesión

 

 
    • Hemos presentado los H bridge y porqué son necesarios.
    • Vimos un integrado, el L293D, que incluye dos H bridge con la capacidad para regular dos motores tanto en velocidad como en sentido de giro.
    • Montamos un circuito de pruebas para utilizar el H bridge con nuestros Arduinos.

 
 
 

 

 

 

(90) Comments

    • Pol

    hola, queria preguntar si puedes subir la conexión del circuito con el potenciometro y un sensor DHT 22, ya que estoy haciendo un trabajo y no me aclaro, me lo puedes pasar por mail a polvalles.elluch@gmail.com muchas gracias!!!

    • Hola Pol, echa una ojeada a la sesion que habla del dht11. El dht22 es exactamente igual para el circuito y en el programa solo hay que cmabiar el nombre del sensor

  • hola, queria preguntar por el pin de alimentacion d los motores(pin 8) del l293d esta conectado a Vin; q según entiendo no provee tension, sino es otra entrada de alimentación del arduino

    • Hola Juan, el pin Vin esta directamente conectado a la entrada de alimentacion del arduino en el USB. Eso supone que dispone de la tension de entrada y por tanto si que puede alimentar hasta un maximo de 0,5 amperios

  • Si puede ser porque son 4 pilas de 1,5 V así que ya andará un poco desgastada.

    ¿Pero por que el hecho de que la batería ande escasa de potencia implica un conportamienro diferente?

    • El problema de que las baterias den tension inferior a la nominal, es que cuando la tension con la que alimentas a la electronica baja de los 5V se vuelve impredecible y por eso es preferible no dejar margen de duda

    • Luis Ramírez

    Disculpad que os escriba de nuevo, pero he seguido indagando en el proyecto y me he dado cuenta de una cosa:

    Si alimento la placa por USB o mediante la entrada Jack sí que se comporta desde el inicio como debe, sin entrar en el if. Sin embargo, ocurre todo lo contrario (entra en el if nada más alimentarlo) si lo alimento mediante la entrada Vin que es la que voy a usar para el proyecto…

    Esto me ha dejado aún más desconcertado…

    • Parece que la bateria que usas anda escasa de potencia ¿Puede ser?

  • Muy buenas a todos, estoy haciendo un pequeño coche con dos motores controlados por el L293D. Resulta que su funcionamiento es totalmente correcto con respecto al código que os muestro más abajo, pero hay una pequeña pega: nada más alimentar la placa comienza entrando siempre en el if a pesar de que no haya obstáculos delante. Después de hacer lo propio del if, sí que funciona como debe, pero claro no entiendo porque nada más alimentar la placa lo primero que hace es el if obviando lo que hay antes al entrar en el loop.

    He adjuntado el código por si alguien me podría decir a qué se debe ese error, porque por más vueltas que le doy no sé por qué hace eso…

    Un saludo y gracias!!

    //LED:

    #define LED 2

    //Definimos parámetros para el motor:

    #define E1 10
    #define I1 8
    #define I2 9
    #define E2 5
    #define I3 6
    #define I4 7

    //Definimos parámetros para el sensor:

    #define trigPin 13 //boolean trgiPin = 13;
    #define echoPin 12 //boolean echoPin = 12;

    long duracion;
    long distancia;
    int limite = 25; //Medida en vacío del sensor. cm.

    void setup() {

    Serial.begin(9600);

    //LED:

    pinMode(LED, OUTPUT);

    //Sensor:

    pinMode(echoPin, INPUT);
    pinMode(trigPin, OUTPUT);

    //Motor 1:

    for( int i = 8; i < 11; i++)
    pinMode(i, OUTPUT);

    //Motor 2:

    for( int j = 5; j < 8; j++)
    pinMode(j, OUTPUT);

    }

    void loop() {

    digitalWrite(LED, LOW);

    digitalWrite(E1, HIGH); //El motor debe estar moviéndose al poner en marcha el programa hasta que encuentre un obstáculo.
    digitalWrite(I1, HIGH);
    digitalWrite(I2, LOW);
    digitalWrite(E2, HIGH);
    digitalWrite(I3, HIGH);
    digitalWrite(I4, LOW);

    distancia = medidorDistancia (duracion);

    Serial.println(String(distancia) + " cm.");

    if (distancia < limite){

    digitalWrite(LED, HIGH); //Al encenderse me informa de que ha encontrado un obstáculo.

    digitalWrite(E1, LOW); //Paro los motores.
    digitalWrite(E2, LOW);
    delay(200);

    digitalWrite(E1, HIGH); //Marcha atrás.
    digitalWrite(I1, LOW);
    digitalWrite(I2, HIGH);
    digitalWrite(E2, HIGH);
    digitalWrite(I3, LOW);
    digitalWrite(I4, HIGH);
    delay(500);

    digitalWrite(E1, LOW);
    digitalWrite(I3, HIGH); //Giro hacía la izq 180.
    digitalWrite(I4, LOW);
    delay(800);

    }

    else{

    digitalWrite(LED, LOW);

    digitalWrite(E1, HIGH);
    digitalWrite(I1, HIGH);
    digitalWrite(I2, LOW);
    digitalWrite(E2, HIGH);
    digitalWrite(I3, HIGH);
    digitalWrite(I4, LOW);

    }

    }

    int medidorDistancia (long duracion){

    int dist;

    digitalWrite(trigPin,LOW); //Nos aseguramos de que el trigger esté desactivado.
    delayMicroseconds(2); //Para estar seguros de que el ya está LOW.
    digitalWrite(trigPin, HIGH); //Activamos el pulso de salida.
    delayMicroseconds(10); //Esperamos.
    digitalWrite(trigPin, LOW); //Cortamos el pulso y a esperar el eco.

    duracion = pulseIn(echoPin, HIGH);

    dist = duracion / 2 / 29.1 ; //Devidimos por dos porque el eco es tanto ida como vuelta.

    return dist;
    }

Give a Reply

WordPress Anti-Spam by WP-SpamShield