bclose

Conociendo los servos

Arduino con servo y potenciometro

Objetivos

 

 

    • Que es un servo.
    • Comprender la diferencia con un motor normal.
    • Introducir el concepto de librería en C++.
    • La función map().

 

Material requerido.

 

  Tienda España Tienda Mexico
Kit Arduino Uno  Kit inicio UNO Kit inicio UNO
Kit Arduino MEGA Kit Inicio Mega Kit Inicio Mega

 

Que es un servo

.

Normalmente los motores habituales lo que hacen es transformar la energía eléctrica (O química) en un giro continuo que podemos usar para desarrollar trabajo mecánico.

En la sesión 13 utilizamos un pequeño motor de corriente continua y regulamos la velocidad de giro mediante una señal PWM de Arduino uno.

Los servos son también motores de corriente continua, pero en lugar de diseñarse para obtener un giro continuo que podamos aprovechar (para mover una rueda por ejemplo), se diseñan para que se muevan un angulo fijo en respuesta a una señal de control, y se mantengan fijos en esa posición.

Imaginad por ejemplo un timón de un avión o barco. No queremos un giro continuo, sino un motor al que le pueda indicar el ángulo que deseamos en grados y que mantenga esa orientación hasta que le demos una orden en contrario.

Estos servos o servomotores son muy frecuentes en Aero modelismo y en robótica, por la capacidad que presentan para moverse a un ángulo concreto y mantenerse allí. De hecho se suelen diseñar para que giren un ángulo proporcional a una señal PWM, de forma que su control es muy preciso. Un servo suele estar formado por:

Interior de un servo

Un servo suele estar formado por:

  • Una reductora.Un circuito de control..
  • Un motor de CC.
  • Un circuito de control

En la práctica se comporta como un bloque funcional que posiciona su eje en un ángulo preciso en función de la señal de control

 

Habitualmente los servos tiene un margen de operación, es decir, pueden moverse entre 0º y ángulo dado, que suele ser de 180º, pero existen modelos comerciales de todas la características imaginables (incluyendo servos de 360º).

Normalmente estos pequeños servos funcionan sobre 5V y el control se realiza mediante una señal de control PWM, en la que el ancho el pulso indica el ángulo que deseamos adopte el eje.

Un servo tiene un conector de 3 hilos, 5V (rojo), GND (negro o marrón) y el otro Control (amarillo o blanco).

Podríamos escribir un pequeño programa en Arduino que controle estos pulsos y los relacione con el ángulo buscado, pero antes de que nadie se asuste, los servos (y otras cosas) son tan habituales, que ya ha habido gente que han escrito estos programas y los han puesto a nuestra disposición.

De este modo podemos manejar un servo sin preocuparnos para nada de cómo realizar el control de las señales, o de la operación interna, basta con instalar estos programas en una forma especial llamada librería.

 
  • Una librería es un conjunto de definiciones y funciones escritas en C++ de Arduino, que podemos utilizar en nuestros programas. Podemos ver el código de estos programas, aunque normalmente se requiere un nivel medio alto en C++ para comprender su funcionamiento.
 

La ventaja de trabajar con una plataforma tan bien establecida como Arduino, es que hay cantidad de gente en el mundo desarrollando librerías, casi para cualquier cosa que podáis imaginar.

Y aún hay algo mejor: Son gratis.

Veréis que en las próximas sesiones vamos a utilizar librerías para cantidad de cosas, pero hoy vamos a comenzar con la primera, la librería servo.

 

Usando nuestra primera librería: Servo

.

Servo es una librería estándar en Arduino. Eso quiere decir que viene incluida cuando instaláis el IDE, a diferencia de otras librerías que debemos buscar, descargar de Internet e instalar para poder usarlas.

Para usar una librería estándar, basta con pedirle al IDE que la incluya en nuestro programa. Id al menú Programa \ Importar Librería y os saldrá un desplegable con todas las librerías que tenéis instaladas en el IDE.

Por ahora solo nos interesa la librería Servo. Pinchad en ella. Arduino incluirá una línea al principio de vuestro programa como esta:

#include <Servo.h>

A partir de ahora ya podemos utilizar las funciones disponibles en la librería.

 
  • Normalmente para usar una librería hay que leer la documentación, en la que se detalla la forma de usarla, que funciones tenemos disponibles, que parámetros pasarlas…etc.
  • Como es vuestra primera librería, y nosotros ya nos hemos leído el manual, vamos a llevaros de la mano. Veréis que es de lo más fácil.
 

Vamos a montar un circuito en el que hagamos moverse al servo de forma controlada, e iremos viendo las instrucciones necesarias.

Esquema electrónico del circuito

.

Vamos a conectar el servo primero a GND y 5V y luego el pin de control, a un pin de Arduino que permita PWM (Recordad esto o de lo contrario os costara ver el problema). Recordad que es el ancho el pulso lo que controla el ángulo.

Vamos también a conectar un potenciómetro a la puerta A0 para jugar con el servo.

Esquema electronico

 

El diagrama de conexión para la protoboard es igual de sencillo:

Protoboard

 

El Programa de control

 

Vamos a empezar con una línea que ya conocíamos el include y otra nueva:

#include <Servo.h>
Servo servo1;

Para poder utilizar la librería debemos crear, lo que se conoce como un objeto tipo Servo que llamamos servo1.

C++ es un lenguaje orientado a objetos, esto significa que podemos definir objetos tipo (como servos) sin más que declarar un nuevo objeto del tipo que deseamos. En la jerga de la programación se llama crear una instancia, o instanciar un nuevo objeto.

Así, esa segunda línea significa que vamos a crear una nueva instancia de tipo Servo que llamamos servo1.

 
  • Aunque ahora os pueda parecer una forma extraña de hacer las cosas, la programación orientada a objetos (OOP por sus siglas en inglés), es una de las metodologías más potentes de las ciencias de computación actuales y todos los lenguajes de programación que se precien, han incorporado las ideas de la OOP.
  • Entrar en la teoría del OOP, desborda con mucho las pretensiones de este humilde tutorial de Arduino, por ahora nos limitaremos a mostraros como usar los objetos

Una vez creada la instancia del objeto (y podemos crear tantas como necesitemos, para manejar varios servos a la vez) tenemos que incluir una línea en la función setup() para informar a C++ que vamos a conectar ese objeto abstracto que todavía es servo1 a un pin físico del Arduino para controlarlo. En nuestro caso el pin 9:

servo1.attach(9);

Una vez cumplido el trámite para gobernar la posición del servo recurrimos a

servo1.write( angulo);

Donde Angulo es el valor en grados de la posición que deseamos. Fácil ¿No?

Vamos a escribir un programa que vaya barriendo un Angulo en grados y moviendo el servo a esa posición.

#include <Servo.h>                    // Incluir la librería Servo
Servo servo1;                         // Crear un objeto tipo Servo llamado servo1
int angulo = 0 ;

void setup()
    {
        servo1.attach(9) ;             // Conectar servo1 al pin 9
    }

void loop()
    {
        for(angulo  = 0; angulo  <= 180; angulo  += 1)   //incrementa angulo 1 grado
            {
                 servo1.write(angulo);
                 delay(25);
            }
        for(angulo  = 180; angulo  >=0; angulo  -=1 )    //decrementa angulo 1 grado
            {
                 servo1.write( angulo );
                 delay(25);
            }
    }

Veréis como el servo se va moviendo primero hacia adelante y luego retrocede para volver a empezar.

Vamos ahora a hacer que el valor del potenciómetro represente la posición del servo de manera que el servo se mueva siguiendo al potenciómetro. Para ello hay que entender que el valor que leamos en la puerta A0 está comprendido entre 0 y 1024, y que estos valores tienen que distribuirse entre 0 y 180º. Así que para calcular el Angulo correspondiente basta con hacer:

Img_16_1Como la experiencia me ha demostrado, que los errores haciendo este tipo proporciones tienden a infinito, voy a aprovechar para presentaros la función map()que hace exactamente eso de un modo cómodo, librándonos de los float ( aunque para aprender no os vendría mal hacer así el programa y luego usar el map()).

 angulo  = map( analogRead(A0), 0, 1024, 0, 180);

Traducido quiere decir: Haz la proporción de los valores que leas en A0, entre 0 y 1024, en un valor comprendido entre 0 y 180º y asignarle ese valor al ángulo.

Contenido solo disponible para suscriptores. ¡Accede al contenido!

       

Aqui teneis un pequeño video, mostrando el movimiento del servo

 

Resumen de la sesión

En este curso arduino hemos aprendido lo siguiente:

 

 

    • Hemos presentado los servos y hemos vista una par de programas sencillos para usarlos.
    • Hemos introducido algún concepto básico de programación orientada a objetos para que podáis utilizar las librerías.
    • Hemos definido las librerías como conjuntos de funciones y objetos que podemos utilizar sin preocuparnos de cómo funcionan internamente.
    • Las librerías son un sistema excepcional de utilizar elementos electrónicos sin tener que entrar en los detalles técnicos más o menos complicados. Esto nos abre un potencial enorme de componentes a nuestra disposición.
    • Introdujimos otra función más para nuestro arsenal: map().

 

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(118) Comments

  • Avatar for Charly
    • Admin

    Facil, mandale ponerse a 0 y pon una marca

  • Avatar for Charly
    • Asela

    Hola! Disuculpe, como se cuando mi servo ya esta en los cero grados?

  • Avatar for Charly
    • JOu

    Hola …
    Alguien realizo un codigo para 4 servos y dos joystick …. pero filtrado , es decir que servo no vuelva al punto inicial?

  • Avatar for Charly
    • Admin

    Hola Daniel.
    Tiene toda la pinta de ser un problema de potencia de tu fuente de alimentacion. No estoy seguro del consumo de cada servo, pero a juzgar por tus datos como 200 mA cada uno por eso hasta 3 aguanta pero con el 4º pasas de la capacidad de tu fuente que solo es de 0,7. Si tiene que conectar mas servos busca una fuente de esas pero de al menos 2A que suele haber en cualquier tienda de chinos proxima.
    Nosotros estamos negociando para poner en la tienda estos alimentadores, pero por ahora no hemos encantrado uno que nos guste

  • Avatar for Charly

    Hola buenas tengo un pequeño problema al conectar varios servos a la placa, actualmente alimento los servos con una fuente distinta a la que uso para alimentar el arduino (un cargador de movil que ofrece 5,1v con 0,7A ) al conectar un servo todo funciona correctamente, he conectado otros 2 y todo funciona como deberia, pero a conectar mas servos cada uno hace lo que quiere y dejan de hacerle caso a las señales que les manda el arduino.
    no entiendo si esto puede deberse a interferencias entre los servos, o a que puede deberse…
    me gustaria saber si existe una solucion a este problema.
    muchas gracias 🙂

  • Avatar for Charly

    Hola buenas, es necesario una alimentacion externa para no dañar el servo o la placa Arduino?

  • Avatar for Charly
    • Admin

    hola Edith, la asignacion simplemente crea y asigna valor a una variable de uso general. Por eso se puede usar para cualquier cosas siempre y cando tu , el programdor, lo tengas claro. Asi se puede usar para definir el modo de uso de un pin o el valor de un angulo en un servo.
    Son variables que contiene algo que el procesador no entiende. eres tu quien sabe para que sirve y es tu programa quien le define como usarlo

  • Avatar for Charly

    Hola!
    Tengo una duda: cuando escribes la variable que asigna el ángulo al servo lo haces de la siguiente manera:

    int angulo=0;

    Sin embargo, tengo entendido que esa escritura es para asignare los pines al arduino, o sea que si escribo

    int camina=13;
    void setup()
    pinMode(camina,INPUT);

    Se declara camina en el pin 13 como salida sin necesidad de ponerlo en pinMode… me explico?

    La pregunta es que si la escritura de ese modo de ángulo no choca con la escritura de la salida de los pines del arduino.
    Gracias!

  • Avatar for Charly
    • Admin

    Hola Will, Basta con que leas el pulsador del modo que te indicamos en los tutoriales y despues en funcion de ello arranques o pares el motor con la orden run forward que ves en la sesion del shield de motores, no tiene mas dificultad

  • Avatar for Charly
    • William David Arreola Santiago

    Tengo Dudas de como hacer que al pulsar un Push Bottom o pulsador como le quieran llamar me active el motor 1 osea el M1 del Adafruit Motor Shield de control de motores.
    Solo quiero saber eso… de que al pulsar el pulsador encienda el motor y cuando no lo encienda se apague…
    Gracias por su atencion…
    Lo queria hacer yo mismo… pero es una tarea urgente, puesto que no tengo tiempo de seguir con el curso de Arduino.
    Y lamento comentar aqui…

  • Avatar for Charly
    • Admin

    Joer con los Gremlins (Y el corrector ortográfico), bueno ya esta corregido . Muchas gracias por indicarmelo

  • Avatar for Charly

    en el primer ejemplo en «void setup()», tienes escrito con mayuscula la «V» de void. seria «v» en minuscula.
    solo una observacion, se que a todos se nos pasa por error de dedo….. lo digo por las personas que estan empezando para que su programa pueda correr bien y no tenga errores…
    por cierto muy buena pagina gracias por las enseñanzas..

  • Avatar for Charly
    • Jesús Sánchez

    Gracias admin. Cierto es que fuí un poco perezoso y no busqué bien. En una página encontré que son los pulsos mínimo y máximo que se le pueden mandar al servo para ajustar su ángulo. Por defecto, Arduino los tiene a 544 y 2400, pero para algún proyecto de robótica en particular, nos puede interesar que no supere cierto ángulo por seguridad. Probaré de nuevo a ver y comento lo que vea. Esta es la página donde lo encontré:

    Gracias y saludos.

  • Avatar for Charly
    • Admin

    Hola Jesus,
    He hecho una busqueda rapida por INternet y no he encontrado nada que aclare este tema, asi que he revisado el codigo fuente de la libreria servo en el directorio ARduino\library\servo y tampoco parece de mucha ayuda.

    EL codigo es algo asi
    attach(pin, min, max ) – Attaches to a pin setting min and max values in microseconds
    default min is 544, max is 2400

    Pero no parece de mucha ayuda tampoco. La verdad es que no tengo ni idea, quiza salgien que lea esto nos pueda ilustrar

  • Avatar for Charly
    • Jesús Sánchez

    Hola Admin. Cuando usas la instrucción servo1.attach(), tengo otros sketchs por aquí que le añaden dos parámetros más aparte del pin de control. Estos son los pulsos máximo y mínimo, y quedaría así:

    servo1.attach (9,600,1500);

    ¿Hay diferencia en incluirlos en la instrucción o no? He estado jugando con ellos, y casi es mejor no tocarlos mucho. Los servos que tengo son los SG-90 Tower Pro.

    Gracias y saludos.

  • Avatar for Charly
    • Admin

    Hola Guillermo
    Creo recordar que un continuous rotation servo gira sin limites, a diferencia de un servo normal, y por eso bien pudiera ser que la señal que le entregas no represente el angulo sino la velocidad, pero sin conocer el modelo es difícil de saber.
    Busca en internet la hoja de características del servo que es donde te dan ese tipo de información
    un saludo

  • Avatar for Charly
    • Guillermo

    Hola, he realizado todo como dice pero en vez de regularme el angulo lo que varia es la velocidad del servo, nose si sera por el tipo de servo que yo tengo ya que dice GS3360BB Goyeck Continuous Rotation, sera ese otro tipo que se controla de diferente manera??

    la pagina es espectacular felicidades por el excelente trabajo jaja

  • Avatar for Charly
    • Admin

    Desde luego que si, son esas cosas de los gremlins que se van colando donde menos te lo esperas. Gracias por indicarmelo. Ya esta corregido

  • Avatar for Charly
    • Jmcn

    En el primer ejemplo, en la parte del código que hace retroceder el servo, no deberiamos cambiar el nombre «myservo» por «servo1»?.
    Gracias

  • Avatar for Charly
    • Admin

    Teseo, Lamento tu problema, y no se muy bien que puede ser porque simplemente he seguido el procedimiento que marca google para colgar videos.
    ¿De todos modos intentare hacer mas pruebas aunque hasta ahora no he tenido problemas.
    Te permite abrir esto? : https://www.youtube.com/watch?v=4NzS7dDQ_t8

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login