68
ANEXO 9: Separata de Información para Actividad de Aprendizaje
Control de un Servomotor
Los motores DC nos permiten variar la velocidad y el sentido de giro.
Supongamos ahora que nuestro proyecto nos exige ser capaces de posicionar una pieza móvil con una alta precisión. Por ejemplo, pensemos que utilizamos nuestro Arduino con dos motores para controlar la plumilla de un plotter capaz de realizar dibujos de un tamaño DIN A4. Utilizaríamos uno de los motores para generar el desplazamiento de la plumilla en la dirección del eje x y el otro para la dirección del eje y. Podríamos utilizar dos motores de corriente continua como los vistos en la lección anterior para este trabajo. Pero imaginemos que queremos situar nuestra plumilla exactamente en la esquina superior izquierda de nuestra hoja de papel. La precisión se ha convertido en un asunto importante, porque desplazarnos fuera de la hoja, puede dañar nuestra plumilla. ¿Se imagina el lector, teniendo que ir dando pequeños toques en los pulsadores de control de nuestros dos motores para lograr situar la plumilla en el punto exacto? Seguro que dejamos de utilizar nuestro plotter.
Para dar respuesta a esta problemática disponemos de los servomotores. Un servomotor es un motor con un eje de rendimiento controlado. Esto significa que podemos posicionarlo a nuestra voluntad con una gran precisión. Pero, eso sí, siempre dentro de un rango determinado. En general, los servomotores que podemos utilizar nos permiten usar rangos de 180º, aunque existen versiones de 210º e incluso los de rotación continua.
69
Un servomotor es un motor de corriente continua con una serie de engranajes que aprovechan su velocidad para aumentar su torque (fuerza) y un sistema de control basado en un potenciómetro que permite saber constantemente la ubicación del eje. El sistema de control responde a las ordenes generadas con una señal que debemos proporcionarle para establecer la posición del eje deseada.
La señal de control que introducimos al servomotor, es una señal parecida, que no igual, a la del tipo PWM. Para gestionar un servomotor vamos a generar un tren de pulsos con una frecuencia de 50Hz. Dependiendo del ancho de la zona alta del pulso que le enviemos (he ahí el parecido con las señales PWM), nuestro servo se situará en una posición o en otra.
Proteus nos facilita un modelo para simular un servomotor, llamado MOTOR_PWMSERVO. Construyamos un primer circuito para poder simularlo hasta entender perfectamente el funcionamiento del mismo. Utilizaremos un servomotor que alimentaremos conectándole los potenciales VDD y GND. Para la señal de control utilizaremos un generador de señal del tipo DPATTERN (Patrón de señales digitales).
70
El segundo paso consiste en editar las propiedades del servomotor y de la señal de control. Como siempre, para hacerlo nos pondremos sobre cada uno de ellos y con el botón derecho del ratón abriremos el menú contextual y seleccionaremos la opción de editar sus propiedades. En el caso del servomotor tenemos que parametrizarlo teniendo en cuenta los siguientes aspectos. El rango de giro que nos permite nuestro servo. En nuestro caso vamos a elegir 0º como ángulo mínimo y 180º como el máximo ángulo posible. La velocidad máxima de giro. Vamos a seleccionar 50Hz. Y el ancho de la zona alta del pulso que vamos a utilizar para colocar nuestro servo en el ángulo mínimo y el que usaremos para indicar a nuestro servo que se coloque en el ángulo máximo. Unos valores bastante estandarizados son 0,544 mseg para el mínimo y 2,4 mseg para el máximo. Vamos a introducir estos valores utilizando su equivalente en microsegundos (544u para el mínimo y 2400u para el máximo). Al final de parametrizar nuestro componente debe tener el aspecto recogido en la siguiente imagen.
71
72
Como se puede observar estamos definiendo un tren de pulsos con forma de secuencia continua que empieza en una señal baja, con el primer flanco en el instante cero. El tiempo que permanecerá en alto el pulso será de 2.4 mseg (el que hemos definido como posicionarse en el ángulo máximo de 180º y el tiempo que permanecerá bajo será de 17,6 mseg. Para obtener esta segunda cifra hemos realizado el siguiente cálculo. Puesto que la señal de control es de 50Hz, el tiempo de cada pulso debe ser de 20 mseg (1 seg / 50 = 20 mseg). Si el pulso debe estar en alto 2,4 mseg, el resto del tiempo debe estar bajo (20 mseg - 2,4 mseg = 17,6 mseg).
Ahora que ya hemos explicado cómo se configura la señal de control, podemos arrancar la simulación y comprobaremos que el servomotor se coloca en la posición deseada (180º).
73
En general, podemos fijar el ángulo deseado de nuestro servomotor, calculando el tiempo del flanco alto y bajo de nuestra señal de tren de pulsos de control con estas dos fórmulas:
tiempo flanco alto = 0,544 + n ( 1,856 / 180 ) donde n es el ángulo en grados. tiempo flanco bajo = 20 - tiempo flanco bajo.
Probemos a colocar nuestro servo en la posición 0º (0,544 y 19,456), en la posición 45º (1,008 y 18,992) y en la posición 90º (1,472 y 18,528). Realmente es sencillo colocar nuestro servomotor en la posición que deseemos.
Ahora que ya entendemos completamente como funciona un servomotor, vamos a realizar el siguiente circuito para controlarlo con nuestro Arduino.
74
Y nos enfrentaremos ahora a la tarea de programar la señal de control. En un primer momento podría parecer que generar nuestra señal de control desde Arduino no va a resultar una tarea sencilla. Afortunadamente contamos con una librería (servo.h) que nos pondrá las cosas muy sencillas. Podemos consultar todas sus funciones en el siguiente enlace (http://arduino.cc/es/Reference/Servo).
75
Vamos a utilizar el siguiente código de ejemplo para controlar nuestro servomotor y, como siempre, iremos explicando cada línea de nuestro programa.
La sentencia #include <servo.h> sirve para enlazar con la librería servo. A continuación, definimos dos variables. Una llamada myservo del tipo servo (este tipo está definido en la propia librería) que utilizaremos para controlar nuestro servomotor. Si nuestro Arduino controlara más de un servomotor, tendríamos que definir una variable de este tipo por cada uno de los servomotores que deseamos controlar. Además, usaremos una segunda variable entera llamad ángulo que usaremos para fijar el ángulo al que deseamos situar nuestro servomotor.
En la función de configuración (setup), definiremos los pines que vamos a utilizar para generar nuestra salida de control (pin IO9) y el que vamos a utilizar para
76
controlar un led que nos ayudará a visualizar en que fase del programa nos encontramos (el pin IO0).
En el bucle principal del programa (loop) realizaremos la siguiente secuencia de control. Primero encendemos el led, luego vamos aumentando el valor del ángulo de posición de nuestro servomotor desde 0º a 180º en saltos de 10 en 10 grados, dejando un retardo de 1 segundo entre cada nuevo posicionamiento. A continuación, apagamos el led y vamos disminuyendo el ángulo de posición desde 180º a 0º pero esta vez en saltos de 5 en 5 grados. La función de la librería servo.h utilizada para posicionar el servomotor en el ángulo que deseemos es write().
Arranquemos nuestra simulación y comprobemos que todo funciona como deseamos.
Utilizar un servomotor desde nuestro ARDUINO es muy sencillo.
Construyamos ahora un segundo circuito donde utilizaremos nuestro terminal virtual para poder enviar órdenes a nuestro ARDUINO y que éste nos proporcione información usándolo como consola.
77
Para que el terminal virtual funcione bien, debemos configurarlo como se muestra en la imagen siguiente.
78
79
En este caso esperamos que el usuario pulse un número entre 0 y 9 y colocamos el servomotor en el ángulo correspondiente (el número multiplicado por 10). Dejamos al usuario que estudie el programa para entenderlo bien. Es importante tener en cuenta cuando arranquemos la simulación, que para poder enviar teclas desde nuestro teclado por el terminal virtual tenemos que poner el ratón encima y pulsar sobre él para activarlo. Si no se visualizara el terminal virtual al arrancar la
80
simulación podemos ordenar que se muestre desde el menú depuración (debug). El resultado si pulsamos la tecla 8 sería:
De esta manera, en este ejemplo, no tenemos un servomotor cambiando constantemente de posición como en el primer caso. En este nuevo ejemplo, el
81
uso del servomotor es más parecido a la realidad. El usuario cada vez indica desde el terminal la posición en la que deseamos colocar el servomotor, ARDUINO se encarga de generar la orden y el servomotor permanece en esta posición hasta que se recibe una nueva orden.
Si no podemos gobernar nuestro ARDUINO desde la consola, podemos utilizar un potenciometro para indicar la posición a la que deseamos colocar nuestro servomotor. A continuación, mostramos el circuito y el código del programa. A estas alturas del curso seguro que el lector no encuentra problemas para comprender ambos.
82
En este caso, moviendo el potenciómetro, recolocamos nuestro servomotor según deseemos. Si giramos el potenciómetro en uno u otro sentido, el ángulo de posicionamiento del servomotor se incrementa o decremente. Seguro que el lector encontrará muchas aplicaciones para los servomotores.
83
ANEXO 10: Practica de Laboratorio
Objetivo: Controlar desde nuestro Arduino un motor de corriente continua (normalmente nos referimos a él utilizando las siglas DC). El motor DC es una máquina capaz de convertir la energía eléctrica en mecánica provocando un movimiento rotatorio, se verificará el funcionamiento mediante el Simulador Proteus.
Dentro de una unidad de disquetes, de un DVD, de un coche de juguete, de un ventilador manual, etc, hay un motor DC que genera el movimiento de las piezas móviles. Para ponerlo en marcha, la operativa es muy sencilla. Este tipo de motores tiene dos polos donde debemos conectar la alimentación. Si alimentamos con la tensión nominal (siempre con corriente continua) al motor empieza a girar. Y aquí empieza una de las características más interesantes de este tipo de motores que los hace tan útiles para usarlos en nuestros diseños. Si bajamos la tensión de alimentación el
84
motor girará más despacio y si intercambiamos la polaridad girará en sentido contrario. Como modificar la tensión y cambiar la polaridad son operaciones muy sencillas de implementar en nuestro diseño, las posibilidades que nos brinda este dispositivo son enormes y con muy poco esfuerzo.
Proteus nos permite simular el funcionamiento de este tipo de motores, utilizando el dispositivo MOTOR.
Vamos a ver cómo funciona para sacarle el máximo rendimiento a nuestra simulación. Colocamos un dispositivo motor en nuestro montaje de la siguiente forma.
85
Y ahora sólo tenemos que arrancar la simulación, para observar el movimiento (en esta página la imagen aparece congelada en un momento dado, pero si está usted siguiendo la lección con Proteus, podrá ver el efecto del movimiento).
Solo nos resta configurar adecuadamente nuestro modelo de motor para que la simulación sea más consistente. Para ello, nos pondremos sobre el icono del motor, pulsaremos el botón derecho del ratón y editaremos sus propiedades. En la ventana resultante podemos seleccionar la tensión nominal de nuestro motor (muy importante), el número de revoluciones con las que va a girar (ojo, estamos hablando de la simulación y poner velocidades muy altas cargará mucho la cpu de nuestro ordenador de forma totalmente innecesaria) y la resistencia interna.
86
Si probamos a cambiar la alimentación intercambiando los +5V y el GND, podemos comprobar que el motor gira en el sentido contrario. Si cambiamos el potencial VDD (recuerde que son +5V) y lo fijamos a valores de +4V, +3V, +2V y +1V, podremos observar que el motor gira a menor velocidad. Como es lógico, si ponemos un 0V el motor se detendrá. Con esto, ya sabemos todo lo necesario sobre nuestro motor de corriente continua y estamos en disposición de comenzar a controlarlo con nuestro ARDUINO.
En muchas webs y libros sobre ARDUINO se encontrará explicaciones de cómo controlar el motor DC directamente desde nuestro equipo ARDUINO utilizando una salida del tipo PWM que vimos en nuestra lección 6. Este sistema es perfectamente válido y controlaremos la velocidad de nuestro motor aumentando o disminuyendo el pulso de modulación. Pero, sin duda, el lector que siga nuestro curso será, a estas alturas, capaz de hacerlo por sí mismo siguiendo los pasos mencionados en aquella lección. Por ello, en esta ocasión vamos a utilizar un método alternativo y vamos a utilizar el driver para el control de motores L293D. Este chip (de coste muy reducido inferior a los 3€) nos permite controlar motores de DC (cuatro de forma unidireccional o dos de forma bidireccional) utilizando una técnica denominada puente en H. Utilizándolo lograremos controlar motores de mayor consumo y de tensiones diferentes a las que podríamos utilizar utilizando nuestro ARDUINO para controlar el motor de forma directa. En el siguiente enlace podemos encontrar toda la información técnica de este integrado: http://www.ti.com/lit/ds/symlink/l293d.pdf.
87
Proteus incluye el modelo para poder simular el funcionamiento de nuestro driver L293D. Así que vamos a realizar el siguiente montaje para realizar nuestra práctica.
88
Cómo se puede observar hemos conectado nuestro motor a la salidas OUT1 y OUT2 del L293D (porque lo vamos a utilizar de forma bidireccional). La alimentación del motor, en
89
este caso, la estamos haciendo con el mismo potencial VDD aplicándolo al pin 8. Las entradas para gobernar la velocidad y el sentido de giro de nuestro motor (IN1 e IN1) del L293D las hemos conectados a las salidas IO11 e IO10 de nuestro Arduino. Además, hemos conectado un led a la salida IO0 de nuestro Arduino por motivos pedagógicos para facilitar la interpretación al lector de la fase de nuestro programa en la que nos encontramos.
El código de nuestro programa es el siguiente.
90
El programa empieza con las declaraciones y configuraciones, según es habitual. La lógica de funcionamiento es la siguiente. Encendemos el led y ponemos el pin IO11 a cero, mientras vamos aumentando el valor del pulso de modulación de la salida PWM sobre el pin IO10 progresivamente desde 0 a 255 en saltos de 5 en 5. De esta manera el motor girará en un sentido cada vez a mayor velocidad. A continuación, apagamos el led y vamos disminuyendo el pulso de modulación de forma progresiva hasta detener el motor. Más tarde repetimos la operación, pero invirtiendo los pines. En este caso ponemos a cero el pin IO10 y aumentamos y disminuimos el pulso de modulación sobre el pin IO11 con lo que logramos que el motor acelere y luego disminuya su velocidad, pero esta vez en sentido contrario de giro.
Para los que quieran comprobar sus conocimientos, proponemos usar nuestro ARDUINO y dos drivers L293D para controlar una grúa. Con uno de los motores podemos desplazar el brazo de nuestra grúa en sentido horario y anti horario. Con el segundo podemos deslizar el carretón desde el centro hasta el extremo. Y con el tercer motor podemos subir y bajar la carga.
Por supuesto, tendremos que utilizar seis entradas digitales para implementar una botonera de mando para gobernar nuestra grúa en los dos sentidos posibles por cada uno de los tres movimientos disponibles. Además, si queremos perfeccionar nuestro trabajo, utilizaremos varias entradas digitales para controlar finales de carrera que nos avisen cuando llegamos al tope del recorrido de nuestro carretón impidiendo dañar el motor siguiendo empujando en una dirección cuando hemos alcanzado el final del recorrido posible.
91
ANEXO 11: Manual de Proteus
MANUAL DE PROTEUS (Tomado de F García Miranda) ACCIONES BÁSICAS
Empezaremos creando un circuito sencillo para familiarizarnos con el entorno de Isis. A la izquierda del entorno de trabajo podemos ver una barra de herramientas que nos facilita el acceso a las funciones básicas necesarias en el trabajo con esta aplicación.
Empezaremos directamente realizando un pequeño circuito para ejemplificar esto:
El primer paso a realizar será seleccionar los componentes que necesitaremos en el proceso, para lo cual utilizaremos la herramienta componente, . Pulsando en ese botón veremos como a la derecha de la barra de herramientas se activará una lista (vacía en primera instancia) con el título de devices. Ahí es donde veremos el listado de componentes seleccionados para su inclusión en el esquema. Podemos observar como a la izquierda de este título hay dos botones , pulsaremos sobre el botón 'P' y tendremos acceso a la ventana de selección de componentes:
92
En este cuadro de diálogo podemos seleccionar la librería en la que deseamos buscar y, dentro de esa librería el componente que queremos añadir a la lista. En la parte derecha de la ventana veremos una pre visualización del componente en el esquema y la placa de circuito impreso respectivamente. Para añadir un componente a la lista haremos doble click sobre su nombre. Una vez hayamos añadido los componentes que necesitemos podemos cerrar la ventana y volver a la ventana de diseño. Para realizar el circuito del ejemplo necesitaremos los componentes LAMP, BATTERY y BUTTON de la librería ACTIVE y el componente BC107 de la librería BIPOLAR.
El siguiente paso será colocar los componentes en el espacio para ello destinado. Seleccionaremos el nombre del componente a colocar con el ratón y haremos click izquierdo en un espacio del esquema. Por cada click que hagamos colocaremos una nueva copia del componente. En la ventana de pre visualización podremos comprobar cómo va a ser colocado el componente y rotarlo mediante los botones de la esquina superior izquierda :
. Pero quizá podamos querer rotar o mover un componente después de colocarlo, esto se consigue seleccionándolo con un click derecho del ratón y arrastrándolo con el botón izquierdo (para moverlo), o manipulando los botones de rotación una vez seleccionado. Para deseleccionar un componente haremos click derecho en un espacio vacío.
Una vez colocados de forma correcta los componentes en el espacio de trabajo el siguiente paso lógico sería conectarlos entre sí mediante cables, , usando para ello la herramienta cable (wires). Para usarla solo tenemos que accionarla y hacer click izquierdo en cada uno de los pines que queramos conectar (es
93
importante que el componente en cuestión no esté seleccionado o sólo conseguiremos editar sus propiedades), Isis se encarga automáticamente de seleccionar la mejor ruta a seguir para el trazado del cable. Aunque si no estamos satisfechos con el resultado podemos actuar sobre el cable trazado del mismo modo que lo haríamos sobre un componente.
Existe una opción que nos permite eliminar de la lista de componentes aquellos componentes que todavía no hayamos utilizado en nuestro diseño. Es la opción Tidy del menú Edit. Podemos probar a incluir en la lista cualquier componente y después seleccionar la opción Tidy para ver como desaparece de la lista si no ha sido colocado antes.
Bien, ya tenemos nuestro primer circuito diseñado, ahora vamos a probar algo de simulación básica, por el momento nos limitaremos a comprobar si el circuito se comporta como debería comportarse (encendido de la lámpara al pulsar el botón). Para ello activaremos el modo de simulación pulsando el botón de inicio
de simulación de la barra inferior : o presionando F12.
Para simular la acción sobre el pulsador del circuito haremos click sobre él una vez la simulación esté en marcha y comprobaremos su efecto. Para detener la simulación pulsaremos el botón correspondiente de la barra.
Si queremos editar las propiedades de un componente primero lo seleccionaremos haciendo click derecho sobre él, para después hace click izquierdo. Ante nosotros aparecerá el cuadro de diálogo de propiedades de componente, que variará según el componente y mediante el cual podremos configurarlo a nuestro gusto. Elementos comunes a la mayoría de componentes son su referencia (R1, R2, C1...) y valor, así como también el footprint seleccionado para pasar el esquema a ARES, la aplicación de diseño de PCB. Si el componente tiene pines de alimentación que se encuentran ocultos podemos seleccionar a que red (net)