Servoansteuerung mit der Arduino Servo Library

Genauigkeit der Impulserzeugung

Ich habe mich gefragt, wie genau die Erzeugung der Impulslänge der Arduino Servo Library ist, da in der Beschreibung auf entsprechende Limitations hingewiesen wird:

„Limitations

This library does not stop your interrupts, so millis() will still work and you won’t lose incoming serial data, but a pulse end can be extended by the maximum length of your interrupt handles which can cause a small glitch in the servo position. If you have a large number of servos there will be a slight (1-3 degrees) position distortion in the ones with the lowest angular values.“

Quelle: http://playground.arduino.cc/ComponentLib/Servo

Hierzu habe ich zunächst mit einem Logikanalysator die Impulslängen von 1.000 aufeinanderfolgenden Impulsen im unbelasteten Zustand, also auf dem Arduino wurde nur die Servo Library ausgeführt, gemessen. Bei einer Soll-Impulslänge von 1.500 µs ergibt sich folgende Verteilung der Impulslängen:

Verteilung ohne Last

Die erzeugten Impuls sind zwar etwas zu lang, aber die Streuung ist relativ gering und der Längenunterschied zwischen dem kürzesten und dem längstem Impuls beträgt nur 0,6 µs.

Die Verteilung der Impulslängen ändert sich deutlich, wenn auf dem Arduino weitere Anwendungen ablaufen und so zusätzliche Last erzeugt wird. Im folgenden Beispiel wird parallel zur Impulserzeugung der Programmspeicher eines PIC Controllers mit dem ArdPicProg ausgelesen und über die USB Schnittstelle an einen PC übertragen.

Verteilung mit Last

Wie im Bild sichtbar ist, nimmt damit die Streuung der Impulslängen deutlich zu, da der Arduino immer wieder durch andere Aufgaben abgelenkt wird; der längste Impuls in dieser Messreihe hatte eine Länge von 1.508 µs.

Von daher ist bei einer hohen Anforderung an die Genauigkeit der Impulslänge und einer entsprechenden Prozessorauslastung des Arduino der Einsatz eines intelligenten Servo Controllers anzuraten – zumal davon auszugehen ist, dass sich die Genauigkeit und die Streuung beim Einsatz von mehr als einem Servo weiter verschlechtert.

Baudrate Bluetooth shield mit Arduino einstellen

Im Rahmen der Realisierung meiner digitalen OpenSource Bluetooth-Fernsteuerung  ergab sich die Anforderung zum Einsatz eines Arduino Bluetooth Shield auf der Senderseite. Da dieser Shield defaultmäßig mit 38400 Baud arbeitet, aber mein Controller 9600 Baud benötigt, musste die Baudrate umgestellt werden. Diese Anpassung wollte ich nur mit einem Arduino vornehmen und keine weiteren Hilfsmittel, wie USB-Serial-Adapter einsetzen – zumal der Arduino bereits die benötigten 3,3 V Betriebsspannung für den Shield zur Verfügung stellt. Der einfachste Weg hierzu ist der Einsatz der USB-Schnittstelle des Arduino selber, da bei dieser Schnittstelle die Baudrate über den Arduino Serial Monitor vom Bediener angepasst werden kann.

Um jegliches „Störfeuer“ an den Digitalpins zu vermeiden, wird der Reset-Eingang des Arduino fest mit GND verbunden und der Controller so „still gelegt“.

Danach habe ich den Bluetooth Shield aufgesetzt und die Jumperstellung für RX und TX gemäß dem folgenden Bild vorgenommen.

Jumpereinstellungen
Stellung der Jumper auf dem Bluetooth-Shield

Jetzt wird der Serial Monitor gestartet. Die Baudrate wird auf 38400 eingestellt. Zur Einhaltung des Protokolls ist es außerdem wichtig, dass am Zeilenende sowohl NL als auch CR übertragen werden. Nachdem ich einige leere Zeilen geschickt habe, erschien nach diversen unlesbaren Zeichen die Meldung „ERROR“.

Screenshot 1
Screen Shot: Beginn der Programmierung

Nun wird die Programmierung durch die Übertragung einer weiteren leeren Zeile (entsprechend NL und CR) gestartet und das Kommando zur Umstellung der Baudrate auf 9600 eingegeben.

Screen Shot 2
Screen Shot 2: Eingabe des Kommandos zur Baudratenumstellung

Nach dem Senden wird die erfolgreiche Ausführung mit „OK“ quittiert Die folgenden Statusmeldungen werden mit der neuen Baudrate 9600 ausgegeben und sind daher hier nicht zu lesen.

Screen Shot 3
Screen Shot 3: Quittierung der neuen Baudrate

Zur Überprüfung kann die Baudrate am Serial Monitor nun auf 9600 umgestellt werden. Nach einem Reset des Arduino wird dann ein Kommando eingegeben – ich habe die Baudrate einfach nochmal auf 9600 gestellt – und der Shield meldet sich nun mit einer lesbaren Statusmeldung.

Screen Shot 4
Screen Shot 4: Prüfung der Programmierung mit neuer Baudrate

Damit ist die Programmierung abgeschlossen.