Librería de Servos versión 2.1 para Pinguino

Programación
Por fin terminé la versión 2.1 de la librería de servo para las placas de 8 bits de Pinguino. A continuación os doy detalles de lo que ha cambiado…En primer lugar, las funciones setMaximuPulse y setMinimumPulse hacen lo que deberían de hacer, y no lo que hacían antes. Antes estas 2 funciones simplemente llevaban la posición del servo a su máximo o su mínimo respectivamente. Lo cual no era para lo que estaban pensadas. Lo que hacen ahora es lo debido, lo cual describo a continuación:

servo.setMaximumpulse (pin, pulsomaximo)

Donde pin, es el numero de pin donde tenemos conectado el servo.

y pulsomaximo, es el valor en microsegundos del ancho máximo del pulso que admite nuestro servo. Este valor no puede ser superior a 2500 microsegundos.

servo.setMinimumpulse (pin, pulsominimo)

Donde pin, es el numero de pin donde tenemos conectado el servo.

y pulsominimo, es el valor en microsegundos del ancho máximo del pulso que admite nuestro servo. Este valor no puede ser inferior a 500 microsegundos.

De este modo establecemos cuales serán las posiciones mas extremas de nuestro servo. Si vamos a la hoja del fabricante lo podemos ver, y programarlo de acuerdo a ello.

Así vamos a establecer la siguiente relación:

– El ancho del pulso máximo, para que el servo se posicione a 180 grados.

– El ancho del pulso mínimo, para que el servo se posicione a 0 grados.

Por poner un ejemplo, vamos a utilizar un servo en concreto. Miramos la hoja de datos de un servo (podéis utilizar esta recopilación de datos que tenemos en ARDE: http://wiki.webdearde.com/index.php?title=Actuadores_II#Servomotores), por ejemplo, vemos que el fabricante del TowerPro SG-5010 dice que el mínimo pulso que admite es de 700 microsegundos (posición de 0 grados) y que el máximo es de 2250 microsegundos (posición de 180 grados). De modo que ahora con estas funciones podemos introducir en nuestro programa para pinguino los valores adecuados para dichos extremos de posición del servo.

Imaginemos que queremos conectar nuestro servo al pin 1 de nuestra placa pinguino:

setup {
  servo.attach(1)
  servo.setMaximumpulse (1, 2250);
  servo.setMinimumpulse(1,700);
}

Con eso ya tendríamos el servo correctamente definido para empezar a trabajar con él.

Además de la modificación de esas 2 nuevas funciones, he cambiado la función servo.write, y ahora lo que admite como parámetro de posición del servo son grados. De modo que en el cuerpo de nuestro programa principal podemos seguir con el ejemplo anterior del servo conectado al pin 1 y lo que tendríamos sería algo así:

loop {
  servo.write(1,0); // posicionamos el servo en 0 grados.
  delay(1000);  // retardo de 1 segundo.
  servo.write(1,90);  // movemos el servo a su posición central.
  delay(1000);  // retardo de 1 segundo.
  servo.write(1,180);  // movemos el servo a su posición central.
  delay(1000);  // retardo de 1 segundo.
} // fin del bucle principal.

Además de todo esto, tened en cuenta que podéis utilizar las siguientes Pinguino boards para trabajar con la librería de servos. De momento son todas de 8 bits. Ninguna de 32 bits aún:

  • Pinguino generica con 18F2550 (posibilidad de controlar hasta 18 servos simultáneamente)
  • Pinguino generica con 18F4550 (posibilidad de controlar hasta 29 servos simultáneamente). Para utilizar todos los pines disponibles tienes que añadir al principio de tu programa la directiva de compilación:
#define 18F4550
  • Pinguino PIC UNO EQUO. (posibilidad de controlar hasta 14 servos simultáneamente). Para utilizar todos los pines disponibles tienes que añadir al principio de tu programa la directiva de compilación:
#define PICUNO_EQUO

Con esto creo que podréis sacar partido de las modificaciones de la librería.

¡ Observad que con una Pinguino genérica con 18f4550 disponéis de 29 pines para manejar servos simultáneamente !  Sinceramente estoy tentado de hacerme un hexápodo o un humanoide con esto, porque son muchos servos los que se pueden controlar de este modo. Os animo a que probéis. Si lo hacéis, no dudéis en escribirme.

Saludos!!

Si queréis más información sobre como está hecha la librería, os invito a que miréis directamente el código, que ya está en los repositorios de google code, la he subido a la release 322 del código:
http://code.google.com/p/pinguino32/source/browse/trunk/p8/include/pinguino/libraries/servos.c

 

Editado el 30 de Agosto del 2012:

Dado que los repositorios no tienen fácil acceso para todos, os lo pongo también en la página de descargas de este blog.

Autor: Sphinx

Robotics enthusiast

24 opiniones en “Librería de Servos versión 2.1 para Pinguino”

  1. Hola a todos los que seguiais este artículo.
    La nueva implementación de la librería está ya en su versión 4.2, y está subida al repositorio de svn : http://code.google.com/p/pinguino32/source/browse/ide/x.4 : Os pido que lo actualiceis y probeis con ella. Yo personalmente he probado con Pinguino 2550 y Pinguino 4550 y va de maravilla. Regis también me ayudó y la probó con PICUNO EQUO. Todo fue bien.
    Espero vuestros comentarios de resultados en mi nuevo artículo del blog: https://linuxdroids.wordpress.com/2013/11/16/libreria-de-servos-version-4-2-para-pinguino/
    Saludos.

    Me gusta

  2. Muy buena la libraria tal cual la describes, pero en el IDE Pinguino X.4 me daerrores en todas las funciones de la libreria podria indicar de donde la bajo y don de la coloco

    Me gusta

    1. Hola Bruno,
      Tal y como escribía en respuesta a otra pregunta anterior, hemos encontrado algunos bugs en X.4 que hacen que esta librería falle. En cuanto los resolvamos os respondo a todos por este canal y actualizo el artículo del blog.
      Saludos,
      Sphinx.

      Me gusta

    2. Hola de nuevo Bruno. Mira mi nuevo artículo . Acabo de terminar de reescribir la librería. Se trata de la versión 4.2 y es totalmente compatible con el IDE x.4. Está probada por mi mismo… comentame si la usas.

      Me gusta

  3. Hola, estoy intentando controlar varios servos con una pic32 pinguino micro de Olimex, he hecho un apaño utilizando interrupciones, y funciona, pero no es un código muy fino y con muchos servos empieza a mandar pulsos un poco irregulares. Seguramente el problema es por los delays que la ejecución del propio código introduce al actualizar los pulsos de todos los servos.
    ¿Sabes si alguien tiene previsto portar tu librería a pinguino32? Si tú tienes pensado hacer algo en este sentido, y te sirve de algo el código que he hecho, aunque ya te aviso que es un poco chapuza, no dudes en escribirme y te lo mando.
    Un saludo.

    Me gusta

    1. Hola alop,
      Disculpa la tardanza en responderte, pero por motivos de salud he estado bastante alejado de estas actividades.
      Efectivamente mi idea original era la de portar mi librería de servos a todas las variantes de Pinguino, incluida la de 32bits. Actualmente desconozco si mi librería version 2.1 está ya integrada en el proyecto pinguino.
      Intentaré ponerme al día y poder actualizar la librería a micros de 32.
      Gracias por tu mensaje.
      Un saludo.

      Me gusta

  4. hola ya logre hahacer que me compile 🙂 usando #define PICUNO_EQUO sin embargo aunque compila cuando se lo cargo ami placa si uso el puerto de serie por ejemplo Serial.begin(9600); en setup mi servos no se mueven 😦

    Me gusta

  5. hola disculpa cuando intento compilar usando en puerto de serie usando la board con 18f4550 me da error de compilacion pero cuando compilo para 2550 no me lo da la cuestion es que necesito usar muchos seros por eso quiero usar el 4550…este es el error que me marca
    error: linker script has no definition that matches the type of section «udata_fsadd_1»
    error while linking C:\Pinguino\examples\10.Libraries\Servo\singleservotest.o

    Me gusta

  6. Hola mira; estoy probando las librerías y todo perfecto. El único inconveniente que me encuentro es al intentar pasar el codigo al pinguino. Es PIC18F4550 y bueno lo que me dice la consola es: Processing device 010 Unable to open device. Sabes porque se da ese problema? Gracias de antemano.

    Me gusta

    1. Hola, no sé que versión de IDE de pinguino estás utilizando. Si me puedes decir cual, te podré ayudar. Lo digo porque algunas ultimas versiones del IDE tienen un menú para seleccionar el chip que utilizamos.
      Saludos,
      Sphinx.

      Me gusta

  7. Hola

    He buscado esta libreria pero no la encuentro en ningun lugar.

    Ni en la X.3 ni en la X.4, podrias indicarme de donde bajarla?.

    Un saludo

    Fernan

    Me gusta

      1. Hola Sphinx
        Estoy usando la ultima version de pinguino (r564), he cambiado el «servos.c» (version 1.0) por el que he bajado de esta pagina (version 2.1).
        Al escribir el programa , el autocompletado funciona perfectamente con las nuevas instrucciones pero al compilar da un fallo.
        /home/fernan/datos/electronica/x.4/source/define.h:4:9: error: macro names must be identifiers
        /home/fernan/datos/electronica/x.4/source/user.c:12: syntax error: token -> ‘ServoMaximumPulse’ ; column 17
        Lo intento compilar para una placa 18f4550 e incluyo al iniciar el programa «#include 18f4550».
        Si sabes que me falta por hacer para que pueda compilar se agradecera toda la ayuda

        Un saludo

        Fernan

        Me gusta

      2. Hola Fernan, perdona el tiempo sin contestar, llevo unos meses de baja y no he revisado el blog. Dime si pudiste encontrar la causa de ese problema, y lo podemos compartir aquí con nuestros lectores. Así de momento no se me ocurre cual puede ser la razón.
        Un saludo, Sphinx.

        Me gusta

  8. hola compañero…mira necesito que me pases, ya sea por email o subiendolo a pastebin o como fuera, la version 2.1 de servos.c que describes aqui en tu blog.
    porque lamentablemente el link de arriba no funciona y no pude encontrar la libreria en la web.. gracias , te dejo mi email

    axs.ibarra@gmail.com

    Me gusta

    1. Hola axs,
      Puedes encontrar el fichero en la página de descargas del blog. He editado el articulo y he puesto un enlace justo al final.

      Un saludo.
      Ya me decis que tal va la libreria para vosotros.

      Saludos.

      Me gusta

  9. Da errores con la declaración implícita de la función abs y con la definición de la estructura «servo» que no la encuentra. Podrías ayudarme?

    Me gusta

Deja un comentario