Go Down

Topic: Auflösung der Servo.h Bibliothek ändern (Read 893 times) previous topic - next topic

Ketchup

May 01, 2012, 05:48 pm Last Edit: May 01, 2012, 05:55 pm by Ketchup Reason: 1
Hallo zusammen.

Wie man die Periodendauer der Bibliothek Servo.h ändern kann habe ich Hier gelernt, und Funktioniert für den einen Zweck sehr gut.

Nun bin ich an einer anderen Sache dran und wie das so ist scheitere ich nun wieder an dieser Servo.h Bibliothek.

Ich möchte mit einem Gimbal (Servo an einer Kameraplattform) eine Achse verstellen, was auch Funktioniert.
Sieht in etwa so aus:
Bild

Was ich nun bemerkt habe ist das ich bei der Bibliothek Servo.h nur eine Auflösung von ca.180 habe (Angabe in °).

Bei einen eigenen  (sehr uneleganten) Code habe ich eine Auflösung von ca. 1600.
Das Servo verfährt auch in dieser besseren Auflösung, wenn ich meinen eigenen Code benutze.
Ich habe also wirklich auch in der Praxis die viel bessere mechanische Auflösung.
Nur ist dieser Code alles andere als Professionell.
Darum würde ich gerne die Servo Bibliothek benutzen.

Leider habe ich bis jetzt nicht gefunden was ich an der Bibliothek ändern muss um die Auflösung zu ändern.

Hier noch mein Code:

Code: [Select]
// von Kay
// 1 Mai 2012

// Erzeugen von einem Servosignal an Pin 9 von ~85Hz mit einer Auflösung von ~ 1600
// Einzelne Schritte werden mit ~0.1 Sekunden hoch / runter gezählt
// Ohne Bibliothek und ohne Delay


int Winkel=700;            // Servo Starwinkel ~0°
int Periodendauer=10000;   // Periodendauer 10 millisekunden ~ 85Hz
int x=1;                   // Umschalter High @ Low Pin 9
int y=0;                   // Umschalter Winkel zählen
int Servo=9;               // Servo an Pin 9
unsigned long Zeit;
unsigned long Zeit2;
long Pause = 100000;      // Pause zwischen Änderung Winkel

void setup()
{
 Zeit = micros();
 Zeit2= micros();
 pinMode(Servo,OUTPUT);
}

void loop()
{
if (x == 1)
digitalWrite(Servo,HIGH);
if (x==1&&(micros() - Zeit) >Winkel)  // Erzeugen von einem Impuls für den Winkel
{
 Zeit=micros();
 digitalWrite(Servo,LOW);
 x=0;
 }
 if (x==0&(micros() - Zeit) >Periodendauer) // Erzeugen von ~ 85Hz Periodendauer
 {
   Zeit=micros();
   x=1;
 }
 if (y==0&(micros() - Zeit2)>Pause)  // hochzählen des Winkels
 {
   Winkel=Winkel + 1;
   Zeit2=micros();
 }
 if (y==1&(micros() - Zeit2)>Pause) // runter zählen des Winkels
 {
   Winkel=Winkel - 1;
   Zeit2=micros();
 }
 if (y==0&Winkel>=2300) // Umschalter runter zählen
 y=1;
 if (y==1&Winkel<=700)  // Umschalter hochzählen
 y=0;
}


Ich hoffe hier gibt es Experten die wissen wie man die Servo.h Bibliothek ändern muss.

Gruss Kay

.

Lena

Vieleicht hilft Dir schon dieser Auszug aus der servo.cpp weiter:

Code: [Select]
attach(pin )  - Attaches a servo motor to an i/o pin.
attach(pin, min, max  ) - Attaches to a pin setting min and max values in microseconds
default min is 544, max is 2400 

write()     - Sets the servo angle in degrees.  (invalid angle that is valid as pulse in microseconds is treated as microseconds)
writeMicroseconds() - Sets the servo pulse width in microseconds


Viel feiner wird die Servoelektronik kaum auflösen.

LG Lena
„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher."

Albert Einstein

Ketchup

writeMicroseconds() !

Und schon passt es.
Was mich stresst ist das ich dies nicht gefunden habe und dafür 1 Tag versaut habe.
Ich bin mal sauer auf mich selber!!

Vielen Dank für deine Antwort Lena.

Gruss Kay

uwefed

Da hilft das nächste mal nur nach 2 Stunden eine Pause machen und an etwas anderes denken; dann wieder an den Arduino setzen und meistens gehts dann besser.
Grüße Uwe

Go Up