Wenn man sich die PWM Signale der normalen Servo Bibliothek anschaut, sieht man, dass die Puls-weite zwischen ca. 500 μs und 2300 μs variiert. Das bedeutet, dass man mit Hilfe der SoftPWMServo Bibliothek die Position eines Servos in Zehntel-Grad ansteuern kann. Da die Bibliothek aber in der Voreinstellung die Puls-weite auf 2 ms begrenzt, muss man diese Werte anpassen. Der zugehörige Code sieht so aus:
const uint8_t LEFT=0; const uint8_t RIGHT=1; uint8_t nP[2][8] = {{ 0,17, 9,10,11,12,13,14},{18,17, 1, 2, 3, 6, 7, 8}}; const int Smax=1800; const int Smin=500; #include <SoftPWMServo.h> int pos = 0; const int pin = nP[RIGHT][7]; // Choose _any_ pin number on your board void setup() { SoftPWMServoInit(); SoftPWMServoSetFrameTime(100000); // 2500 us are 100000 tics for 40 MHz CPU! SoftPWMServoSetServoFrames(8); // 8 frames make 20 ms wavelength } void loop() { for (pos=0; pos <= 1800; pos+=2) // use deci-degree in 0.2 degree steps { SetServoPos_decidegree(pos); delay(5); } for (pos=0; pos <= 1800; pos+=2) // use deci-degree in 0.2 degree steps { SetServoPos_decidegree(1800-pos); delay(5); } for (pos=0; pos <= 180; pos++) // use degree in 1 degree steps { SetServoPos_degree(pos); delay(25); } for (pos=0; pos <= 180; pos++) // use degree in 1 degree steps { SetServoPos_degree(180-pos); delay(25); } SetServoPos_degree(90); delay(1000); SetServoPos_degree(180); delay(1000); SetServoPos_degree(0); delay(1000); } void SetServoPos_degree(int degree) { SoftPWMServoServoWrite(pin, 10*degree+Smin); } void SetServoPos_decidegree(int decidegree) { SoftPWMServoServoWrite(pin, decidegree+Smin); }
Der Code fährt einmal den Servo von 0 bis 180 Grad in 0.2 Grad Schritten und dann wieder zurück, danach die gleiche Aktion aber in Gradschritten. Zum Schluss werden die Positionen 90°, 180° und 0° für je eine Sekunde angefahren.