Arduino UNO se reinicia al conducir el servo

6

Estoy tratando de controlar dos servos a la vez usando Arduino UNO y Arduino Motor Shield. Mis servos se modifican para que puedan trabajar con un movimiento constante.

Cuando envío el primer pedido myservoP.write(180); (velocidad completa) funciona bien; sin embargo, cuando trato de ordenar a mi servo que cambie de dirección ( myservoP.write(0); ), inmediatamente Arduino se bloquea 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 (que se detalla a continuación), estoy empezando a pensar que es un problema con el búfer o la memoria. Sin demoras, el Arduino se bloquea después de unas 10 iteraciones. Con el 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);
  }
    
pregunta Marcin

3 respuestas

5

Si el Arduino no se reinicia cuando los servos no están enchufados, lo que está sucediendo probablemente 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).

    
respondido por el Nate
1

Complementa la respuesta de Nate: si quieres mantener una batería para los motores y el arduino, debes limitar la corriente consumida por los servos teniendo algún tipo de reducción antes de cambiar de dirección, por ejemplo. Media velocidad después de 20ms, 0 rpm después de otros 20ms, antes de cambiar de dirección. Si cambia la dirección de ambos motores al mismo tiempo, debe retrasar uno por ejemplo, 20 ms para reducir aún más la corriente de pico.

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

    
respondido por el Mister Mystère
0

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);
     }
    
respondido por el jimmy cluter

Lea otras preguntas en las etiquetas