Cómo evitar la inestabilidad de arranque del servo

Tengo un pequeño robot alimentado por Arduino Uno en el que participo en una competencia, y usa algunos servos pequeños para colocar sensores y otros actuadores. De acuerdo con las reglas, no puede moverse hasta que se recibe una señal predeterminada, momento en el que el robot se enciende manualmente. Sin embargo, cuando se inicia, el Arduino activará los servos en posiciones aleatorias, lo que provocará una "inquietud" que descalificaría inmediatamente al robot.

¿Cómo se cablea/codifica el Arduino para que, cuando se encienda inicialmente, los servos conectados permanezcan en su posición actual y no "vibren" en absoluto?

Los servos están conectados a los pines DIO estándar utilizando la biblioteca de servos incorporada.

¿Cómo se ve su fuente de alimentación, cómo conectó las distintas partes y le agregó componentes adicionales, excepto los servos y el controlador?
Solo estoy usando un Arduino. El servo es un microservo HXT900, que es lo suficientemente pequeño como para ser alimentado directamente desde el pin de 5V de Arduino.
Arduino no es una central eléctrica, no la uses como tal. Dudo que la respuesta aceptada resuelva el nerviosismo, pero obviamente estoy equivocado en esa parte.
@jippie, lo probé y resolvió el problema.

Respuestas (2)

Al encender un Arduino, obviamente, no tendrá las posiciones del servo (como dice), por lo que debe determinar la posición del servo después del encendido. Esto no es facil. Implicaría sensores de posición de rotación adicionales.

Si realmente necesita que el Arduino se encienda por completo, entonces "estacionaría" los servos en una posición determinada antes de apagarlo. Luego, durante la inicialización después del encendido, devuelva los servos a la posición de estacionamiento, y claramente no se moverán.

Alternativamente, podría considerar un modo de suspensión para su robot en el que el Arduino no se apaga realmente y, por lo tanto, las variables que contienen las posiciones del servo no se borran.

Sí, eso es también lo que recomienda esta publicación del foro. Afortunadamente para mi aplicación, puedo "estacionar" fácilmente los servos.

Aunque la respuesta de @akellyril lo resolvió parcialmente, todavía veía un poco de nerviosismo. Para resolverlo por completo, conecté un transistor NPN para permitir cortar la línea de 5 V del servo a través de un pin Arduino, como se describe aquí .

Otro problema menor con el que me encontré fue que, incluso cuando el servo estaba en la posición correcta y sin carga, "lloriqueaba" y hacía mucho ruido incluso con la línea de 5V cortada. Descubrí que llamar al detach()método del servo soluciona esto.

Para resumir, mi pseudocódigo se ve así:

  1. Establezca el pin de control de potencia del servo en salida y ajuste bajo para apagar.
  2. Establezca el servo en la posición "estacionada".
  3. Adjuntar servo.
  4. Establezca el pin de control de potencia del servo en alto para encender el servo.
  5. Mueva el servo para la aplicación.
  6. Coloque el servo en la posición de estacionamiento.
  7. Desmontar el servo.
  8. Establezca el pin de control de potencia del servo en bajo para apagarlo.