Servotest

Mit nachfolgendem Testaufbau und Testprogrammen kann die Funktionalität eines Analog-Servos getestet werden.


Testaufbau:

Verwendete Bauteile:

  • 1 Arduino Uno
  • 1 Servo (z.B. Modelcraft RS2 MG/BB)
  • 1 Poti 10 kOhm
  • 1 Netzteil 6 VDC, >1A


Technische Daten des Servos Modelcraft RS2 MG/BB:

Abmessungen: 41 x 20 x 42 mm

Gewicht: 49 g

Lagerart: einfach kugelgelagert

Stellmoment: 31 Ncm (4,8 V) bzw. 35 Ncm (6 V)

Stellzeit für 60 Grad: 0,19 s (4,8 V) bzw. 0,17 s (6 V)


Anschlussbelegung des Servo:

schwarz .... GND

rot ............ VDD (4,8 - 6 V externes Netzteil)

orange ...... Arduino Digitalpin x


Achtung: Für die Stromversorgung des Servos bitte unbedingt ein eigenes Netzteil verwenden. Wird z.B. der hier verwendete Servo mechanisch belastet, zieht er Ströme bis zu 0,8 A, was bei Versorgung über den Arduino zur Überlastung und zur Zerstörung des Arduinos führen kann!!


Testprogramme:

Mit den nachfolgenden Programmen kann die Funktionalität eines Servos getestet und die minimale und maximale Impulszeit für einen Drehwinkel von 0 bis 180 Grad ermittelt werden. Dabei soll der Servo der Drehbewegung des Potentiometers folgen. Die Grundeinstellung für die Impulslänge ist mit einem Bereich von 1000 - 2000 µs (Mikrosekunden) vorgegeben und kann für die unterschiedlichen Servos mit den Variablen "pwmTimeMin" und "pwmTimeMax" angepasst werden. Beim genannten Servo ist z.B. für eine Drehung von 180 Grad eine Einstellung von 560 - 2460 µs erforderlich.

Zur Ansteuerung von Servos gibt es eine Library namens "Servo", die Bestandteil der Arduino-IDE ist. Bei den nachfolgenden Testprogrammen verwende ich diese Library nicht. Dafür nutze ich in Variante 1a für die Erzeugung der PWM-Frequenz (Periodendauer 20 ms) einen Timer-Interrupt, der mit der TimerOne-Library ausgelöst wird und in Variante 2 setze ich zur Interruptauslösung die entsprechenden Bits in den Timer1-Registern.

Einen Link zur TimerOne-Library findet ihr hier: Fremd-Libraries

Die Impulslänge von ca. 500 - 2500 µs wird bei der Variante 1a und 2 mit der Funktion "delayMicroseconds" realisiert, wobei bei einer Taktfrequenz des Uno von 16 MHz die Auflösung der Funktion "delayMicroseconds" 4 µs beträgt. Ist die Drehbewegung des Servos bei einer Impulslänge von 500 - 2500 µs von 0° bis 180°, so beträgt die Winkelauflösung somit 0,36°. Bei einem Arduino mit 8 MHz Taktfrequenz verdoppelt sich die Auflösung, also auf 8 µs, was einer Winkelauflösung von 0,72° entspricht.

Variante 1b nutzt ebenfalls die TimerOne-Library, hier verwende ich allerdings die PWM-Funktion der Library. Nachteile: 

  • PWM mit der TimerOne-Library ist nur mit den Arduino-Uno-Pins 9 und 10 möglich!
  • Die Auflösung der PWM-Impulse beträgt nur ca. 20 µs (Auflösung von 10 Bit (0-1023) bei einer Periodendauer von 20 ms => 20 / 1024 = 19,5 µs). Dadurch ist eine schlechtere Feinjustierung der Servostellung gegenüber den Varianten 1a und 2 gegeben.


Für die Datenausgabe zum Seriellen Monitor habe ich bei der Variante 1b erstmalig die Streaming-Library im Einsatz, mit der die Ausgabe vereinfacht wird. Einen link zur Streaming-Library finder ihr hier: Fremd-Libraries


Achtung: Für die Ansteuerung eines Servos mit Pulsweitenmodulation ist nicht die Standard-Arduino-PWM-Funktion mit "analogWrite" geeignet, da diese beim Uno mit einer PWM-Frequenz von 490 Hz bzw. 980 Hz (Pin 5 und 6) läuft!


Hier geht's weiter zu den Servo-Testprogrammen Variante 1a und 1b, Variante 2 und zur Variante 3

Sowohl die Servo-Library, als auch die gezeigten Testprogramme Variante 1a, 1b und 2 nutzen den Timer1. Da der Timer1 aber auch in anderen Libraries Verwendung findet, kommt es hier bei gleichzeitiger Nutzung zu Timer-Konflikten. Daher habe ich das Testprogramm in der Variante 3 geschrieben, dass für die Servo-Steuerung den Timer2 nutzt.


Hier gehts zum Servotest Attiny und NEU: Modellbahnschranke