Arduino UNO wird beim Servofahren zurückgesetzt

7

Ich versuche, zwei Servos gleichzeitig mit Arduino UNO und Arduino Motor Shield zu steuern. Meine Servos sind so modifiziert, dass sie mit ständiger Bewegung arbeiten können.

Wenn ich die erste Bestellung myservoP.write(180);(volle Geschwindigkeit) sende , funktioniert es gut; Wenn ich jedoch versuche, meinem Servo zu befehlen, die Richtung zu ändern ( myservoP.write(0);), stürzt mein Arduino sofort ab und wird zurückgesetzt.

Zuerst denke ich, dass es ein Problem mit der Stromversorgung sein könnte, aber nachdem ich es mit meinem Programm (unten aufgeführt) getestet habe, beginne ich zu denken, dass es ein Problem mit dem Puffer oder dem Speicher ist. Ohne Verzögerungen stürzt der Arduino nach etwa 10 Iterationen ab. Mit Verzögerung (10) stürzt es nach etwa 90 Iterationen ab. Mit der Verzögerung (20) kann Arduino einen vollständigen Zyklus fünfmal von Anfang bis Ende wiederholen. Beim 6. Versuch stürzte es erneut ab.

Hier ist mein Code:

#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);
  }
Marcin
quelle
4
Ein naheliegender Test wäre, das Programm ohne angeschlossenes Servo auszuführen. Wenn dies den Absturz verhindert, liegt wahrscheinlich ein elektrisches Rauschen oder eine fehlerhafte Versorgung des Servos vor. Aber wenn es immer noch abstürzt, ist es wahrscheinlich ein Fehler in Ihrem Programm.
Chris Stratton
OK. Also habe ich nachgesehen und ich kann zwei Servos gleichzeitig benutzen. Und ich habe mein Testprogramm ohne Servos ausgeführt und es ist nicht abgestürzt. Also ist es elektrisch ... Ich muss herausfinden, wie ich überprüfen kann, was das Problem ausmacht ... Danke für die Hilfe, Leute.
Marcin
Möglicherweise möchten Sie eine externe Stromversorgung für die Servos prüfen oder sie zumindest nicht über Uno vom USB-Anschluss betreiben.
Chris Stratton
Ich habe tatsächlich 4 AA Bettery eingesteckt und es ist immer noch nicht genug.
Marcin
Ja. 4 Batterie ist genug. Ich musste etwas mit Arduino-Servostiften verschrauben, denn als ich mein Servo an normale 5 V und GND an Bord steckte und an einen normalen digitalen Pin signalisierte, fing es an zu funktionieren! (Natürlich habe ich diese 4 Batterien an ein externes Netzteil am Arduino Morot Shield angeschlossen.)
Marcin

Antworten:

5

Wenn der Arduino nicht zurückgesetzt wird, wenn die Servos nicht angeschlossen sind, ist es wahrscheinlich, dass die Servos viel Strom ziehen und die Batteriespannung so stark abfällt, dass der Arduino zurückgesetzt wird.

Versuchen Sie, zwei separate Akkus zu verwenden: einen zur Stromversorgung des Arduino und einen zur Stromversorgung der Motoren (stellen Sie sicher, dass die Erdung der beiden Akkus miteinander verbunden ist).

Nate
quelle
1

Ergänzung zu Nates Antwort: Wenn Sie eine Batterie sowohl für die Motoren als auch für das Arduino behalten möchten, sollten Sie den von den Servos aufgenommenen Strom durch eine Art Rücklauf begrenzen, bevor Sie die Richtung ändern, z. B. halbe Geschwindigkeit nach 20 ms, 0 U / min danach weitere 20 ms, bevor die Richtung geändert wird. Wenn Sie die Richtung beider Motoren gleichzeitig ändern, sollten Sie einen um beispielsweise 20 ms verzögern, um den Spitzenstrom weiter zu reduzieren.

Bevor Sie dies tun, können Sie die Spannung der Arduino-Versorgung überwachen, vorzugsweise mit einem auf "Single" eingestellten Oszilloskop, das eine Neigung von ~ 4,5 V nach unten auslöst. Das sollte Ihnen sagen, ob die Versorgung des Arduino abfällt, wenn die Motoren die Richtung ändern.

Herr Mystère
quelle
0

Versuchen Sie, die Verzögerungszeit auf 5000 statt auf 20 zu erhöhen, damit die Servos genügend Zeit benötigen, um die Drehung abzuschließen:

#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);
     }
Jimmy Cluter
quelle