control de motores dc arduino, motores dc, arduino, proyectos con arduino.pdf

10
28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino. http://hispavila.com/3ds/atmega/motorescc.html 1/11 CONTROL DE MOTORES CC con Arduino. Mar 28.10.2014 CRTL+D, para volver a visitarnos. Creado por: V. García. Tema: Buscar PROLOGO. Este artículo, se puede considerar como una aplicación que puede ser puesta en práctica, de la teoría que se describe, en la que se emplean dos motores de corriente continua cuya aplicación puede responder a la necesidad de un proyecto, utilizando su propia placa PCB o si se prefiere a un pequeño robot, en la que adquirir cierta experiencia en esta materia. También se puede aplicar, sobre la placa de utilidad que, se encuentra en este mismo sitio, con el nombre escudo Arduino, principalmente debido a que está basado en la creación de una tarjeta con los conectores dispuestos de tal manera que ésta tarjeta, se pueda conectar directamente en el soporte del propio Arduino, digamos a lomos del mismo. EL CIRCUITO L293. El circuito integrado en el que nos basaremos es el L293d, en sus hojas de datos, podemos ver que, está compuesto por cuatro amplificadores con salida triestado, capaz de proporcionar una corriente de salida de hasta 1A por canal a tensiones de alimentación desde 4'5V a 36V y con una entrada habilitable (chip Enable) que permite un control de salida de dos amplificadores. Todas sus entradas son compatibles TTL. En el L293b, se deben utilizar diodos de alta velocidad externos, en la salida, para la supresión de transitorios inductivos. En la figura que sigue, se puede apreciar la tabla de la verdad, con la cual debe familiarizarse para tener un conocimiento más amplio de como se comporta este circuito. Según las especificaciones el L293b es un integrado monolítico de alta tensión, controlador de 4 canales, de alta corriente. Básicamente esto significa que utilizando este chip, puede utilizar motores de corriente continua y fuentes de alimentación de hasta 36 voltios, esos son motores muy grandes y el chip puede suministrar una corriente máxima de 1A por canal. El chip L293b es también lo que se conoce como un tipo de puente H (H- Bridge).

Upload: yrvin-escorihuela

Post on 19-Jul-2016

106 views

Category:

Documents


15 download

TRANSCRIPT

Page 1: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 1/11

CONTROL DE MOTORES CC con Arduino.

Mar 28.10.2014 CRTL+D, para volver a visitarnos. Creado por: V. García.

Tema: Buscar

PROLOGO.Este artículo, se puede considerar como una aplicación que puede ser puesta en práctica, de la teoría que se

describe, en la que se emplean dos motores de corriente continua cuya aplicación puede responder a lanecesidad de un proyecto, utilizando su propia placa PCB o si se prefiere a un pequeño robot, en la que adquirircierta experiencia en esta materia.

También se puede aplicar, sobre la placa de utilidad que, se encuentra en este mismo sitio, con el nombreescudo Arduino, principalmente debido a que está basado en la creación de una tarjeta con los conectoresdispuestos de tal manera que ésta tarjeta, se pueda conectar directamente en el soporte del propio Arduino,digamos a lomos del mismo.

EL CIRCUITO L293.El circuito integrado en el que nos basaremos es el L293d, en sus hojas de datos, podemos ver que, está

compuesto por cuatro amplificadores con salida triestado, capaz de proporcionar una corriente de salida dehasta 1A por canal a tensiones de alimentación desde 4'5V a 36V y con una entrada habilitable (chip Enable)que permite un control de salida de dos amplificadores. Todas sus entradas son compatibles TTL. En el L293b,se deben utilizar diodos de alta velocidad externos, en la salida, para la supresión de transitorios inductivos. Enla figura que sigue, se puede apreciar la tabla de la verdad, con la cual debe familiarizarse para tener unconocimiento más amplio de como se comporta este circuito.

Según las especificaciones el L293b es un integrado monolítico de alta tensión, controlador de 4 canales, dealta corriente. Básicamente esto significa que utilizando este chip, puede utilizar motores de corriente continua yfuentes de alimentación de hasta 36 voltios, esos son motores muy grandes y el chip puede suministrar unacorriente máxima de 1A por canal. El chip L293b es también lo que se conoce como un tipo de puente H (H-Bridge).

Page 2: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 2/11

Según el diagrama, este chip pone a nuestra disposición dos brazos idénticos e independientes, cada uno,consta de dos amplificadores comandados por una línea de control (EN), con la cual habilitamos el par deamplificadores que nos interese en cada momento. Esta disposición, permite distintos montajes para un motor omás motores, como veremos. Es necesario resaltar la existencia en el mercado de dos versiones L293B yL293D, dos diferencias entre ambas, en la versión B, no lleva diodos 'clamp' internos (se puede utilizar unpequeño puente en los terminales del motor), sin embargo, admite hasta 1Amperio de consumo, en el caso dela versión D, sólo entrega 600mA, llevando los diodos internos. El usuario debe tomar la decisión de cualutilizar.

El esquema que utilizaremos, está basado en la aplicación del circuito integrado L293b, que como se apreciaen las hojas del fabricante, es un driver de 4 canales, con él y unos pocos componentes más, podemoscontrolar fácilmente el giro de un motor o dos motores de corriente continua, con distintos circuitos de montaje.Además, también se puede controlar un motor bipolar paso a paso.

No debemos olvidar: 1)- Refrigerar en lo posible este circuito integrado, ya que puede adquirir bastante temperatura, compruebe estedato, si va a aplicar de forma continuada este chip.2)- Utilice un pequeño puente tipo W01F, para evitar disgustos con las tensiones inducidas del motor.

EL ESQUEMA ELÉCTRICO.

El circuito eléctrico en el que nos basaremos es el recomendado por el fabricante del IC y que es mostrado enla siguiente figura. Podemos distinguir dos pares de amplificadores con salidas triestado, con un controlhabilitador (EN) común para ambos, cuyas propiedades descubriremos más adelante. Por el momento nosocuparemos de la parte sencilla.

Page 3: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 3/11

INICIO SENCILLO.

La figura anterior es bastante explicita. Muestra dos montajes distintos como ya he mencionado. Vamos aempezar por el control de un motor de juguete M1. En este ejercicio, he supuesto que no es necesario utilizar elchip L293, ya que, en muchos casos, no tendremos que desembolsar el costo del circuito integrado, con unpequeño transistor podemos salir al paso.

Las salidas de Arduino, sus pines son ideales para controlar directamente los pequeños elementos eléctricos,como los LED. Sin embargo, cuando se trata de dispositivos de consumos más grandes (como un motor dejuguete o el de una máquina de lavar), es necesario un controlador externo. Un transistor es increíblemente útil.Se obtiene una gran cantidad de corriente con una, mucho menor. Un transistor tipo NPN, conectaremos lacarga (M1) al colector del transistor y el emisor al negativo o masa. Así, cuando la señal alta del pin de nuestroArduino alcance la base, fluirá una pequeña corriente por R1 (1K) de la base al emisor y la corriente a travésdel transistor fluirá y el motor girará.

Hay miles de transistores del tipo NPN, que se adaptan perfectamente a todas las situaciones. Como voy autilizar la tensión de 6V de un cargador que tengo a mano, he elegido el BC337 un transistor común de usogeneral. Los factores más relevantes en nuestro caso es que la tensión máxima (45 V) y su corriente media(600 mA) son lo suficientemente alta para nuestro motor de juguete. En cuanto al diodo 1N4001 está actuandocomo un diodo de seguridad.

Page 4: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 4/11

Veamos una aplicación sencilla, en la que utilizaremos un código de los muchos que existen en la red. Esto esun programa rápido para probar el circuito:

Código control motor CC

CÓDIGO: SELECCIONAR TODO

//// motorcc.pde//

const int transistorPin = 9; // connected to the base ofthe transistor

void setup() {

// set the transistor pin as output: pinMode(transistorPin, OUTPUT);}

void loop() {

digitalWrite(transistorPin, HIGH); delay(1000); digitalWrite(transistorPin, LOW); delay(1000);}

En este ejemplo, vemos que pertenece a un circuito sencillo, con el cual hacemos girar un motor de corrientecontinua, con intervalos de parada. Debido a lo sencillo del mismo, observamos que no se tiene ningún controlsobre el motor. Tendría más aplicaciones si pudiéramos, poner en marcha con un interruptor, modificar ladirección de giro y poder variar la velocidad de giro.

Conmutador por pulsos

CÓDIGO: SELECCIONAR TODO

//// motordc.pde//

int pot = 2; // asigna pin analógico 2 para el potint motorPin = 9; // motor en el pin 9 PWM

void setup() // ejecutar una vez, cuando empieza{Serial.begin(9600); // establecer la librería serie a 9600bps pinMode(pot, INPUT); pinMode(motorPin, OUTPUT);}

int getPot() { int v; v = analogRead(pot); v /= 4; v = max(v, 50); v = min(v, 255); return v;}

int motorFoward() { analogWrite(motorPin, getPot()); delay(10); digitalWrite(motorPin, LOW); }

void loop() { // ejecutar una y otra vez motorFoward();}

Page 5: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 5/11

Para controlar esto desde el exterior, se puede utilizar un pot en un puerto analógico para variar el número degrados e incrementar su barrido. Puede hacer la práctica, copie el código o bajelo de aquí y cárguelo en el IDE,para ver su efectividad.

Qué ocurre. El motor gira desde un mínimo de velocidad hasta el máximo según giremos el pot, sin embargo,se observa que el motor pierde fuerza de torsión (par motor, torque en inglés), esto puede ser debido en parte,al transistor que utilicemos, pero es más propio que sea debido al código del programa que no se adecua a loque esperábamos. Debemos pensar en otro método para lograr nuestro propósito.

Este es un código bastante bueno, para el control de un motor de corriente continua que, se comporta muyparecido al código anterior.

Control motor con pot.

CÓDIGO: SELECCIONAR TODO

// // Funccion: CC_motor_control_pot//// Utilizar un potenciometro para controlar motor CC//

int sensor_pin = 2; // debe ser una entrada analógicaint motor_pin = 9; // debe ser una salida digital PWM.

void setup() { Serial.begin(9600);pinMode(motor_pin, OUTPUT)}

void loop() { int pot_val, motor_speed;pot_val = analogRead( sensor_pin );motor_speed = pot_val*255.0/1024.0; // Incluir decimal/* Sutil: No utilice valores enteros como 255 y1024 aquí. Compiladores agresivo pre-cálculola división entera del 255/1024 como cero.*/analogWrite( motor_pin, motor_speed); // hacer cosas útiles}

Indagando sobre el tema, he llegado a encontrar una función reutilizable para actualizar la velocidad delmotor, veamos unas cuestiones a tener en cuenta. El ajuste de la velocidad del motor se establece dentro dellazo loop(), en realidad la parte más relevante se encuentra en el llamado map (), donde los valores leídos delpotenciómetro se escalan a la salida.

Así pues, necesitamos ...

UNA FUNCIÓN PARA TRADUCIR LAS ESCALAS LINEALES.

El escalado lineal de los valores de x paravalores de y:

y = f(x)

donde f es un mapeado lineal.

Page 6: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 6/11

Es decir, dados: x, xmin, xmax, ymin e ymax. Calcular y

UNA FUNCIÓN PARA TRADUCIR LAS ESCALAS LINEALES.

Entradas que necesitamos: pin de potenciómetro sensor, pin de salida del motor. Que tareas vamos a abordar:

Leer tensión del potenciómetro. Convertir voltaje con escalas de 10 bits a 8 bits PWM y Cambiar la velocidad del motor.

Introduzca el código de la parte inferior en su boceto. Observe que, el código no está dentro de ningún bloquede otro programa (como setup() o void()), es parte de una función. ¿Cómo comprobar que esta función estáfuncionando?

int int_scale(int x, int xmin, int xmax, int ymin, int ymax) { int y; y = ymin + float(ymax - ymin)*float( x - xmin )/float(xmax - xmin); return(y); }

Este código, es esencialmente una reimplementación integrada de la función map, por los creadores delArduino. Ver http://arduino.cc/en/Reference/Map

Nota.- int Devuelve un entero. int_scale Es el nombre de la función. int x Es la primera entrada llamada x. float Se usa float para una mejor precisión. return(y) Devuelve el valor almacenado en y.

Funciones que llaman a otras funciones: (int x, int xmin, int xmax, int ymin, int ymax);

motor_speed = int_scale(int x = pot_val, int xmin = 0, int xmax = 1024, int ymin = 0, int ymax = 255);

Donde: return(y) = motor_speed

A continuación, a modo de ejemplo, veremos un código que usa la función int_scale.

Control motor con pot.

CÓDIGO: SELECCIONAR TODO//// Funccion: CC_motor_control_pot//// Utilizar un potenciometro para controlar motor CC

int sensor_pin = 2; // debe ser una entrada analógicaint motor_pin = 9; // debe ser una salida digital PWMt

void setup() { Serial.begin(9600);pinMode(motor_pin, OUTPUT)}

Page 7: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 7/11

Si comprueba este código, observará que el incremento de velocidad propuesta por el potenciómetro, sepercibe como una continuidad lineal. Esta es la mejora esperada.

CONTROL EL CIRCUITO INTEGRADO L293.

Hemos probado a utilizar un transistor a la salida de un pin de Arduino y no hemos quedado satisfechos conlos resultados. Cabe la posibilidad de utilizar dos transistores en sendos pines, cada cual conduciría un bornedel motor, como diría, el motor entre dos pines, pero no quiero perder más tiempo. Es el momento de utilizar elL293, en una de las aplicaciones que vienen en las hojas de especificaciones.

Además con el L293, no tiene que preocuparse por la regulación de una tensión mayor, ya que permite dosfuentes de energía - una fuente directa, hasta 36 V para los motores y otra de 5V, para controlar el CI que,puede ser conectada a la fuente de alimentación ya que el suministro de alimentación del motor proviene esindependiente. En el circuito de abajo, se supone una alimentación superior para el motor. A continuación sepuede ver la disposición de las conexiones para el chip y el motor. La tabla de verdad muestra la lógica de lasalida.

El puente H, es normalmente un circuito eléctrico que permite aplicar un voltaje a través de una carga encualquier dirección a una salida, por ejemplo, motor. Esto significa que esencialmente puede invertir la direcciónde la corriente y por lo tanto invertir la dirección del motor. Lo único que a de recordar es que, la conexión atierra debe ser compartida, común para ambas fuentes.

En este circuito que sigue, no se trata más que de un control bidireccional, por lo tanto, no se hace necesarioel puente H, lo que resulta más sencillo en todos los sentidos. Si nos fijamos en la tabla de verdad que aparecearriba, quedan claras las opciones que nos presenta, he de resaltar que la entrada EN (patilla 1), puede serdefinitoria.

Veamos cómo es esto, en cualquier momento. Si se aplica un 1 lógico sobre A1, en la entrada A2, tenemosque aplicar un 0 lógico, esto hará girar el motor en un sentido predeterminado. Para cambiar el sentido de giro,y respetando las reglas de la mecánica, primero pondremos A1 y A2 en un mismo estado lógico y acto seguidoinvertiremos el estado inicial, es decir, A1 en 0 lógico y A2 en 1 lógico.

Con independencia del estado lógico de las entradas A1 y A2, si es necesario detener el motor, simplementeenviamos un estado lógico bajo (0) a la patilla EN y el motor se para de inmediato. En estas condiciones no esposible mover el motor, no hasta que, a dicha entrada EN, le enviemos un 1 lógico, en ese momento, podemosdecidir el sentido de giro o la parada del mismo con los valores lógicos que apliquemos a las patillas A1 y A2.Aunque, lo esencial de esta entrada EN, es que si aplicamos una salida PWM a ella, simplemente podremosregular la velocidad del motor, esta es su funcionalidad. Ver el esquema eléctrico.

Page 8: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 8/11

Por seguridad, recomiendo que, conecte una fuente externa de alimentación de corriente continua a la entradade alimentación externa de Arduino, así, puede alimentar el motor y el Arduino. Además, puede dejarconectado el cable USB, para una fácil y rápida reprogramación, si fuera necesaria. De esta forma, cualquieraque sea el motor que utilice, se asegura que la fuente de alimentación es compatible, naturalmente, no utiliceun motor de 5V con una alimentación de 12V.

EL CÓDIGO.

La teoría es bastante sencilla. Se trata de poner, un estado lógico 1 en la entrada A1, al mismo tiempo que enla A2 ponemos un 0 lógico. El código para este caso es sencillo, veamos un ejemplo:

Control motor con pot.

CÓDIGO: SELECCIONAR TODO/* * motorpwmpot.pde** Hace girar un motor de CC mediante un L293 conectado a lospines digitales* 7 y 8 controlando la velocidad por PWM sobre el pin Enabledel L293 en base* a la lectura de un potenciometro conectado al pin analógico2* * Basado en un código de: Miguel Grassi* www.miguelgrassi.com.ar** Modificado por: V. García el 07.02.2011* */

El código está bastante bien descrito y no considero necesario entrar en mayores detalles. Copie el código osi lo prefiere, bájelo de aquí y cárguelo en el IDE, para comprobar su efectividad.

Page 9: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 9/11

He realizado este ejemplo, utilizando un escudo para Arduino, realizado con placa de tiras preformada, comose puede apreciar en la imagen de abajo, el esquema utilizado corresponde a la imagen anterior. Sigue unademo del resultado obtenido.

0:18

Vídeo.

EL L293El circuito integrado L293B, es un driver de 4 canales, capaz de proporcionar una corriente de salida de hasta

1A por canal. Cada canal, se puede controlar por señales de entrada compatibles TTL y cada pareja de canalesdispone de una señal de habilitación que desconecta las salidas de los mismos.

Ahora, vamos a ocuparnos del código necesario para controlar un motor de corriente continua con Arduino.He decidido probar una idea para que los que tengan interés en hacer su primer mini robot, empiecen con unaexperiencia que les anime y levante la moral.

La idea es que con un motor de juguete, movamos el eje delantero de una pequeña caja, cualquier recintopequeño nos puede servir, en esta, tiene que alojar las cuatro pilas de 1'5V con su porta pilas, el propioArduino, el motor, el soporte del eje y una rueda de giro libre en todas direcciones. Algo parecido a la imagen.

Las fotos, aunque corresponden a otro ejercicio (cosa que no es relevante), dan una idea de lo que sedescribe. La práctica demostrará cómo mover un objeto (bot-tarrina), con un sólo motor y un interruptor del tipo'bumper'. Cuando conectemos la tensión, el Arduino mandará una señal al motor para que gire, por un tiempo,lo que hará avanzar el pequeño robot. Cuando éste, encuentre un obstáculo, lo detectará con el interruptor quetropezará con el objeto estático, esto producirá una señal/orden en el programa, de modo que el motorcambiará su dirección de giro por un tiempo determinado, tras el cual volverá a girar en la dirección de inicio.Las direcciones son mecánicamente, bastante aleatorias.

Sólo se trata de un ejemplo, de como manejar un pequeño robot con un mínimo de componentes. El siguientees el código que se encarga de realizar estos cambio de desplazamiento. El código como se hace notar, lo headaptado a mis necesidades, con un pequeño cambio.

Page 10: control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.pdf

28/10/2014 control de motores DC Arduino, motores DC, Arduino, proyectos con Arduino.

http://hispavila.com/3ds/atmega/motorescc.html 10/11

Control motor con Puente-H.

CÓDIGO: SELECCIONAR TODO/* Control de un motor DC con puente H* motorL293h.pde* * http://itp.nyu.edu/physcomp/Labs/DCMotorControl* * Modificado por V. Garcia el 08.02.2011* * Puede adaptarse a un bot con un motor en las ruedas detraccion* y una rueda de giro libre que pivote cambiando la direccion *

int switchPin = 2; // entrada del switch int motor1Pin = 7; // pin 1 del L293int motor2Pin = 8; // pin 2 del L293int speedPin = 9; // pin enable del L293 int ledPin = 13; //LED

void setup() {// pone el switch como una entradapinMode(switchPin, INPUT); digitalWrite(switchPin, HIGH); // pone todos los otros pines usados como salidas pinMode(motor1Pin, OUTPUT); pinMode(motor2Pin, OUTPUT); pinMode(speedPin, OUTPUT);pinMode(ledPin, OUTPUT);

// activa la RPA del pin speedPin para activar el motordigitalWrite(speedPin, HIGH);

// El LED parpadea 3 veces. Esto debería ocurrir sólo una vez.// Si usted ve el parpadeo del LED tres veces, significa que // se restablecio (reset) el propio módulo. Probablementeporque // el motor provocó una bajada de voltaje o un corto. blink(ledPin, 3, 100);}

void loop() {// si el switch es high, motor gira en una direccionif (digitalRead(switchPin) == HIGH) { digitalWrite(motor1Pin, LOW); // pone motor1 del H-bridgelow digitalWrite(motor2Pin, HIGH); // pone motor2 del H-bridgehigh}

Una vez más, si lo desea, puede copiar y pegar este código, déle un nombre y cárguelo en su Arduino.

En los ejercicios que se han desarrollado en este documento, aunque hemos utilizado el circuito integradoL293, tan sólo se ha empleado de los cuatro, un amplificador para manejar el motor o dos amplificadores, unopara cada devanado del motor. La parte más relevante de este circuito integrado, está en utilizar los cuatroamplificadores de forma que se conoce como Puente-H.

Después de lo tratado hasta el momento, en este documento, estamos preparados para comprender yemprender el montaje del L293 en puente-H, para el control de un motor. Es cierto que el control de motores,también se puede ejercer con un circuito integrado como es el ULN2003 que integra una matriz de sietetransistores darlington, capaces de entregar hasta 500mA cada uno y la versión ULN2803, con una matriz deocho transistores darlington. Este último, se utiliza en los casos que se tienen que controlar más de un motor ysobre todo, con motores unipolares.

Los motores que hemos manejado hasta el momento son motores de corriente continua (DC), en próximosartículos desarrollaremos controles para motores paso a paso bipolares y unipolares. El control de un motorunipolar, es más sencillo que el del motor bipolar, debido a la manera de energizar los devanados.

Esto es todo, por este simple tutorial. Si tiene interés en leer más sobre Arduino, revele esta sección.(Mostrar/Ocultar)

Volver al Ídice de artículos Arduino.

Creada el: 02.05.2011

Actualizada el: 01/02/2013

Desarrollado por V.García © 1998, 2000, 2002, 2006, 2008, 2010, 2011.