Skip to main content

Motores DC

Arduino (UNO) no proporciona corriente suficiente para hacer funcionar, en condiciones "dignas", un motor de corriente continua de los que solemos usar en el aula-taller de Tecnologías (motor DC). Conviene alimentar Arduino con una fuente externa (7 -12 V) para poder proporcionar intensidad necesaria para el par motor requerido en los proyectos.

Existen "shields" o tarjetas que se encajan sobre Arduino y le añaden funciones específicas como mover motores DC.

Alimentación

Como vimos en la sección de Alimentación eléctrica de Arduino (ver https://libros.catedu.es/books/programa-arduino-mediante-codigo/page/hardware) no es recomendable alimentar Arduino, cuando se trabaja con elementos de "alto" consumo como pueden ser los motores DC, con el cable USB. Tenemos la posibilidad de proporcionar más corriente (mA) a través de la conexión jack de Arduino. En el pin Vin tendremos una salida del voltaje que apliquemos por el jack que servirá para alimentar a los motores. Si el motor es pequeño y trabaja sin carga, sí que se puede conectar diréctamente al Arduino.

Recomendamos las siguientes páginas de Luis Llamas:   Tipo de motores y Motores paso a paso

Montajes que vamos a realizar

Vamos a controlar los motores de 4 formas:

  • Montaje 29 con transistor sin la shield Edubásica
  • Montaje 29 con transistor con la shield Edubásica
  • Montaje 30 circuito integrado L293 sin la shield Edubásica
  • Montaje 30 circuito integrado L293 con la shield Edubásica

Montaje 29 motor con transistor

El transistor es un componente analógico con infinidad de aplicaciones. Como se observa en la imagen, es un dispositivo con tres pines llamados emisor (E), colector (C) y base (B). El funcionamiento a groso modo es sencillo: Si suministramos "cierta" cantidad de corriente al terminal llamado base, entre los terminales emisor y colector circulará una corriente proporcional a la que entra por la base. Puede ser unas 100 veces mayor (este valor dependerá del transistor y se llama ganancia), por lo tanto, lo que tenemos es un amplificador de corriente, o sea, que con una intensidad pequeña podemos obtener una más grande entre los terminales emisor y colector. Si a estos dos terminales conectamos un motor DC conseguiremos hacerlo girar con garantías. Cuando no hay corriente en la base (o es muy pequeña) el colector y emisor están desconectados y no circulará corriente entre ellos.

Nuestra propuesta es que  realices un montaje de mover un motor a través de un transistor. Que funcione 1 segundo, luego 1 segundo parado y así sucesivamente.

Montaje 29 Programa motor con transistor

Este es el programa que te proponemos: https://create.arduino.cc/editor/javierquintana/c2d6681b-76d7-4231-9f8b-d0110348b7d4/preview

Montaje 29 Esquema de montaje motor con transistor con Edubásica

La shield de Edubásica ya tiene incorporado el transistor y los diodos de protección para funcionar el motor, para ello tenemos que hacer:

  • Poner el interruptor en ON
  • Conectar el motor en la salida del transistor y Vin
  • Utilizar D6 como pin de control del motor

Montaje 29 Esquema de montaje motor con transistor sin Edubásica

Desde Arduino (salida digital) actuamos sobre la base si enviamos un HIGH al pin digital donde la conectemos (pin 6 en el esquema). El transistor tiene que tener suficiente ganancia. Se conecta un diodo de protección en antiparalelo (1N004). Cuando el motor se para las bobinas se desmagnetizan y se descargan de energía eléctrica. El diodo proporciona un camino para su descarga (la energía se disipa en forma de calor en el diodo) y así se evita que sufra el transistor.

Es decir, sería esta vista :

Importante: NO CONECTES EL MOTOR DIRÉCTAMENTE AL ARDUINO, PODRÍAS DAÑARLO

Montaje 29 Simulación de montaje motor con transistor sin Edubásica

En el momento de realizar este circuito, Tinkercad no tiene un Jack de conexión, luego hemos conectado directamente la pila al Vin

 

¿Te atreves?

Otra posibilidad que protege el transistor es, en vez de conectar directamente el motor al colector del transistor, ubicar un relé en esa posición y accionar el motor con alimentación independiente con la conmutación del relé. ¿Te atreves a montar un montaje que active el motor DC mediante un relé conectado al colector del transistor.?

Montaje 30 motor con Circuito L293

El circuito integrado L293 permite controlar motoresDCmotores DC de pequeña potencia, pero en general bobinas, o sea cualquier elemento que precise pico de potencia, como los relés, etc..  Para utilizarlo hay que hacer un montaje externo a Arduino, en una placa de pruebas, y alimentar a los motores a través de este circuito integrado.

El CI L293 tiene las siguientes características:

  • Se pueden controlar hasta 2 motores.
  • Proporciona 1A a los motores (en total)  y permite cambiar el sentido de giro.
  • Utiliza un puente en H que funciona según se observa en las figuras (internamente utiliza transistores para conmutar*) :

Modos de operación para invertir el sentido de giro:

"H bridge operating" by Cyril BUTTAY - own work, made using inkscape. Licensed under CC BY-SA 3.0 via Wikimedia Commons.

*Datasheet:Nuestra http://www.me.umn.edu/courses/me2011/arduino/technotes/dcmotors/L293/l293.pdfpropuesta es que montes el motor utilizando el CI L293 que realice el siguiente ciclo :
- Giro en un sentido durante 1seg.
- Paro durante 0.5seg.
- Giro en sentido contrario durante 1 seg
- Paro durante 0.5seg.

Con

Montaje 30 motor con Circuito L293 con Edubásica

Edubásica es una tarjeta diseñada para facilitar la tarea en el aula. Elimina gran parte de cableado y conexiones en la placa de pruebas lo que evita muchos errores en las prácticas. 

En esta placa disponemos de las dos opciones vistas anteriormente. Edubásica lleva montados, entre otros componentes, un circuito integrado L293 y un transistor. Por lo tanto podemos activar motores usando ambas opciones, aunque lo recomendable es utilizar el L293 que permite el cambio de sentido de giro y regular la velocidad actuando con una señal PWM sobre los dos pines de habilitación (dependiendo de la hoja de datos viene como ENABLE o CHIP INHIBIT)  del circuito L293. Los pines de Arduino que pueden regular la velocidad por PWM correspondientes a esas patillas de habilitación serán: D10 para el motor A y D11 para el motor B.

Para hacer funcionar dos motores DC con Edubásica sólo tenemos que conectar en las clemas indicadas (serigrafiados en la placa como Motor A y Motor B) los dos cables de cada motor. Según se observa en la imagen, tenemos 4 conexiones para los dos motores. Desde Arduino y con la tabla de verdad del CI L293 indicada en la sección anterior,  podemos regular el sentido de giro y velocidad de cada motor.

Edubásica lleva un interruptor que permite tomar el voltaje de la salida Vin de Arduino (alimentación externa), necesaria para dar la corriente suficiente para accionar los motores. Cuando el piloto Vin está encendido significa que la alimentación de Edubásica viene de Vin de Arduino, o bien, directamente desde una fuente externa conectada a la clema Vin de Edubásica de la regleta de alimentación (en la imagen la regleta de la parte inferior).

Es muy fácil, podemos conectar hasta dos motores en los pines dispuestos para ello, y utilizaremos:

  • Para el motor A el control de velocidad por el pin 10 y las direcciones por 8 y 9
  • Para el motor B el control de velocidad por el pin 11 y las direcciones por 12 y 13.
  • Interruptor en ON

Conectando los dos terminales del motor a la clema del transistor de Edubásica, también podríamos hacerlo funcionar enviando un nivel HIGH al pin digital 6 de Arduino.  Este pin (D6) está conectado directamente a la base del transistor de Edubásica. La desventaja respecto al CI L293 es que, en este caso, no podríamos cambiar el sentido de giro.

Sin

Montaje 30 motor con Circuito L293 sin Edubásica

Vamos a ver de qué manera se pueden activar los motores DC para hacer una secuencia sencilla de giro. Primero de todo vamos a ver cómo se conecta todo.

 

Las conexiones del circuito integrado según podemos ver en la hoja de datos del fabricante son las siguientes:

  • Vcc2(VC), pin 8 del L293:  El voltaje que se introduzca aquí alimentará a los motores (Vin de Arduino).

  • Vcc1(VSS), pin 18 del L293: El voltaje que se introduzca aquí alimentará al propio circuito integrado (+5V de Arduino).

Las conexiones del circuito con Arduino las podemos ver en el siguiente esquema:

Vamos a detallar la correspondencia entre pines de Arduino y del circuito L293

Para saber la orientación del sentido de giro disponemos de la siguiente tabla de verdad:

Simulación 30 motor con Circuito L293 sin Edubásica

Montaje 31 Construcción de un coche

Vamos a darle un poco de emoción

via GIPHY

Chasis coche Con Edubásica

Puedes ver en esta página de Luis Llamas cómo hacer un coche teledirigido puede salir por menos de 20€, nosotros como ya tenemos el L298N integrado en Edubasica, sólo hemos comprado el chasis por 7€ y no vamos a poner sensor ultrasonidos y sensor de línea:

Si quieres hacerlo todo terreno Luis Llamas te explica cómo hacerlo con cadenas.

Conexiones

Las conexiones son muy sencillas:

  • Pines motor A al conector pines motor A de Edubásica
  • Pines motor B al conector pines motor B de Edubásica
  • Cables de las pilas a Vin y GND

NOTA: Si funciona pero con las oŕdenes cambiadas (es decir que queremos que gire a la izquierda y va hacia delante, queremos que vaya hacia delante y gira a la izquierda...) es debido a que tenemos los cables rojo y negro de un motor intercambiados.

Ordenes

Estos son los pines que hay que activar:

|Orden|MotorA|MotorB| |--|--|--| |Velocidad|10|11| |Dirección 1|8|12| |Dirección 2|9|13|

La tabla de verdad es muy fácil:

MOTOR A

|Pin 10|Pin 8|Pin 9|MotorA| |--|--|--|--| |HIGH|HIGH|LOW|giro| |HIGH|LOW|HIGH|giro contrario| |LOW|X|X|STOP|

MOTOR B

|Pin 11|Pin 12|Pin 13|MotorB| |--|--|--|--| |HIGH|HIGH|LOW|giro| |HIGH|LOW|HIGH|giro contrario| |LOW|X|X|STOP|

AUN TE QUEDA UNA CONEXIÓN

Recuerda que en el transistor aún puedes poner otro motor. Respecto a terminales digitales, te quedan pines para poner servos, sensor de ultrasonidos, sensor de líneas...

via GIPHY

... en fin que las posibilidades son muchas

via GIPHY

Chasis sin Edubásica

Tenemos que comprar el chasis anterior y además un L298N, recomendamos ver esta página de Luis Llamas

Conexiones

La circuitería se complica, pues necesitamos cablear los pines de control:

Tal y como dice Luis Llamas:

Siempre que uséis más de una fuente de tensión recordar poner en común todos los GND incluido el de Arduino. De lo contrario podéis dañar un componente.

Ordenes

Para respetar los mismos programas que Luis Llamas, estos son los pines que hay que activar:

|Orden|MotorA|MotorB| |--|--|--| |Velocidad|6|11| |Dirección 1|7|9| |Dirección 2|8|10|

La tabla de verdad es muy fácil:

MOTOR A

|Pin 6|Pin 7|Pin 8|MotorA| |--|--|--|--| |HIGH|HIGH|LOW|giro| |HIGH|LOW|HIGH|giro contrario| |LOW|X|X|STOP|

MOTOR B

|Pin 11|Pin 9|Pin 10|MotorB| |--|--|--|--| |HIGH|HIGH|LOW|giro| |HIGH|LOW|HIGH|giro contrario| |LOW|X|X|STOP|

Montaje 6 Coche loco

Vamos a realizar un programa que cuando se apriete el botón de Edubásica, pues el coche haga un baile:

Los programas con motor son sencillos pero engorrosos, este programa es sencillo y verás que tiene muchas líneas, un poco de complicación y se complica mucho más

CODIGO CON EDUBÁSICA

////////////// CON EDUBASICA ////////////////
#define ENABLEA 10
#define DIR1A 8
#define DIR2A 9
#define ENABLEB 11
#define DIR1B 12
#define DIR2B 13
#define BOTON 2
#define LEDVERDE 3
#define LEDAMARILLO 4
#define LEDROJO 5
byte dato;
/////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  ///configuraciones inicio
  pinMode(ENABLEA,OUTPUT);  pinMode(DIR1A,OUTPUT);  pinMode(DIR2A,OUTPUT);
  pinMode(ENABLEB,OUTPUT);  pinMode(DIR1B,OUTPUT);  pinMode(DIR2B,OUTPUT);
  pinMode(BOTON,INPUT);
  pinMode(LEDVERDE,OUTPUT); pinMode(LEDAMARILLO,OUTPUT);  pinMode(LEDROJO,OUTPUT);
  /// delante
  digitalWrite(LEDVERDE, HIGH);    digitalWrite(LEDROJO, LOW);   digitalWrite(LEDAMARILLO, LOW);
  digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,HIGH);     digitalWrite(DIR2A,LOW);
  digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,HIGH);     digitalWrite(DIR2B,LOW);
  delay(1000);
  //atras
  digitalWrite(LEDVERDE, LOW);     digitalWrite(LEDROJO, HIGH);   digitalWrite(LEDAMARILLO, LOW);
  digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,LOW);      digitalWrite(DIR2A,HIGH);
  digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,LOW);      digitalWrite(DIR2B,HIGH);
  delay(1000);
  //derecha
  digitalWrite(LEDVERDE, HIGH);     digitalWrite(LEDROJO, LOW);    digitalWrite(LEDAMARILLO, HIGH);
  digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,LOW);       digitalWrite(DIR2A,HIGH);
  digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,HIGH);      digitalWrite(DIR2B,LOW);
  delay(1000);
  //izquierda  
  digitalWrite(LEDVERDE, HIGH);     digitalWrite(LEDROJO, HIGH);    digitalWrite(LEDAMARILLO, HIGH);
  digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,HIGH);      digitalWrite(DIR2A,LOW);
  digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,LOW);       digitalWrite(DIR2B,HIGH);
  delay(1000);
  //stop 
  digitalWrite(LEDVERDE, LOW);     digitalWrite(LEDROJO, LOW);    digitalWrite(LEDAMARILLO, LOW);
  digitalWrite(ENABLEA,LOW);
  digitalWrite(ENABLEB,LOW);  
}
void loop(){
}

SIN EDUBASICA

Cambia el principio de la cabecera, y omite los LEDs:

////////////// SIN EDUBASICA ////////////////
#define ENABLEA 6
#define DIR1A 7
#define DIR2A 8
#define ENABLEB 11
#define DIR1B 9
#define DIR2B 10

Reto

¿Que tal si en vez de activarse con el botón, que simplemente cuando este oscuro (utiliza el valor del pin analógico 2 = LDR), se ponga a bailar?

Montaje 7 Coche teledirigido

Sé que lo estabas pensando... ponerle el Bluetooth, vamos allá:

OJO, para realizar este ejercicio tienes que vincular el HC-06 con la APP, ¿te acuerdas cómo lo hicimos?

CODIGO CON EDUBÁSICA

////////////// CON EDUBASICA ////////////////
#define ENABLEA 10
#define DIR1A 8
#define DIR2A 9
#define ENABLEB 11
#define DIR1B 12
#define DIR2B 13
#define BOTON 2
#define LEDVERDE 3
#define LEDAMARILLO 4
#define LEDROJO 5
byte dato;
/////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(9600);
  pinMode(ENABLEA,OUTPUT);  pinMode(DIR1A,OUTPUT);  pinMode(DIR2A,OUTPUT);
  pinMode(ENABLEB,OUTPUT);  pinMode(DIR1B,OUTPUT);  pinMode(DIR2B,OUTPUT);
  pinMode(BOTON,INPUT);
  pinMode(LEDVERDE,OUTPUT); pinMode(LEDAMARILLO,OUTPUT);  pinMode(LEDROJO,OUTPUT);


}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  if (Serial.available())  dato= Serial.read();//Guardamos en la variable dato el valor leido

   //Comprobamos el dato
   switch(dato) {//Si recibimos una  ...  85=ARRIBA  68=U=ABAJO 67=D=CENTRO  76=L=IZQUIERDA 82=R=DCHA  97=a  98=B  99=C
         case 'U': //UP HACIA DELANTE
         {
           digitalWrite(LEDVERDE, HIGH);    digitalWrite(LEDROJO, LOW);   digitalWrite(LEDAMARILLO, LOW);
           digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,HIGH);     digitalWrite(DIR2A,LOW);
           digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,HIGH);     digitalWrite(DIR2B,LOW);
           break;
         }
         case 'D': //"D": ABAJO
         {
           digitalWrite(LEDVERDE, LOW);     digitalWrite(LEDROJO, HIGH);   digitalWrite(LEDAMARILLO, LOW);
           digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,LOW);      digitalWrite(DIR2A,HIGH);
           digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,LOW);      digitalWrite(DIR2B,HIGH);
           break;
         }
         case 'L': //"L": IZQUIERDA
         {
           digitalWrite(LEDVERDE, HIGH);     digitalWrite(LEDROJO, LOW);    digitalWrite(LEDAMARILLO, HIGH);
           digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,LOW);       digitalWrite(DIR2A,HIGH);
           digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,HIGH);      digitalWrite(DIR2B,LOW);
           break;
         }
         case 'R': //"R": DERECHA
         {
           digitalWrite(LEDVERDE, HIGH);     digitalWrite(LEDROJO, HIGH);    digitalWrite(LEDAMARILLO, HIGH);
           digitalWrite(ENABLEA,HIGH);      digitalWrite(DIR1A,HIGH);      digitalWrite(DIR2A,LOW);
           digitalWrite(ENABLEB,HIGH);      digitalWrite(DIR1B,LOW);       digitalWrite(DIR2B,HIGH);
           break;
         }
          case 'S':  //si apretamos a start que pare
         {
           digitalWrite(LEDVERDE, LOW);     digitalWrite(LEDROJO, LOW);    digitalWrite(LEDAMARILLO, LOW);
           digitalWrite(ENABLEA,LOW);
           digitalWrite(ENABLEB,LOW);  
           break;
         }      
  }
}

SIN EDUBASICA

Cambia el principio de la cabecera, y omite los LEDs:

////////////// SIN EDUBASICA ////////////////
#define ENABLEA 6
#define DIR1A 7
#define DIR2A 8
#define ENABLEB 11
#define DIR1B 9
#define DIR2B 10

via GIPHY

via GIPHY

Coche teledirigido con voz

¿Y si ahora lo controlamos por voz?

Solución

¡¡ Es el mismo código que 6.2.3.4 M7 Coche teledirigido !!!

Lo que pasa es en la aplicación Arduino Blue Control utilizamos en vez del mando con flechas, el control de voz. Easy-peasy !!

Y previamente hemos configurado los comandos de voz:

| Orden de voz| Comando a enviar | |-------------|------------------| | adelante | U | | atrás | D | | derecha | R | | izquierda | L |
| stop | S |

Total 5 comandos de voz a configurar: