Introducción

En este tutorial explicaremos como utilizar uno de los componentes más importantes cuando se trata de actuadores en el mundo de la robótica: los motores de corriente continua (motor CC o motor DC) que nos permitirán accionar de manera mecánica cualquier tipo de dispositivo: móviles, brazos articulados, barreras, etc.... En el caso del robot móvil que estamos construyendo estos motores nos permitirán realizar todos los movimientos de nuestro proyecto de acuerdo con el diseño del mismo...

motorCCrueda

¿Qué es un motor de corriente continua (motor CC o motor DC)?

El motor de corriente continua (denominado también motor de corriente directa, motor CC o motor DC) es una máquina que convierte la energía eléctrica en mecánica, provocando un movimiento rotatorio, gracias a la acción que se genera del campo magnético.

Es difícil moverse por nuestro mundo sin tropezarte con motores eléctricos de todos los tipos y tamaños. Desde los pequeños con los que arrancas el coche cada mañana a los muy pequeños que mueven tu reproductor de CDs o DVS, al que hace girar el microondas con el que te calientas el café al levantarte, estamos rodeados de motores eléctricos.

No entraremos en profundidad en el funcionamiento más teórico de este tipo de dispositivos porque nuestro principal objetivo será aprender a usarlos en nuestros proyectos de Arduino pero, una ligera noción teórica no hará daño a nadie (mas información).

Según la ley de Fuerza simplificada, cuando un conductor por el que pasa una corriente eléctrica se sumerge en un campo magnético, el conductor sufre una fuerza perpendicular al plano formado por el campo magnético y la corriente, siguiendo la regla de la mano derecha. Es importante recordar que para un generador se usará la regla de la mano derecha mientras que para un motor se usará la regla de la mano izquierda para calcular el sentido de la fuerza.

Ejs Open Source Direct Current Electrical Motor Model Java Applet ( DC Motor ) 80 degree split ring.gif

En el caso de los motores de corriente continua sencillos que vamos a utilizar, básicamente debemos conocer que en cuanto suministramos por sus dos terminales un voltaje entre 3 y 9 V con la suficiente intensidad producirá un giro que cambiará de sentido si cambiamos las conexiones del mismo.
motor

Funcionamiento del motor de corriente continua con el driver L298n

Hasta ahora hemos utilizado las salidas de nuestro Arduino para influir en el mundo exterior gobernando únicamente diodos LED y pequeños servomotores. Hemos podido hacerlo porque tiene capacidad suficiente (potencia) para poder accionarlos pero existen muchos otros componentes en los que la capacidad (potencia eléctrica) que suministra nuestro arduino es insuficiente. En este caso están los motores de corriente continua que gobernarán el movimiento de nuestro robot

Para ayudarnos con este problema de potencia eléctrica y simplificar el cableado y programación cuando se crean proyectos de corriente continua se usará el módulo o driver L298n

El módulo controlador de motores L298N H-bridge nos permite controlar la velocidad y la dirección de dos motores de corriente continua o un motor paso a paso de una forma muy sencilla, gracias a los 2 los dos H-bridge que monta. Un puente-H o H-bridge es un componente formado por 4 transistores que nos permite invertir el sentido de la corriente, y de esta forma podemos invertir el sentido de giro del motor. El rango de tensiones en el que trabaja este módulo va desde 3V hasta 35V, y una intensidad de hasta 2A. A la hora de alimentarlo hay que tener en cuenta que la electrónica del módulo consume unos 3V, así que los motores reciben 3V menos que la tensión con la que alimentemos el módulo. Además el L298N incluye un regulador de tensión que nos permite obtener del módulo una tensión de 5V, perfecta para alimentar nuestro Arduino. Eso sí, este regulador sólo funciona si alimentamos el módulo con una tensión máxima de 12V. Es un módulo que se utiliza mucho en proyectos de robótica, por su facilidad de uso y su reducido precio.

driverL298n

Conexión eléctrica

Las salidas para los motores A y B nos darán la energía para mover los motores. Tened en cuenta la polaridad al conectarlos, para que cuando más tarde hagamos que se muevan adelante, funcionen como deberían. Si no fuera así, no tendríamos más que invertir las conexiones.
Los pines IN1 e IN2 nos sirven para controlar el sentido de giro del motor A, y los pines IN3 e IN4 el del motor B. Funcionan de forma que si IN1 está a HIGH e IN2 a LOW, el motor A gira en un sentido, y si está IN1 a LOW e IN2 a HIGH lo hace en el otro. Y lo mismo con los pines IN3 e IN4 y el motor B.

Para controlar la velocidad de giro de los motores tenemos que quitar los jumpers y usar los pines ENA y ENB. Los conectaremos a dos salidas PWM de Arduino de forma que le enviemos un valor entre 0 y 255 que controle la velocidad de giro. Si  tenemos los jumpers colocados, los motores girarán a la siempre a la misma velocidad.

A continuación realizaremos el esquema en el que alimentaremos el driver L298n y los motores con una fuente de alimentación externa (en nuestro caso 4 pilas AA que nos proporcionan un voltaje de 6 V aunque existirían mejores y más caras opciones (leer artículo sobre alimentación de la placa Arduino)) por lo que. nuestro vehículo se podría mover sin tener que estar conectado al ordenador.

circuitocompletocorrecto

Código Arduino

En principio vamos a mostrar el código necesario para controlar un solo motor, por lo que solo sería necesario conectar el citado motor a nuestro driver y de nuestro driver a Arduino..

En este sencillo ejemplo, que sirve para familiarizarnos con los motores, el motor girará durante un tiempo en un sentido, parará, girará en sentido contrario y volverá a parar.

Arduino Code
  1. /*
  2.  Ejemplo de control de motor DC usando modulo L298
  3.  El programa activa el motor en un sentido por 4 segundos,
  4.  para el motor por 500 ms, activa el motor en sentido inverso por 4 segundos
  5.  y se detiene por 5 segundos. Luego repite la acción indefinidamente.
  6.  */
  7.  
  8. const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor A
  9. const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor A
  10.  
  11. void setup()
  12. {
  13. pinMode (IN1, OUTPUT); // Input4 conectada al pin 4
  14. pinMode (IN2, OUTPUT); // Input3 conectada al pin 5
  15. }
  16. void loop()
  17. {
  18. // Motor gira en un sentido
  19. digitalWrite (IN1, HIGH);
  20. digitalWrite (IN2, LOW);
  21. delay(4000);
  22. // Motor no gira
  23. digitalWrite (IN1, LOW);
  24. delay(500);
  25. // Motor gira en sentido inverso
  26. digitalWrite (IN2, HIGH);
  27. delay(4000);
  28. // Motor no gira
  29. digitalWrite (IN2, LOW);
  30. delay(5000);
  31. }
  32.  

A continuación ya presentaremos el código que usaremos para controlar los 2 motores que compondrán nuestro robot...

En este sencillo ejemplo, que sirve para familiarizarnos con los motores, el motor girará durante un tiempo en un sentido, parará, girará en sentido contrario y volverá a parar.

Arduino Code
  1. /*
  2.   Nombre: Controlando motores de corriente contínua (CC) con driver L298n
  3.   Autor: Daniel Pascual Gallegos
  4.   Fecha: Noviembre 2016
  5.   Funcionalidad: Este subproyecto forma parte de la construcción de nuestro robot autónomo.
  6.   En este subproyecto usaremos el driver L298n para gobernar 2 motores de CC que realizarán
  7.   la parte mecánica de nuestro robot móvil.
  8. */
  9.  
  10. // Definición de variables y constantes relacionadas con el motor A
  11. const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor A
  12. const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor A
  13.  
  14. // Definición de variables y constantes relacionadas con el motor B
  15. //const int ENB = 5; // Pin digital 5 (PMW) para controlar velocidad motor A
  16. const int IN3 = 11; // Pin digital 11 para controlar sentido giro motor A
  17. const int IN4 = 10; // Pin digital 10 para controlar sentido giro motor A
  18.  
  19. // Función que se ejecuta una sola vez al cargar el programa
  20. void setup()
  21. {
  22. // Se declaran todos los pines como salidas
  23. pinMode (IN1, OUTPUT);
  24. pinMode (IN2, OUTPUT);
  25. pinMode (IN3, OUTPUT);
  26. pinMode (IN4, OUTPUT);
  27. }
  28.  
  29. // Función que se repite de manera periódica
  30. void loop()
  31. {
  32. robotAvance();
  33. delay (5000);
  34. robotRetroceso();
  35. delay (5000);
  36. robotDerecha();
  37. delay (5000);
  38. Izquierda ();
  39. delay (5000);
  40. Parar ();
  41. delay (5000);
  42. }
  43.  
  44. /*
  45.   Función robotAvance: esta función hará que ambos motores se activen a máxima potencia
  46.   por lo que el robot avanzará hacia delante
  47. */
  48. void robotAvance()
  49. {
  50. //Sentido motor A
  51. // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  52. digitalWrite (IN1, HIGH);
  53. digitalWrite (IN2, LOW);
  54.  
  55. //Direccion motor B
  56. // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  57. digitalWrite (IN3, HIGH);
  58. digitalWrite (IN4, LOW);
  59. }
  60. /*
  61.   Función robotRetroceso: esta función hará que ambos motores se activen a máxima potencia en sentido contrario al anterior
  62.   por lo que el robot avanzará hacia atrás
  63. */
  64. void robotRetroceso()
  65. {
  66. //Sentido motor A
  67. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  68. digitalWrite (IN1, LOW);
  69. digitalWrite (IN2, HIGH);
  70.  
  71. //Direccion motor B
  72. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  73. digitalWrite (IN3, LOW);
  74. digitalWrite (IN4, HIGH);
  75. }
  76.  
  77. /*
  78.   Función robotDerecha
  79. */
  80. void robotDerecha()
  81. {
  82. //Sentido motor A
  83. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  84. digitalWrite (IN1, LOW);
  85. digitalWrite (IN2, HIGH);
  86.  
  87. //Direccion motor B
  88. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  89. digitalWrite (IN3, LOW);
  90. digitalWrite (IN4, HIGH);
  91. }
  92.  
  93. /*
  94.   Función Izquierda
  95. */
  96. void Izquierda ()
  97. {
  98. //Direccion motor A
  99. digitalWrite (IN1, LOW);
  100. digitalWrite (IN2, HIGH);
  101.  
  102. //Direccion motor B
  103. digitalWrite (IN3, HIGH);
  104. digitalWrite (IN4, LOW);
  105. //analogWrite (ENB, 150); //Velocidad motor A
  106. }
  107.  
  108. void Parar ()
  109. {
  110. //Direccion motor A
  111. digitalWrite (IN1, LOW);
  112. digitalWrite (IN2, LOW);
  113.  
  114. //Direccion motor B
  115. digitalWrite (IN3, LOW);
  116. digitalWrite (IN4, LOW);
  117. }
  118.  

Código mBlock

En este sencillo ejemplo, que sirve para familiarizarnos con la programación del driver l298n con mBlock, se producirá la siguiente secuencia: el motor izquierdo girará en un sentido durante 5 segundos, luego girará en el sentido contrario durante 5 segundos y se parará comenzando a girar el motor derecho durante 5 segundos para, con posterioridad, girar en sentido contrario otros 5 segundos y terminar parándose. Puedes descargar el código del programa mBlock pulsando sobre este enlace (driverL298n_Ej1.sb2)

driverL298n Ej1

En el siguiente ejemplo se producirá la siguiente secuencia: los 2 motores girarán en el mismo sentido durante 5 segundos para, con posterioridad, invertir el sentido de giro durante otros 5 segundos. Puedes descargar el código del programa mBlock pulsando sobre este enlace (driverL298n_Ej2.sb2)

driverL298n Ej2
Spanish English French German Italian Portuguese Russian

Redes sociales

facebook iconotwitterGoogle plus iconpinterest

Artículos

TIC