Problema con Servos SG90 y Arduino

Hola amigos, estoy trabajando con 4 micro servos SG90 9G y 4 atmegas328P AU por fuera del arduino, es decir, el microcontrolador como tal soldado a una placa diferente del arduino. Lo que me está sucediendo es que al momento de utilizar 1 solo micro servo el código me corre perfecto sin ningún fallo, el problema es cuando conecto los 4 servos y comienzo a ejecutar que algunas veces funciona un servo y otro no y así, por lo que mi teoría es que estoy teniendo mucho ruido proveniente de los servos, ya cada servo tiene un capacitor de 100nF pero el problema persiste.

Aclaro que los micros están conectados a una sola placa y la alimentación de los servos es independiente al de los atmega, tengo 5V para los atmegas y 6V para los 4 servos y ps su respectiva GND en común.

Muchas gracias.
 
En el aire es adivinar, esquema completo de tu montaje, fotos del mismo y el código que estas utilizando
Al parecer puede ser por problemas en fuente y/o falta de diodos, pero lo mejor es que proporciones la información asís vamos sobre seguro
 
Muy bien, coloco un esquema básico de lo que tengo, no quería entrar tanto en detalle para no enredar pero bueno explico algo, yo tengo un sensor de corriente ACS como se ve en el esquema, lo tengo midiendo la corriente que consume el servo, por eso se ve la conexión del servo al sensor que está en serie. Lo mido con el atmega y con eso yo puedo detectar cuando el servo detecto algún obstáculo, porque dicho servo yo lo tengo montado en una pinza que realicé en 3D y el servo abre y cierra pinza, entonces utilizo el sensor de corriente para saber cuándo esa pinza logra agarrar algo y así puedo deshabilitar o habilitar el servo. Yo controlo el servo directamente con PWM con la instrucción analogWrite(), con esto yo ubico el servo por el pin 3. En el esquema no lo hice porque no creo que sea muy relevante pero lo digo por si acaso, el atmega lo tengo conectado por Tx y Rx a un PIC que envía y recibe señales de un XBEE y ese PIC es el que se comunica con los 4 atmegas, no creo muy relevante esta información porque la comunicación y todo eso está en perfectas condiciones y no hay ningún problema.

Siguiendo con el problema que tengo, es que yo mido la corriente inicialmente para poder tener una constante de cuando la corriente es 0, me da un valor de 2.49 (En realidad mido el voltaje del ACS que me envía por el A0 debido a que no pude estabilizar los valores de corriente que me arrojaba y las señales de voltaje fueron mucho más estables), a ese valor yo le resto 0.01 y esa es mi constante de cuando el servo está consumiendo, lo que significa que la pinza agarró algo y es justo ahí cuando deshabilito el servo. Sólo le resto 0.01 porque la variación de voltaje que tiene el sensor es muy mínima, entonces esa constante es la medición que me toma el sensor cuando ya el servo encontró un obstáculo, así que ahí deshabilito el servo y listo.

Cuando hago todo esto con un solo servo todo funciona perfecto sin ningún fallo, el problema es cuando coloco los 4 servos y trabajan al tiempo ps algunos se mueven y otros no, así que no creo que el problema sea en el código sino mas bien ruido que están ingresando los servos. Aclaro que pruebo independientemente cada servo y cada atmega y funciona como debe ser
 

Adjuntos

  • Esquema.jpeg
    Esquema.jpeg
    23.5 KB · Visitas: 30
¿"ps" = "pues"? Me desconcierta un poco.

Prueba con alimentaciones diferentes a ver que pasa.

Según que arduino uses puede o no puede gobernar cierto número de servos

Puede ser sencillamente falta de corriente.
 
Eso es un diagrama de bloques no puedo ver como atacas al servo desde un puerto, pero ya esta a la vista una de las fallas y la torpeza más común, alimentar el servo desde la placa arduino, el servo.
Regla general, los periféricos deben alimentarse con una fuente independiente.
Hace falta un diagrama eléctrico del coneccionado, así se ha mano alzada, no se si manejas el servo directament de la salida o has puesto algo entre el módulo y los servos.
Si quieres recibir ayuda danos la información pedida, no somos adivinos.
De echo el único que se beneficia eres tú, así que por favor danos la información solicitada
 
¿"ps" = "pues"? Me desconcierta un poco.

Prueba con alimentaciones diferentes a ver que pasa.

Según que arduino uses puede o no puede gobernar cierto número de servos

Puede ser sencillamente falta de corriente.
Las alimentaciones del servo y del arduino son independientes. Por falta de corriente no es, ya que poseo una fuente de 5 amperios.

Eso es un diagrama de bloques no puedo ver como atacas al servo desde un puerto, pero ya esta a la vista una de las fallas y la torpeza más común, alimentar el servo desde la placa arduino, el servo.
Regla general, los periféricos deben alimentarse con una fuente independiente.
Hace falta un diagrama eléctrico del coneccionado, así se ha mano alzada, no se si manejas el servo directament de la salida o has puesto algo entre el módulo y los servos.
Si quieres recibir ayuda danos la información pedida, no somos adivinos.
De echo el único que se beneficia eres tú, así que por favor danos la información solicitada
El esquema que te mandé no es un diagrama de bloques, si te das cuenta te coloqué los pines a donde va conectado cada cosa en el arduino y vuelvo y repito, la alimentación del Arduino no es la misma que la del servo, la alimentación del servo es de 6V y la del arduino es de 5V, son fuentes independientes, tal vez te confundes por el hecho de que el servo va a unos pines del sensor ACS pero si buscas el datasheet del ACS verás que eso sólo son pines para poder realizar la medición de corriente del mismo servo, como ves la patilla positiva del servo va a una del ACS y la patilla siguiente va a los 6V que alimentan al servo. De igual forma intentaré hacer el esquema en Eagle para subirlo y por el momento agrego algunas etiquetas al esquema anterior.

Saludos y gracias por la ayuda
Aquí subo el esquema en Eagle para que lo vean, tener en cuenta que la sección del Atmel, Servo y ACS se repite 4 veces, el resto de las secciones quedan igual.
 

Adjuntos

  • Esquema 2.jpeg
    Esquema 2.jpeg
    27.7 KB · Visitas: 21
  • Esquema.png
    Esquema.png
    387.9 KB · Visitas: 23
Última edición:
Hola a todos , un punto que no puede sener olvidado es : mismo que tu fuente de alimentación logre fornir hasta 5 Amperios eso no quieres decir que tu Arduino tenga la capacidad en fornir toda esa demanda de curriente (tanbien conocido como "Fanout").
Asi debes elegir drivers adecuados entre la salida del Arduino y los motores (Stepmotors).
Cuanto a los capacitores de desacople (100nF) eses deben sener sener conectados directamente en los puntos de alimentación tanto de la fuente como de todos los disposictivos conectados a el (controladores y cargas).
!Suerte en los desahollos!.
Att,
Daniel Lopes.
 
Esos servos Sg90 consumen bastante , unos 300 mA en reposo , 800 mA moviendose solos y mas de 1 A moviendo algo.
Sólo consumo 800mA si por ejemplo llevas el motor a 120 grados y encuentra el obstáculo en 50 grados, en realidad consume unos 300mA cuando encuentra obstáculo y como digo la diferencia de los grados debe ser muy alta para que obtenga ese consumo, casi nunca llega a ese punto, como máximo llega a consumir unos 200mA y luego queda desactivado por lo que en estado de reposo queda en consumo 0.

Hola a todos , un punto que no puede sener olvidado es : mismo que tu fuente de alimentación logre fornir hasta 5 Amperios eso no quieres decir que tu Arduino tenga la capacidad en fornir toda esa demanda de curriente (tanbien conocido como "Fanout").
Asi debes elegir drivers adecuados entre la salida del Arduino y los motores (Stepmotors).
Cuanto a los capacitores de desacople (100nF) eses deben sener sener conectados directamente en los puntos de alimentación tanto de la fuente como de todos los disposictivos conectados a el (controladores y cargas).
!Suerte en los desahollos!.
Att,
Daniel Lopes.

Vuelvo y repito que el el arduino no es el que está alimentando el servo, tiene una alimentación externa.

Y el código
¿El problema puede estar ahí?
Problemas de código no creo que ese sea el problema porque el código funciona con un solo atmel sin ningún problema.
 
Hola, haz la sig. prueba.
Coloca un simple código en el Arduino, para que encienda los 4 servos simultáneamente y luego los detenga,( si tienen tope, pues que haga el retorno), de manera cíclica.
Si ésta acción es inestable o no se completa, el problema es ruido.
 
Que te parece si subis una foto o un dibujo donde pueda apreciarse CLARAMENTE como es la conexion fisica real de UN arduino con un motor y un driver, y luego las conexiones fisicas reales del CONJUNTO de arduinos, motores, drivers, etc??
Esos problemas de ruido no se solucionan blindando ni filtrando ni adivinando, solo se solucionan (principalmente) con un layout correcto, que no parece ser el caso en tu diseño.
 
Es que es tan secreto su código y plagado de delays que los chinos lo podrían copiar y no podrán usar su código redundante con DELAYS en la NASA.

Y el diagrama es igual secretismo el pentágono se lo podría copiar.

Es que hay que poner código y diagrama por qué así no se puede adivinar nada.
 
Es que es tan secreto su código y plagado de delays que los chinos lo podrían copiar y no podrán usar su código redundante con DELAYS en la NASA.

Y el diagrama es igual secretismo el pentágono se lo podría copiar.

Es que hay que poner código y diagrama por qué así no se puede adivinar nada.
No, hombre que no es el código, la alimentación tampoco y el conexionado menos aún, ni tampoco el diagrama. Lo que pasa es que no queréis ayudar y os tenéis callada la solución.
¡¡Sed buena gente y decidlo ya!! /Sarcastic mode


En serio, sin tener todos los datos no se puede ayudar. Me huelo varios problemas, seguramente delays seguramente conexionado y seguramente mas cosas pero todo son imaginaciones mías porque no hay datos de lo que está pasando.
 
Hola, perdón si estoy haciendo algo mal en este foro al publicarlo, soy nuevo.
Tengo un problema, estoy haciendo un parqueo automático con dos sensores y un Micro-Servomotor SG90 que se supone debe girar 180 grados.
Bueno, el circuito y la programación funciona bien, exceptuando el Micro-Servomotor, que no permanece en una posición sólida a no ser que le programe 90 grados.
Un ejemplo rápido:
#include <Servo.h>
Servo miservo;

void setup() {

miservo.attach(7);
miservo.write(0);
}

void loop(){

}
Con este sencillo código el servo unicamente debería ubicarse en 0 grados y quedarse quieto, pero no, sigue girando constantemente.
No entiendo que estoy haciendo mal, ya vi el circuito y no hay nada mal.
Quisiera saber si me pueden ayudar con ello.
Espero haberme explicado bien.
 
Atrás
Arriba