Arduino, Tipps, Servos
Tipps zu Servos am Arduino



Je nach Hersteller können die Kabelfarben abweichen. Gebräuchlich sind die Kombinationen Braun-Rot-Orange (GND, Plus, Daten) oder Schwarz-Rot-Gelb (GND, Plus, Daten).



Zur Ansteuerung eines Servos kann man die entsprechende Library verwenden - flexibler ist man jedoch, wenn man selbst programmiert.
Ein Servo erhält an seinem Datenpin einen HIGH-Impuls, der alle 20 Millisekunden wiederholt wird. (Zumindest solange, bis das Servo seine Position erreicht hat.) Die Dauer dieses Pulses bestimmt die Position des Servos. Gebräuchlich sind Pulsdauern von 500 bis 2500 Microsekunden für Winkel von 0 bis 180 Grad aber es gibt auch Servos, die auf Pulsdauern zwischen 1000 und 2000 Microsekunden reagieren. Im Zweifel hilft hier nur probieren.
Ein Servo fährt normalerweise seine Position sehr schnell an. Will man z.B. mit einem Servo eine Bahnschranke bewegen und gibt nur die Positionen "auf" und "zu" an das Servo aus, so wird die Bahnschranke sich schlagartig bewegen.
Hier der Programmcode dafür:
// Die Portnummer ist beliebig
byte dataPort=5; // Port D5

// weitere Definitionen von Variablen
// ....

void setup(){
pinMode(dataPort,OUTPUT);
// weitere Ports
// ....
}

void loop(){
schrankeAuf();
delay(3000);
schrankeZu();
delay(3000);
}

void schrankeAuf(){
for(byte i=0;i<20;i++){
digitalWrite(dataPort,HIGH);
delayMicroseconds(1000);
digitalWrite(dataPort,LOW);
delayMicroseconds(19000);
}
}

void schrankeZu(){
for(byte i=0;i<20;i++){
digitalWrite(dataPort,HIGH);
delayMicroseconds(2000);
digitalWrite(dataPort,LOW);
delayMicroseconds(18000);
}
}

Die Servobefehle werden jeweils 20-mal gesendet - in dieser Zeit muss das Servo seine Position erreicht haben.
Wie gesagt, dieses Programm ist für eine Bahnschranke nicht brauchbar. Für eine andere Bewegung, wo schnell zwischen zwei Zuständen gewechselt werden soll, jedoch schon.



Da wir selbst programmieren, können wir die Servobewegung verlangsamen. Wir geben nicht die Endposition an das Servo sondern lassen es auch die Zwischenschritte anfahren.
Hier der Programmcode dafür:
Änderungen zum vorigen Programm sind blau.
// Die Portnummer ist beliebig
byte dataPort=5; // Port D5

// weitere Definitionen von Variablen
unsigned int servoHIGH, servoLOW;
// ....

void setup(){
pinMode(dataPort,OUTPUT);
// weitere Ports
// ....
}

void loop(){
schrankeAuf();
delay(3000);
schrankeZu();
delay(3000);
}

void schrankeAuf(){
for(int i=0;i<1000;i++){
if(servoHIGH > 1000) servoHIGH--; //Zahl an Schrankenposition anpassen
servoLOW = 20000 - servoHIGH;
digitalWrite(dataPort,HIGH);
delayMicroseconds(servoHIGH);
digitalWrite(dataPort,LOW);
delayMicroseconds(servoLOW);
}
}

void schrankeZu(){
for(int i=0;i<1000;i++){
if(servoHIGH < 2000) servoHIGH++; //Zahl an Schrankenposition anpassen
servoLOW = 20000 - servoHIGH;
digitalWrite(dataPort,HIGH);
delayMicroseconds(servoHIGH);
digitalWrite(dataPort,LOW);
delayMicroseconds(servoLOW);
}
}

Die Schranke wird sich jetzt relativ langsam bewegen, da wir das Servo nicht schlagartig auf den Endwert setzen sondern jeden einzelnen Zwischenschritt senden - und jeder Schritt dauert 20 Millisekunden. Soll die Bewegung schneller werden, so kann anstatt "servoHIGH--" auch "servoHIGH = servoHIGH - 2" oder "- 3" usw. geschrieben werden. Dann kann auch die Grenze der Laufvariablen (im Beispiel 1000) der for-Schleife entsprechend verkleinert werden. Analog natürlich auch bei "servoHIGH++". (Die Schreibweise kann auch mit "servoHIGH += 2" abgekürzt werden.) So kann auch beim Öffnen und Schließen eine verschiedene Geschwindigkeit eingestellt werden.
Da die meisten Servos ein leichtes Schwanken der Pulsfrequenz tolerieren, kann man sich die Variable "servoLOW" auch sparen, dann entfällt in den for-Schleifen jeweils die Zeile "servoLOW = 20000 - servoHIGH" und anstatt der Zeile "delayMicroseconds(servoLOW)" steht "delayMicroseconds(19000)" oder gleich "delay(19)". Dadurch wird die Ausführung geringfügig schneller.
Bei manchen Servos kann es sein, daß die Ausgabegeschwindigkeit des Prozessors schneller als die Servobewegung ist, dann kann man in der for-Schleife die Ausgabe des Pulses wiederholen. (Die Geschwindigkeit des Servos nimmt dann ab.) Weiter kann man zur Sicherheit nach der for-Schleife weitere Pulse mit der Endposition ausgeben.
Die Zahlenwerte "1000" und "2000" in den for-Schleifen müssen an die jeweilige Situation angepasst werden, sie hängen vom Servo und vom mechanischen Aufbau ab. Komfortabler wäre es, wenn diese Werte durch Versuch ermittelt und im EPROM gespeichert würden, wie z.B. in diesem Beispiel.
Bei diesen Programmbeispielen ist zu beachten, daß während der Servobewegung der Prozessor keine anderen Aufgaben erledigen kann, da mit delay gearbeitet wird. Soll also während der Servobewegung auch noch ein Blinklicht blinken, muß mit Timern gearbeitet werden.