Los motores de CC son un recurso muy utilizado,sobre todo en Robotica. Son baratos y su relación potencia/velocidad los hacen muy validos para este tipo de aplicaciones.
El gran problema de este tipo de motores es su control,necesitan voltajes que un microprocesador no puede entregar (generalmente superiores a 6V) y controlar su posición con precisión es una tarea realmente compleja. Lo que si es sencillo de controlar es su velocidad de giro y la dirección en la que lo hace, y eso es lo que vamos a aprender a hacer hoy con Pinguino.
Cómo hemos mencionado antes, este tipo de motores necesitan voltajes que un microcontrolador no puede entregar, por lo tanto necesitamos algo que haga de intermediario, reciba las ordenes y las transforme en señales electricas a un voltaje que permita alimentar un motor. Estos intermediarios se conocen cómo Drivers algunos de los más comunes son los LM293 y el TA8050P, si quieres saber más sobre ellos puedes encontrar tutoriales sobre ellos en nuestra sección de tutoriales
Vamos a utilizar el L293D. Este driver permite controlar hasta dos motores de CC con un mismo chip. Este módelo se diferencia del resto de LM293x por no necesitar diodos externos para funcionar correctamente.
Hemos conectado dos de las patillas de control a los pines PWM para poder controlar la velocidad de giro del motor cómo Pinguino unicamente posee dos de estas salidas sólo podremos controlar la velocidad de los dos motores en una dirección (generalmente se usa para cuando avanza).
Con elcircuito montado unicamente nos falta subir un programa a Pinguino que controle estos motores:
void setup(){ //Colocamos todos los pines que controlan los motores como salidas pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(15,OUTPUT); } void loop(){ //Ponemos los dos motores en una dirección digitalWrite(11,HIGH); digitalWrite(12,HIGH); digitalWrite(10,LOW); digitalWrite(15,LOW); //invertimos la dirección digitalWrite(10,LOW); digitalWrite(12,LOW); digitalWrite(10,HIGH); digitalWrite(15,HIGH); //movemos solo uno digitalWrite(11,LOW); digitalWrite(12,HIGH); digitalWrite(10,LOW); digitalWrite(15,LOW); //movemos el otro digitalWrite(11,HIGH); digitalWrite(12,LOW); digitalWrite(10,LOW); digitalWrite(15,LOW); //Paramos todo digitalWrite(11,LOW); digitalWrite(12,LOW); digitalWrite(10,LOW); digitalWrite(15,LOW); //aceleramos for(i=0; i<=255; i++){ analogWrite(11, i); analogWrite(12, i); digitalWrite(10,LOW); digitalWrite(15,LOW); } //deceleramos for(i=255; i>0; i--){ analogWrite(11, i); analogWrite(12, i); digitalWrite(10,LOW); digitalWrite(15,LOW); } //esperamos delay(3000); }
Este programa encendera primero ambos motores en una dirección, tras unos instantes cambiará el sentido de giro de los motores, despues sólo moverá uno, a continuación ese parará y comenzará a moverse el otro. Por ultimo parara los dos y empezará a acelerarlos hasta el máximo, una vez lograda la velocidad máxima comenzará a frenarlos poco a poco hasta parar. Esperará 3 min antes de volver a empezar la secuencia.
Vamos a probar ahora usando el TA8050P. Este driver unicamente puede controlar un motor, lo que haremos será conectar sus dos patas de control a los dos pines PWM de Pinguino, lo que nos permitirá controlar la velocidad de giro del motor en ambos sentidos de la marcha.
Unicamente necesitamos un programa que sepa gobernar este motor:
void setup(){ pinMode(11,OUTPUT); pinMode(12,OUTPUT); } void loop(){ //giro en un sentido digitalWrite(11,HIGH); digitalWrite(12,LOW); delay(2000); //gira en el otro sentido digitalWrite(11,LOW); digitalWrite(12,HIGH); delay(2000); //para el giro motor digitalWrite(11,LOW); digitalWrite(12,LOW); delay(2000); //acelerar for(i=0; i<=255; i++){ analogWrite(11, i); } //decelerar for(i=255; i>0; i--){ analogWrite(11, i); } //acelerar en sentido inverso for(i=0; i<=255; i++){ analogWrite(12, i); } //decelerar en sentido inverso for(i=255; i>0; i--){ analogWrite(12, i); } }
Lo que hará el programa será incrementar la velocidad desde 0 hasta el máximo y despues decrementarla hasta parar y comenzar a hacer lo mismo en sentido opuesto.