[Proteus versión 8.1]

En la lección anterior aprendimos a gobernar un motor de corriente continua utilizando nuestro ARDUINO. Utilizando los motores de corriente continua somos capaces de lograr que nuestros proyectos gobiernen máquinas con movimiento. Por ejemplo podemos controlar un coche, una grúa o una unidad de CD. Los motores DC nos permiten variar la velocidad y el sentido de giro.

Supongamos ahora que nuestra proyecto nos exige ser capaces de posicionar una pieza movil 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 continúa 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.

Lec13 001

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.

Lec13 002

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).

Lec13 003

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.

Lec13 004 

Para el generador de la señal de control, vamos a utilizar los siguientes valores:

Lec13 005

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º).

Lec13 006

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.

Lec13 007

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). Vamos a utilizar el siguiente código de ejemplo para controlar nuestro servomotor y, como siempre, iremos explicando cada línea de nuestro programa.

Lec13 008

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 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.

Lec13 009 

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 porporcione información usándolo como consola.

Lec13 010

Para que el terminal virtual funcione bien, debemos configurarlo como se muestra en la imagen siguiente.

Lec13 011

El código de nuestro programa de control será el siguiente:

Lec13 012

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 simulación podemos ordenar que se muestre desde el menú depuración (debug). El resultado si pulsamos la tecla 8 sería:

Lec13 013

 

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 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.

Lec13 014

Lec13 015

En este caso, moviendo el potenciometro, recolocamos nuestro servomotor según deseemos. Si giramos el potenciometro 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.

 

 

Comparte este artículo en redes sociales

Submit to FacebookSubmit to Google PlusSubmit to TwitterSubmit to LinkedIn