Muestra las diferencias entre dos versiones de la página.
guias:control_de_motores [2018/05/06 16:51] – test flush cache Oscar | guias:control_de_motores [2021/04/16 20:41] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Control de motores con Arduino ====== | ====== Control de motores con Arduino ====== | ||
+ | <WRAP tip> **Un motor de corriente continua** (denominado también motor DC por las iniciales en inglés direct current) es una máquina que convierte energía eléctrica en mecánica, provocando un movimiento rotatorio, gracias a la acción de un campo magnético. | ||
+ | {{: | ||
+ | |||
+ | Un motor de corriente continua se compone principalmente de dos partes: El estátor (carcasa exterior) crea un campo magnético. El rotor es la parte interior que gira, alimentado con corriente directa a través de delgas, que están en contacto alternante con escobillas fija. | ||
+ | |||
+ | Adaptado de [[https:// | ||
+ | |||
+ | ===== Introducción ===== | ||
+ | |||
+ | Esta página está dedicada al control de motores con Arduino. Específicamente motores de corriente contínua estándar. Existen algunos motores DC especiales como los motores paso a paso o sin escobillas (brushless en inglés) que no serán tratados aquí. Una buena parte de la información servirá para otras plataformas como Raspberry Pi, pero en general las librerías de programación y los esquemas estarán dedicados en exclusiva a Arduino. | ||
+ | |||
+ | Arduino tiene pines de entrada y de salida para comunicarse físicamente con su entorno. Los pines de salida pueden dar una pequeña cantidad de energía que sirve por ejemplo para encender un LED, pero no pueden alimentar a un motor. Para ello necesitamos un circuito que haga de intermediario. Este circuito, el controlador o driver de motores, tomará energía de otra fuente (una pila, batería o equivalente) y siguiendo las instrucciones de Arduino hará funcionar el motor. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Existen muchos drivers diferentes, pero para poder controlar bien un motor necesitamos dos características fundamentales: | ||
+ | |||
+ | * Que permitan invertir el sentido de giro del motor. | ||
+ | * Que permitan graduar la velocidad de giro del motor. | ||
+ | |||
+ | ===== Drivers con Puentes H ===== | ||
+ | |||
+ | El circuito básico que permite las dos funciones que dijimos es un puente H. Un motor DC cambia el sentido de giro cuado invertimos los polos positivo y negativo en sus bornes, y este circuito juega con una serie de interruptores para hacer ese cambio de polaridad. Podemos construir un puente H con cuatro interruptores, | ||
+ | |||
+ | {{: | ||
+ | ===== Señales PWM ===== | ||
+ | |||
+ | Un motor DC está preparado para funcionar a una tensión que nos dará el fabricante. Si le damos una tensión menor girará más despacio, llegando en el extremo a pararse. Así regulamos la velocidad. | ||
+ | |||
+ | Arduino no puede (con excepciones) regular directamente los voltios que salen por un pin, pero puede hacer una pequeña ' | ||
+ | |||
+ | * Arduino puede generar señales PWM y así simular una tensión menor en voltios. | ||
+ | * Esta señal sirve para controlar motores a través de un puente H (¡¡¡con una señal ' | ||
+ | * Los motores DC aceptan esta señal ' | ||
+ | |||
+ | |||
+ | No todos los pines de Arduino pueden hacer esta función [[https:// | ||
+ | ===== Librerías de programación ===== | ||
+ | |||
+ | La programación de Arduino, igual que muchos lenguajes, permite la creación de nuevas instrucciones en forma de librerías. | ||
+ | |||
+ | Para utilizar un driver combinaremos salidas PWM con salidas digitales en las que las opciones son apagado (LOW) o apagado (HIGH). Cada driver tiene su tabla lógica para funcionar. Un ejemplo de código para mover un motor podría ser este: | ||
+ | |||
+ | < | ||
+ | analogWrite(9, | ||
+ | digitalWrite(8, | ||
+ | digitalWrite(7, | ||
+ | </ | ||
+ | |||
+ | Sin embargo en lugar trabajar con los pines uno a uno, lo haremos indirectamente con librerías que transformarán ese código en algo más sencillo como ' | ||
+ | |||
+ | < | ||
+ | nombredelrobot.forward(128, | ||
+ | nombredelrobot.reverse(128, | ||
+ | nombredelrobot.rotate(128, | ||
+ | nombredelrobot.rotate(128, | ||
+ | nombredelrobot.brake(1000); | ||
+ | </ | ||
+ | |||
+ | Hemos tratado de que las librerías tengan todas las mismas instrucciones con independencia del driver. Están alojadas en Github y también allí están los detalles para su uso. Como todo el material de Bricolabs son libres, puedes hacer con ellas lo que quieras. | ||
+ | |||
+ | ===== Conexionado general ===== | ||
+ | |||
+ | Un driver de motores, tal y como se puede ver en el diagrama de bloques de arriba, tendrá una serie de cables que van al Arduino (líneas de control), una entrada de energía conectada a una fuente como una batería o similar (línea de potencia) y las líneas que van finalmente a los motores. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Algunas placas para robótica como la [[https:// | ||
+ | ===== Características generales de los drivers ===== | ||
+ | |||
+ | Cuando elegimos un driver para nuestro proyecto -de robot móvil o lo que queramos- debemos tener en cuenta varias cosas: | ||
+ | |||
+ | * Cuántos motores vamos a controlar. Hay circuitos integrados -y placas- que pueden controlar 1, 2, 4, 6 o el número que se nos ocurra. | ||
+ | * Qué potencia (consumo en mA) necesitan esos motores. El driver deberá dara esa potencia o más. | ||
+ | * Qué tensión de alimentación (en V) tienen los motores. | ||
+ | |||
+ | Si la potencia es suficiente podremos conectar dos motores en paralelo a una misma salida de un driver. También podemos conectar varios drivers (iguales o no) pero necesitaremos un Arduino con muchas salidas (como el [[https:// | ||
+ | |||
+ | Además tendremos en cuenta, en función de nuestro proyecto, el tamaño del driver. Para proyectos en miniatura como [[https:// | ||
+ | |||
+ | ===== Drivers más utilizados en proyectos DIY/DIWO ===== | ||
+ | |||
+ | A continuación vamos a detallar una lista de drivers utilizados muy comunmente en proyectos de robótica casera, que conocemos de nuestros propios proyectos y para los que hemos creado librerías. La lista incluye: | ||
+ | |||
+ | * L9110 | ||
+ | * L298N | ||
+ | * L297D | ||
+ | * TB6612FNG | ||
+ | * DRV8835 | ||
+ | |||
+ | Si el motor una vez conectado no gira en el sentido deseado podemos cambiarlo muy fácilmente tanto en el hardware (intermabiando los cables del motor o del driver) como en el software (cambiando los pines en la programación). | ||
+ | |||
+ | ==== L9110 ==== | ||
+ | |||
+ | Este pequeño driver (y su gemelo HG7881) sirve para controlar motores de entre 2.5 y 12 voltios y con un consumo máximo de 800 mA. El integrado sirve para controlar sólo un motor, pero habitualmente se monta en placas con dos unidades para controlar dos motores. Es el que utilizamos para los motores de tipo N20 del Sapoconcho. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | La típica placa doble tiene cuatro fichas para atornillar los cables de los motores y seis pines: | ||
+ | |||
+ | * Dos de control PWM para el motor A (A-IA, A-IB). | ||
+ | * Dos para el motor B (idem, B-IA, B-IB). | ||
+ | * Dos de alimentación desde las pilas o baterías (VCC, GND). | ||
+ | |||
+ | La conexión ya la hemos visto para un Arduino Pro Micro. Para un cualquier otro es similar, buscando siempre 4 pines PWM. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | La lógica de operación de la placa para cada uno de los motores es la siguiente (la tabla indica la señal en cada pin para el motor A). | ||
+ | |||
+ | ^Pin^Giro adelante^Giro atrás^Parada| | ||
+ | |AI-A|pwm|0|0| | ||
+ | |AI-B|0|pwm|0| | ||
+ | |||
+ | Librerías de funcionaminto para L9110: en este enlace de [[https:// | ||
+ | |||
+ | Una vez conectado el driver e instaladas las librerías deberás elegir un nombre para tu robot, y decirle en qué pines has conectado el driver (en el ejemplo los pines 3, 5, 6 y 9), y para eso comenzar tus programas de este modo: | ||
+ | |||
+ | < | ||
+ | #include < | ||
+ | L9110 nombredelrobot(3, | ||
+ | </ | ||
+ | |||
+ | A continuación ya puedes usar dentro de tu código las funciones de movimiento de la librería para moverte adelante, atras, girar y frenar. | ||
+ | |||
+ | ==== L298N ==== | ||
+ | |||
+ | Este driver es bastante mayor, tanto en tamaño como en potencia. Sirve para controlar motores de entre 6 y 50 voltios y con un consumo máximo de 2 A. Un mismo integrado sirve para controlar dos motores. Es el que usamos en el proyecto R2D2. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | La típica placa tiene seis fichas para atornillar los cables de los motores y la alimentación (más una salida regulada de 5 v) y seis pines: | ||
+ | |||
+ | * Tres pines de control para el motor A, dos de ellos digitales (IN1, IN2) y uno PWM (ENA). | ||
+ | * Otro tres con el mismo esquema para el motor B (IN3, IN4, ENB). | ||
+ | |||
+ | La operación del driver tiene la siguiente lógica (la tabla indica la señal en cada pin para el motor A). | ||
+ | |||
+ | ^Pin^Giro adelante^Giro atrás^Parada| | ||
+ | |IN1|LOW|HIGH|LOW| | ||
+ | |IN2|HIGH|LOW|LOW| | ||
+ | |ENA|pwm|pwm|0| | ||
+ | |||
+ | Esquema de conexión con Arduino UNO | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Librerías de funcionaminto para L298N: en este enlace de [[https:// | ||
+ | |||
+ | < | ||
+ | #include < | ||
+ | L298N nombredelrobot(3, | ||
+ | </ | ||
+ | |||
+ | Las funciones de movimiento son similares a las del L9110. | ||
+ | |||
+ | === Shield Ardumoto === | ||
+ | |||
+ | Una versión especial del driver L298N viene ya premontado en una shield de Sparkfun para Arduino que se llama [[https:// | ||
+ | |||
+ | {{: | ||
+ | |||
+ | La lógica de funcionamiento es la misma y las librerías de programación puedes encontrarlas [[https:// | ||
+ | |||
+ | < | ||
+ | #include < | ||
+ | ardumoto nombredelrobot; | ||
+ | </ | ||
+ | |||
+ | ==== L293D ==== | ||
+ | |||
+ | Este driver puede encontrarse montado en una placa independiente, | ||
+ | |||
+ | El esquema de conexión es el siguiente: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | La lógica de funcionamiento es la misma que en el L298N y por tanto la librería anterior es válida sin cambios. Tiene dos pines de dirección (digitales) y uno PWM (enable) por cada lado del integrado. Tambien dos entradas de alimentación, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Adafruit Motor Shield === | ||
+ | |||
+ | Adafruit ha creado una shield con dos L293D para cuatro motores y puedes intentar crear tu propia librería fijándote en la estructura de las nuestras. Pero en realidad [[http:// | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ==== TB6612FNG ==== | ||
+ | |||
+ | Este driver de Toshiba es pequeño pero matón. Puede controlar dos motores entre 4.5 y 13.5 voltios y con un consumo máximo de 1 A sontenido, admitiendo picos de 3.2 A por canal. Tiene además integrada una protección térmica para que no podamos quemarlo. Es el que usamos en el proyecto [[https:// | ||
+ | |||
+ | Utiliza una lógica similar a la de los L298D y L293D, pero con un séptimo pin de control que permite poner toda la placa en stand-by parando los dos motores a la vez. Las conexiones entre un Arduino UNO y el driver pueden verse aquí. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Una característica especial de este driver, como el L293D, es que tiene dos entradas de alimentación. Una para los motores, con la tensión de estos (4.5 a 13.5 voltios, etiquetada como VM) y otra para el propio driver, que puede tomarse del propio pin de 5 voltios de Arduino (VCC). | ||
+ | |||
+ | === Redbot === | ||
+ | |||
+ | El driver TB6612FNG también es el que integra la [[https:// | ||
+ | |||
+ | {{: | ||
+ | |||
+ | La documentación de esta librería y un curso completo para hacer robots con esta placa está en el proyecto [[https:// | ||
+ | |||
+ | ==== DRV8835 ==== | ||
+ | |||
+ | Este pequeño driver tiene un uso similar al L9110 con cuatro pines PWM y es capaz de dar 1.2A (puntas de 1.5A) a dos motores con tensiones hasta 11V. Tiene una entrada de alimentación para el propio driver que puede usar los 5v de Arduino. | ||
+ | |||
+ | Es el driver que integra la shield [[https:// | ||
+ | |||
+ | ===== El Anillo Único ===== | ||
+ | |||
+ | También hemos creado una [[https:// | ||
+ | |||
+ | ===== Equipo ===== | ||
+ | |||
+ | * [[: | ||
+ | * [[: | ||
+ | * Rafa Couto | ||
+ | * Manuel | ||
+ | |||
+ | ===== Enlaces ===== | ||
+ | |||
+ | * [[https:// | ||
+ | * [[http:// |