Motores de CC, velocidad y cambio de sentido

Objetivos

    • Presentar los H bridge.
    • Un integrado, el L293D .
    • Montar un variador de velocidad del motor y también de sentido de giro.

circuito-integrado-L293D

Material requerido

cropped-arduino-1.jpg
  • Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.
Img_3_4
  •  Una Protoboard.
potenciometro
  • Un potenciómetro de 10K
circuito-integrado-L293D
  • Un H bridge integrado L293D
Img_3_5
  • Una resistencia de 330 Ohmios
Img_3_6-300x185
  • Algunos cables de Protoboard.
motor_CC
  • Un motor de corriente continua.

 Pero una cosa que no hicimos en la entrada donde trataba el funcionamiento de un motor de corriente continua fue invertir el sentido de rotación del motor, ya que para ello necesitamos invertir la polaridad de la tensión en bornes, y esto,, no podemos hacerlo usando solamente nuestros Arduinos.

Para resolver este problema tenemos que usar un circuito que se llama  puente en H ( H-bridge). Para comprenderlo, imaginaros el siguiente montaje a base de interruptores:

h-bridge_thumb

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.

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, 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:

h-bridge-motor-driver

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.

Disponemos de varias versiones de circuitos H-bridge dependiendo de la tensión y la intensidad que se debe conmutar.

Vamos a utilizar 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.

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.

El patillaje del chip es así:

L293D_Skeleton

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:

ENABLE CONTROL PIN_2 CONTROL PIN_7 MOTOR STATUS
LOW Motor parado
HIGH HIGH LOW Gira adelante
HIGH LOW HIGH Gira al revés
HIGH HIGH HIGH Motor parado
HIGH LOW LOW Motor 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.

Veamos cómo hacer el montaje con nuestros Arduinos.

Hagamos un resumen de conexiones:

PIN L293D PIN ARDUINO DESCRIPCIÓN
1 10 Enable
2 9 Input 1
3 Motor1 +
4,5, 12,13 GND GND
6 Motor1 –
7 8 Input 2
8 Vin Alimentación del motor
16 5V Alimentación del L293D

El esquema

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

Motor_L293D

El programa.

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++)                     
           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);  //cambio de dirección
    digitalWrite(i2, HIGH);
    delay(3000);

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

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. Pasado 1 segundo levantamos de nuevo el Enable1 y al intercambiar los valores de i1 e i2 el giro del motor se inicia y en la dirección contraria.

Velocidad de giro

Hemos conectado el pin Enable1 al pin Arduino 10 que es PWM  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 para que sea un valor entre 0 y 253) 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++)                     
         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); // cambio de dirección
   digitalWrite(i2, HIGH);
   delay(3000);

   digitalWrite(e1, LOW);  // Paramos Motor 1
   delay(1000);
  }
  • 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.