2016-06-21 8 views
0

Ich habe an einem Projekt gearbeitet, bei dem ich Servomotoren anhand von Daten steuern muss, die auf einer SD-Karte gespeichert sind. Bis jetzt läuft es gut, aber ich habe Probleme mit der Steuerung des Timings und der Geschwindigkeit der Servomotorbewegungen. Ich werde erklären, was ich zu erreichen versuche und ein Beispielcode.Arduino Servomotorsteuerung mit SD-Karten-Daten

Ich benutze ein Arduino Mega mit einem SD-Modul daran angeschlossen. Auf der SD-Karte habe ich vier verschiedene .txt-Dateien. Jede Datei enthält 30 ganzzahlige Werte, jede Zeile enthält eine einzelne ganze Zahl und wird mit einem (,) abgeschlossen. Dies sind lediglich Testdaten, so dass ich eine Reihe von Winkeln durchgehen kann, um zu überprüfen, ob ich die Werte gut lese und umwandle. Aber wenn ich versuche, die Servos mit Timern, Verzögerungen usw. zu verlangsamen, beschleunigt es den Code, als ob sie da wären. In meinem Fall sieht der Code wie folgt aus:

string dataRead ="";     // String object to read bytes from 
unsigned long int motorTime = 250; // Refresh time of the motor (250 ms)  
unsigned long int lastMotor = (long) micros(); 
while (entry.available()) {   // While there are bytes in the file to be read 
    dataRead = entry.readStringUntil(','); 
    while((long) micros() - lastMotor <= (motorTime * 1000)); // Do nothing until refresh time has elapsed 

    myServo.write(dataRead.toInt()); 
    lastMotor = (long) micros(); 
} 

Die Daten werden gelesen fein und der Motor bewegt sich nach den Daten, aber das Timing-Code erscheint nur aus irgendeinem Grund negiert zu werden. Ich vermute, dass dies daran liegt, dass unter allen Abstraktionsschichten in der Arduino-IDE alle Arten von Hardware-Funktionen aktiviert und deaktiviert werden und die Verzögerung aus irgendeinem Grund negiert wird.

Hat jemand Erfahrung damit? Irgendwelche Tipps, um ein Servo mit einer vorgegebenen Geschwindigkeit zu fahren? Meine alternative Lösung besteht darin, die Daten in ein Array zu laden; aber ich möchte nicht das Risiko eingehen, den ganzen RAM durchzubrennen und andere Probleme zu verursachen.

Vielen Dank im Voraus!

Antwort

0

Ich reparierte es am Ende. Ich habe Interrupts deaktiviert, als ich die Daten gelesen habe und das mit den Timer-Funktionen wie micros() und millis() verstimmt war; Sie verlassen sich auf Interrupts, um die verstrichene Zeit zu verfolgen. Es ist wahrscheinlich sinnvoller, die Interrupt-Service-Routinen abzutrennen, anstatt sie standardmäßig zu deaktivieren.