Más servos que canales PWM

Hola, si no tengo mal entendido para poder hacer funcionar los servos es necesario conectarlos a salidas con PWM. Actualmente uso el chip ATmega32u4 que sólo consta de 8 canales con PWM. Mi intención es ponerle unos 16-18 servos, así que necesito algún "parche" para que funcionen. Había pensado en un multiplexor, pero no se si la latencia en hacer el switch será superior al tiempo de refresco (que os parece este que he encontrado http://www.sparkfun.com/products/9056). No se si hay alguna otra solución a parte de cambiar de chip. Si fuese posible la opción del multiplexor, hay algún tutorial tipo paperduino para construirse uno?

Muchas gracias

Realmente no, puedes usar la librería servo. Esta solo utiliza timers para funcionar.

Que quieres decir con: "realmente no, puedes usar la libreria servo"? Usar un multiplexor no es una buena idea?

Pues realmente no puedes usar un PWM para sintetizar un pulso de control para un servo.

Los servos trabajan con pulsos de 1ms-2ms con repeticiones de unos 40ms. Un PWM es un pulso periódico donde se varía el tiempo que está activado.

Si fueses a usar un multiplexor, lo que vas a estar generando una configuración de canal periodicamente y vas a tener que reducir la frecuencia del PWM que sintetiza el AVR sustancialmente.

Lo más sencillos es que uses la librería estándar Servo.h. Esta se encarga de sintentizar los pulso que espera el servo por tí y puedes generar tantos canales como pines de entrada salida tengas disponible.

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                      // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
 
void loop() 
{ 

  // Barrido en un sentido
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                             // in steps of 1 degree 
    myservo.write(pos);                 // tell servo to go to position in variable 'pos' 
    delay(15);                              // waits 15ms for the servo to reach the position 
  } 

  // Barrido en el otro
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                            // waits 15ms for the servo to reach the position 
  } 
}

Muchísimas gracias, creo que ahora me ha quedado claro. No hay que usar PWM, sino pines normales de salida digital y que la libreria Servo.h se encargue de hacer lo que toque, no?

Correcto. La parte importante es el metodo attach, para asociar un pin a controlar.

Es posible que te encuentres algún problema de rendimiento cuando manejes muchos servos. Yo no he superado los 5 en mi configuración, con lo que no sabría decirte. Por otro lado date cuenta que solo tienes que llamar al metodo write cuando tengas un cambio de posición. No es necesario llamarlo en el bucle.

Muchas gracias fm! A ver si el fin de semana que viene lo tengo listo y sin problemas.

Recuerda alimentar los servos desde fuera de la placa porque sino con 3 o 4 perderás el control porque no es capaz de dar tanta corriente la placa arduino.

Creo recordar que con la placa arduino se podían controlar hasta 12 servos independientes, en algún sitio lo leí. Salu2

Que quiere decir hasta 12 servos independientes? Que a partir de 12 los tengo que alimentar a parte o que como mucho puede controlar 12 servos los alimentes como los alimentes?

Arduino UNO solo puede dar 400mA por lo que el número que puedes alimentar desde la placa es muy reducido. Desde fuera de la placa puedes alimentarlos (directamente desde una fuente de alimentación) 12 servo motores controlados desde la placa arduino UNO. He buscado donde había leído y está explicado en la librería del servo. http://arduino.cc/es/Reference/Servo

Salu2

Entiendo... en resumen, no hay que usar PWM, sino que la biblioteca Servo.h ya lo controla y que no se pueden usar mas de 12 servos a la vez. Alguien ha encontrado la manera de hacer que esto sea posible? Como se le puede dar más intensidad para que aguante más servos?

Gracias de nuevo!

Creo que la limitación viene mas por la caballería que tiene el AVR que por otra cosa. Lo que es importante es lo que te han comentado, no es bueno mezclar la alimentación del AVR y la de los servos. Lo suyo es poner un regulador externo que alimente a los servos.

Ok, alimentaciones separadas! Teniendo las alimentaciones separadas podré meterle más de 12 servos? Me ha parecido entender, según la respuesta de ionhs, que no.

No, no creo que puedas controlar más de 12 servos. Es cuestión de caballería del AVR.

Ok, con esto es todo lo que queria preguntar.

Muchas gracias a todos ;)

¿se puede utilizar simultáneamente en el mismo sket la librería servo y la funcion analogWriter ?
¿son compatibles?.

¿este código es viable?

// Barrido en un sentido
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable ‘pos’

analogWrite(led, pos); /////////// enciendo un led con valores de la posicion del servo. (aunque sea a mitad de intensidad)

delay(15); // waits 15ms for the servo to reach the position
}