Arduino UNO se reinicia al conducir servo

Estoy tratando de controlar dos servos a la vez usando Arduino UNO y Arduino Motor Shield. Mis servos están modificados, para que puedan trabajar con movimiento constante.

Cuando envío el primer pedido myservoP.write(180);(a toda velocidad) funciona bien; sin embargo, cuando trato de ordenar a mi servo que cambie de dirección ( myservoP.write(0);), inmediatamente mi Arduino falla y se reinicia.

Al principio pensé que podría ser un problema con la fuente de alimentación, pero después de probarlo con mi programa (enumerado a continuación), estoy empezando a pensar que es un problema con el búfer o la memoria. Sin retrasos, el Arduino se bloquea después de unas 10 iteraciones. Con retraso (10), se bloqueará después de aproximadamente 90 iteraciones. Con retraso (20), Arduino puede repetir un ciclo completo 5 veces, de principio a fin. Durante el sexto intento, se estrelló de nuevo.

Aquí está mi código:

#include <Servo.h> 

Servo myservoL;  
Servo myservoP;
int i; 

void setup() 
{ 
 delay(2000);
 myservoL.attach(9);   // attaches the servo on pin 9 to the servo object 
 myservoP.attach(10);  // attaches the servo on pin 10 to the servo object 
 Serial.begin(9600);
} 
void loop() 
{ 
  for(i=180; i>=0; i--)
  {
    delay(20);
    Serial.println(i);
    myservoP.write(i);
    myservoL.write(i);
  }
  for(i=0; i<=190; i++)
  {
    delay(20);
    Serial.println(i);
    myservoP.write(i);
    myservoL.write(i);
  }
Una prueba obvia sería ejecutar el programa sin el servo conectado. Si eso evita que se bloquee, probablemente sea un ruido eléctrico o una carga de suministro del servo defectuoso. Pero si aún falla, probablemente sea un error en su programa.
De acuerdo. Así que lo comprobé y PUEDO usar dos servos a la vez. Y ejecuté mi programa de prueba sin servos y no falló. Así que es eléctrico... Tengo que encontrar la manera de comprobar lo que hace que el problema... Gracias por la ayuda, chicos.
Es posible que desee buscar una fuente de alimentación externa para los servos, o al menos no ejecutarlos desde el USB a través del Uno.
De hecho, conecté 4 pilas AA y todavía no es suficiente.
Sí. 4 batería es suficiente. Tuve que atornillar algo con los pines del servo arduino, porque cuando conecté mi servo a 5v y GND normales a bordo, y señalé al pin digital normal, ¡comenzó a funcionar! (Por supuesto, esta batería 4 la conecté a una fuente de alimentación externa en el escudo de arduino morot).

Respuestas (3)

Si el Arduino no se reinicia cuando los servos no están enchufados, lo más probable es que los servos consumen mucha corriente y, por lo tanto, el voltaje de la batería cae lo suficiente como para que el Arduino se reinicie.

Intente usar dos paquetes de baterías separados: uno para alimentar el Arduino y el otro para alimentar los motores (asegúrese de conectar las conexiones a tierra de los dos paquetes de baterías).

intente aumentar el tiempo de retardo a 5000 en lugar de 20, para que los servos puedan tomar el tiempo suficiente para completar la rotación:

#include <Servo.h> 

 Servo myservoL;  
 Servo myservoP;
 int i; 

 void setup() 
 { 
 delay(2000);
 myservoL.attach(9);   // attaches the servo on pin 9 to the servo object 
 myservoP.attach(10);  // attaches the servo on pin 10 to the servo object 
 Serial.begin(9600);
  } 
void loop() 
 { 
for(i=180; i>=0; i--)
 {
   delay(5000 );
  Serial.println(i);
   myservoP.write(i);
   myservoL.write(i);
    }
    for(i=0; i<=190; i++)
    {
    delay(5000 );
     Serial.println(i);
    myservoP.write(i);
    myservoL.write(i);
     }

Complemento a la respuesta de Nate: si desea mantener una batería tanto para los motores como para el arduino, debe limitar la corriente consumida por los servos al tener algún tipo de rampa descendente antes de cambiar de dirección, por ejemplo, la mitad de la velocidad después de 20 ms, 0 rpm después otros 20 ms, antes de cambiar de dirección. Si está cambiando la dirección de ambos motores al mismo tiempo, debe retrasar uno, digamos, 20 ms para reducir aún más la corriente máxima.

Antes de hacerlo, puede monitorear el voltaje del suministro de arduino, preferiblemente con un 'alcance configurado en "único", desencadenar una pendiente descendente de ~ 4.5V. Eso debería decirte si el suministro de arduino cae cuando los motores cambian de dirección.