4 Stimmen

Den Arduino-Servo anbringen, ohne ihn zu bewegen

Ich verwende die Arduino ServoTimer2 Bibliothek (weil ich auch die VirtualWire Bibliothek im selben Sketch verwenden muss. Ich weiß nicht, ob dieses Problem auch in der regulären Servo Bibliothek besteht, aber ich dachte, es sei erwähnenswert.

Jedes Mal, wenn ich servo.attach(pin) aufrufe, bewegt sich der Servo von seiner aktuellen Position auf die genaue Mitte seines Bereichs (1500 Mikrosekunden). Das ist ein Problem, weil mein Arduino den Servo regelmäßig an- und abkoppeln muss und das Zurücksetzen auf die Mitte den Zweck meines Projekts zunichte macht.

Ich habe gelesen, dass der Aufruf von servo.write(xxxx) direkt vor servo.attach(pin) dazu führen würde, dass er auf xxxx anstatt 1500 zurückgesetzt wird, aber das scheint bei mir nicht zu funktionieren (und ich verstehe auch nicht einmal, wie das funktionieren würde, wenn der Pin nicht angeschlossen ist ...). Irgendwelche Ideen?

*

Bearbeiten: Meine Lösung

Dank djUniversals Antwort habe ich es geschafft, dass sich der Servo bei der Anbindung nicht bewegt. Falls jemand anders dasselbe tun möchte, habe ich einfach die ersten 3 Zeilen der initISR Methode in ServoTimer2.cpp auskommentiert. Es sieht jetzt so aus:

static void initISR()
{
//    for(uint8_t i=1; i <= NBR_CHANNELS; i++) {  // Kanäle beginnen bei 1
//        writeChan(i, DEFAULT_PULSE_WIDTH);  // speichere Standardwerte
//    }
    servos[FRAME_SYNC_INDEX].counter = FRAME_SYNC_DELAY;   // speichere die Frame-Synchronisationsperiode

    Kanal = 0;  // lösche den Kanalindex
    ISRCount = 0;  // lösche den Wert des ISR-Zählers

    /* Einrichtung für Timer 2 */
    TIMSK2 = 0;  // Unterbrechungen deaktivieren
    TCCR2A = 0;  // normaler Zählmodus
    TCCR2B = _BV(CS21); // Vorteiler von 8 setzen
    TCNT2 = 0;     // Timer2-Zähler löschen
    TIFR2 = _BV(TOV2);  // ausstehende Unterbrechungen löschen
    TIMSK2 =  _BV(TOIE2) ; // den Überlaufunterbrechung aktivieren

    isStarted = true;  // Flag, um anzuzeigen, dass dieser Initialisierungscode ausgeführt wurde
}

Sobald ich das gemacht habe und neu kompiliert habe, hat sich der Servo sofort nicht mehr bewegt, als er angebunden wurde, und bewegt sich jetzt nur noch, wenn er angesteuert wird.

2voto

djUniversal Punkte 624

Der ServoTimer2 definiert einen Startimpuls mit:

#define DEFAULT_PULSE_WIDTH  1500

in der .h Datei. Jedes Mal, wenn das Servo-Objekt initialisiert wird, wird dies als Ausgangspunkt für den Kanal verwendet. Die reguläre Servo-Bibliothek hat den gleichen Mechanismus.

Wenn Sie das tun möchten, was Sie zu tun versuchen, müssten Sie die Bibliotheksdateien entsprechend anpassen, da dies sonst nicht möglich ist.

Warum müssen Sie die Servos immer abkoppeln? Gibt es etwas, das Sie dort ändern können?

0voto

Riffer Punkte 31

Um vollständig zu sein, für die Standard-Servo-Bibliothek funktioniert es, den Servo mit dem vorherigen Wert (aus dem EEPROM) zu initialisieren und den Pin danach anzuhängen:

// Servo auf die gespeicherte Position setzen!
servo_9.write(pos);
// Pin nach der Positionseinstellung anhängen, um von der vorherigen Position aus neu zu starten
servo_9.attach(9);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X