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.