Es verdad que dicen que no se puede conectar un motor eléctrico directamente a los pines de Arduino, pero ¿alguna vez te has planteado porqué? Veamoslo en un ejemplo.

Circuitoi básica de motor eléctrico

En la imagen anterior puedes ver un circuito de motor eléctrico que se conecta directamente a la batería a través de un pulsador, de manera que cuando se pulsa el botón, se activa el motor. El problema es la corriente de consume que requiere el motor eléctrico:

Corriente por el motor

Y si tenemos en cuenta que la máxima corriente que proporciona un puerto digital de Arduino son de 45mA (forzando el calor a través del integrado de memoria), el motor eléctrico obligará a sobrecargar al ATMEGA produciendo un exceso de corriente que limitará la velocidad del motor, y posiblemente dañará los registros internos del procesador.

Vale, ¿pero por qué se consume tanta corriente?
Para comprobar el consumo excesivo que tiene un motor eléctrico de corriente continua, deberías de revisar mi curso de electrónica para newbies sobre la inducción electromagnética.

Un motor eléctrico de corriente continua funciona mediante el principio de repulsión atracción magnética de polos al igual que cuando acercas dos imanes con igual polaridad que se rechazan, o diferente polaridad que se atraen.

El principio físico de un motor eléctrico es que un conductor eléctrico que se conecte a una fuente de energía eléctrica dentro de una campo magnético, generará una repulsión magnética con el campo magnético que generará una torsión motríz cuando las fuerzas de repulsión magnética y electromagnética generada por el conductor supere un valor umbral.

Dicho de otra manera, el campo electromagnético generado por el conductor, se repulsará con el campo magnético del cuerpo del motor y se generará un movimiento de torsión producido por las fuerzas de repulsión ya que el conductor eléctrico estará centrado sobre un eje que lo hará rotar.

Y la cuestión es que, existe un principio físico que se llama fuerza contraelectromotríz, que es la fuerza que se opone al movimiento del motor eléctrico. Y esa es una fuerza negativa que produce un aumento de la carga del circuito, es decir, demanda mayor potencia para que el motor se mueva.

Y una fuente de tensión puede soportar dicho consumo porque adapta su carga en función del consumo, pero un dispositivo electrónico que solo tiene una fuerza específica para proporcionar al circuito, cuando el consumo sea superior no va a poder suministrarla, a pesar de que la carga le exige esa energía.

Es como si intentas coger más peso del que puede tu cuerpo

De ahí el hecho de que puedas romper algún puerto digital o quemar tu procesador, ya que el consumo que requirirá el motor eléctrico, por muy pequeño que sea será peligroso.

Protegiendo el circuito.

Si en lugar de conectar directamente el motor eléctrico a un puerto arduino, le interponemos un sencillo circuito eléctrico que suplemente la corriente y tensión que el Arduino UNO no puede suministrar, entonces no tendremos ningún problema en realizar la conexión. Para eso utilizamos el transistor.

Transistor como controlador

Una ventaja de usar un transistor en el circuito es que el transistor aisla el cirucito de control de la base (conectada al pin PWM), de la carga entre colector - emisor, lo cual hace misión imposible quemar el Arduino. Pero ojo, porque el transistor se calentará de igual forma porque está trabajando a la saturación.

Pero existen excepciones. Si el motor que conectas es un motor de 3,7V como los utilizados en pequeños drones y helicopteros, si podrías conectar directamente un motor asegurandote eso si de que pongas un diodo flyblack que corte la fuerza contraelectromotriz generada por el motor cuando no se alimenta.

motores de corriente continua makerStack

Con esos motores podrías conectar el pin directamente a través de una resistencia y un diodo rectificador en serie para evitar el momento de apagado la realimentación a la placa del llamado carga reactiva generada por la inercia del motor cuando se desconecta la alimentación.

En esta parte vamos a crear un control del motor de velocidad atendiendo a motores que pueda controlar la placa Arduino UNO.

Control de velocidad con software.

Se puede hacer que interponiendo un potenciómetro puedas controlar la velocidad del motor conectado a tu placa Arduino. Con eso lo que estas es controlando la tensión que se aplica al motor desde el potenciómetro.

Circuito velocidad controlada por potenciómetro

En el anterior circuito controlas la corriente del circuito modificando la resistencia de carga del circuito y haciendo que sea más negativa o menos respecto a masa, modificando la corriente que circula por el motor. La otra forma que existe de programar una variación de velocidad de un motor eléctrico es mediante circuitos integrados o mediante controladores como Arduino UNO.

Control de velocidad mediante PWM.
Si hablamos de control de velocidad mediante PWM estamos hablando de modular la tensión del puerto digital de nuestro Arduino. Ya sabes de otras clases que los puertos PWM se pueden "modular" a una tensión específica escogiendo valores digitales que suplementan valores de tensión. Y aprovechandonos de este concepto podemos hacer que el motor eléctrico giré de acuerdo al valor introducido por el usuario. A continuación el Sketch.

int motor = 3;
void setup() {
  // put your setup code here, to run once:
pinMode(motor, OUTPUT);
Serial.begin(9600);
while (! Serial);
Serial.println("Escoge la velocidad de 0 a 255: ");
}

void loop() {
  // put your main code here, to run repeatedly:
if (Serial.available()){
  int velocidad = Serial.parseInt();
  if (velocidad >= 0 && velocidad <= 255){
    analogWrite(motor, velocidad);
    delay(5000);
  }
}
}

El código es sencillo. Primero se crea un variable global que va a representar el puerto que utilizaremos y en este caso es el puerto 3. dentro del Setup(), inicializaremos dicho puerto como salida. Ten en cuenta que el puerto 3 es un puerto digital PWM y que solo funcionará el control de velocidad en estos puertos. Además establecemos el monitor Serial a 9600 baudios de comunicación con el PC.

¿Cómo pedimos al usuario los datos de entrada de velocidad? pues preguntándole al usuario. Para ello vamos a crear un bucle while en el caul cada vez que el seria cero distinto de cero (esté vacio a la espera de una respuesta), nos muestre un mensaje. Eso lo hacemos con la instrucción while (! Serial);. Por lo que el siguiente código será el mensaje a mostrar. Con eso terminamos el Setup() y pasaremos al Loop(), en donde crearemos una estructura condiciona anidada para el caso de la respuesta del usuario.

Es un detalle a tener en cuenta que el monitor Serial ofrece una salida de String, y nosotros para manipular el valor de puerto 3, necesitamos un valor entero, por lo que requerimos de una transformación de cadena a entero para poder usar el valor expresado en el monitor Serial. Eso se realiza con la función parseInt(), a la cual le asignamos la variable velocidad.

Para terminar, con un condicional de comparación en el cual escogemos un valor entre cero y 255. Ten en cuenta que el valor cero es el valor de 5V y el valor de 255 es el valor de 0V, por lo que si quieres que realmente el valor 0 sea el estado parado del motor, y el estado 255 sea el estado máxima potencia, deberías de invertir la comparación.

Para terminar, con anoalogWrite(motor, velocidad); escribimos el valor introducido en el monitor Serial dentro del puerto para regular la velocidad. Además le incluyo un retraso de 5 segundos para que termine cada 5 segundos y vuelva a la velocidad normal.

En la sección del video verás como es el proceso de esta clase.