Mostrando entradas con la etiqueta motores. Mostrar todas las entradas
Mostrando entradas con la etiqueta motores. Mostrar todas las entradas

viernes, 8 de junio de 2012

Control de los motores DC con Arduino


En los siguientes ejemplos y ensayos vamos a introducirnos en la programación de los motores para conseguir diferentes movimientos básicos del robot:
  • Marcha adelante.
  • Marcha atrás.
  • Giro izquierda.
  • Giro derecha.
  • Rotación a izquierda sobre su propio eje.
  • Rotación a derecha sobre su propio eje.

Una vez que hemos realizado la conexión del chip L293D o puente en H, procedemos a la programación en el IDE de Arduino:

  1. Calentando motores: Vamos a comprobar el funcionamiento del motor izquierdo, que hemos conectado a los pines 4 y 5 de Arduino Uno. Para su programación, vamos a utilizar por primera vez las funciones, que son como unas rutinas que por su frecuencia de uso, si las etiquetamos con un nombre, facilitan y estructuran la programación a la vez que lo simplifican. Su uso es fácil, observa el siguiente ejemplo:


void setup () {
pinMode(4,OUTPUT); //configuramos los pines 4 y 5 como salidas
pinMode(5,OUTPUT);
}

void adelante () {
digitalWrite(4,LOW); /*Esta sería la configuración ideal, ya digitalWrite(5,HIGH); que el pin 5 es del tipo PWM } lo que nos permitirá variar la velocidad del motor en su avance. Si con esta conexión el motor no gira hacia adelante, entonces habrá que invertir la conexión del motor al chip L293D*/

void paro () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}

void loop () {
adelante(); //llamamos a la función creada
delay(2000); // esperamos 2 segundos con el motor en marcha
paro(); //paramos el motor utilizando la función paro
delay(1000);
}

  1. ¿Y el motor derecho? Vamos a comprobar el funcionamiento del motor derecho, que hemos conectado a los pines 6 y 7 de Arduino Uno. Volvemos a utilizar las funciones. Observa el siguiente ejemplo:

void setup () {
pinMode(6,OUTPUT); //configuramos los pines 6 y 7 como salidas
pinMode(7,OUTPUT);
}

void adelante () {
digitalWrite(6,HIGH); /*esta sería la configuración ideal, ya digitalWrite(7,LOW); que el pin 6 es del tipo PWM } lo que nos permitirá variar la velocidad del motor en su avance. Si con esta conexión el motor no gira hacia adelante, entonces habrá que invertir la conexión del motor al chip L293D */

void paro () {
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}

void loop () {
adelante(); //llamamos a la función creada
delay(2000); // esperamos 2 segundos con el motor en marcha
paro(); //paramos el motor utilizando la función paro
delay(1000);
}

  1. ¡Y ahora los dos! Una vez que hemos comprobados que todo funciona bien y como nosotros queremos, vamos a utilizar los dos motores a la vez y vamos a introducir la función atrás:

void setup () {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}

void adelante () {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}

void paro () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}

void atras () {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}

void loop () {
adelante();
delay(2000);
paro();
delay(1000);
atras();
delay(2000);
paro();
delay(1000);
}

  1. Y ahora los giros: Como ya puedes entender, para conseguir que el robot gire a la izquierda debes parar el motor de ese lado y mantener en marcha el derecho. Al contrario, para girar a la derecha, debes parar el motor derecho y mantener en marcha el motor izquierdo. Como ejemplo vamos a programar los siguientes movimientos:
  • Adelante 2 s
  • Paro 0,5 s
  • Gira a izquierdas 0,25 s
  • Paro 0,5 s
  • Atrás 2 s
  • Paro 0,5 s
  • Gira a derechas 0,25 s
  • Paro 0,5 s

void setup () {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}

void adelante () {
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
}

void paro () {
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
}

void atras () {
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
}

void giraizquierda () {
digitalWrite(4,LOW); //paramos el motor izquierdo
digitalWrite(5,LOW);
digitalWrite(6,HIGH); //mantenemos el motor derecho en marcha
digitalWrite(7,LOW);
}

void giraderecha () {
digitalWrite(4,LOW);
digitalWrite(5,HIGH); //mantenemos el motor izquierdo en marcha
digitalWrite(6,LOW); //paramos el motor derecho
digitalWrite(7,LOW);
}
void loop () {
adelante();
delay(2000);
paro();
delay(500);
giraizquierda();
delay(250);
paro();
delay(500);
atras();
delay(2000);
paro();
delay(500);
giraderecha();
delay(250);
paro();
delay(500);
}


Montaje de un puente en H para el control de motores



La tarjeta Arduino proporciona una corriente máxima por canal de 40mA, suficiente para activar pequeños actuadores como leds pero insuficiente para manejar el consumo de un motor de corriente continua. Por ello, es necesario utilizar un chip de potencia para amplificar esas señales de la tarjeta, que además incorpora unos diodos de protección contra los picos inversos de tensión producidos por la desconexión de cargas inductivas.

Para invertir la dirección del motor sin un nuevo conexionado requiere de un circuito conocido como un PUENTE-H (observa cómo el circuito alrededor del motor está en forma de H).

Motor en paro
El cierre de A y D hace que el motor gire a derechas
El cierre de B y C hace que se invierta el sentido de giro
Es necesario observar que es fácil hacer un corto de batería al cerrar por descuido los interruptores A y B o cerrando los interruptores C y D. Esto pondría en peligro la batería. Una buena medida para evitarlo es automatizar al máximo el control de los interruptores.

Para permitir controlar el Puente H al microcontrolador, los interruptores mecánicos deben ser sustituidos por transistores. Observa el empleo de diodos en el circuito. El bobinado en el motor es esencialmente un inductor. Cuando el flujo de corriente en un inductor de repente es cortado, la corriente de pronto no puede ir a 0. Por consiguiente, inducen un voltaje oponiéndose a esta corriente. Este voltaje puede ser tan alto que esto destruya los transistores. Los diodos de retorno proporcionan un camino de vuelta seguro para esta corriente que evita y protege los transistores.
El puente-H, puede ser realizado con transistores discretos o puede ser comprado como un circuito integrado. Utilizar un circuito integrado ayudará a mantener el proyecto compacto y la lógica interna previene que la batería pueda ser cortocircuitada como se describió antes.





Para conseguir amplificar las señales de control de la tarjeta Arduino, invertir el sentido de giro de los motores mediante puente en H y proteger de las cargas inductivas, utilizamos para ello un chip L293D. Aquí tienes el significado de cada uno de sus 16 pines:

El chip L293 es un driver de 4 canales capaz de proporcionar una corriente de salida de hasta 1A por canal. Cada canal es controlado por señales de entrada compatibles TTL y cada pareja de canales dispone de una señal de habilitación que desconecta las salidas de los mismos.
Dispone de una patilla para la alimentación de las cargas que se están controlando, de forma que dicha alimentación es independiente de la lógica de control. Con este circuito integrado se puede controlar el sentido de giro de hasta dos motores simultáneamente. 









CARACTERÍSTICAS DEL CHIP L293D
  • Intensidad por canal =600mA
  • Intensidad de pico por canal=1,2 A
  • Protección contra sobretemperaturas
  • Protección interna contra sobretensiones producidas por cargas inductivas
  • Alimentación independiente de las cargas y control
  • Alta inmunidad al ruido
  • Tensión de alimentación de las cargas ≤ 36 V
  • Tensión de alimentación del chip = de 4.5 a 36 V














La conexión del chip L293B a la tarjeta arduino queda como sigue: