Servosteuerung mit Arduino über I2C

Modellbauservos sind in unzähligen Varianten erhältlich und können aufgrund hoher Stückzahlen preiswert angeboten werden. Daher finden Servos in großem Umfang über den Bereich des Modellbaus hinaus in Robotern, Drohnen und anderen Projekten, in denen Bewegungen realisiert werden muss, Verwendung.

Bei zeitkritischen Anwendungen realisieren Serielle Servo Controller die Schnittstelle zwischen einem PC oder einem Microcontroller wie einem Raspberry Pi oder Arduino als Hostrechner und den Modellbauservos. Außerdem spart ein SSC Controller PINs, von denen es ja nie genug geben kann, da mehrere Servos über einen PIN gesteuert werden können.

Die Auswahl des richtigen Servo Controllers hängt von der Anwendung ab. Für kleinere Projekte kommen überwiegend SSC mit einer UART Schnittstelle zum Einsatz.

Für größere Systeme mit mehreren eigenintelligenten Baugruppen (Beispiel Roboter) bietet der I2C Bus der PiKoder/SSC PRO Familie gegenüber einer UART-Verbindung den Vorteil, dass nur zwei Pins des Host-Controllers benötigt werden, um ein gesamtes Netzwerk anzusteuern. Ein einfaches, dem miniSSC sehr ähnliches Protokoll, steuert die einzelnen Servos.

Der I2C Bus bringt weitere Vorteile:

  • die bidirektionale Kommunikation und Konfliktauflösung wird über die vorhandene Buslogik sicher gestellt und
  • die Buslogik ist bereits in der Hardware realisiert, so dass der Rechenzeitbedarf aller Baugruppen für Kommunikationsaufgaben minimal ist.

Mit vorhandenen Baugruppen und fertigen Libraries ist die Ansteuerung einfach zu realisieren. Der folgende Sketch zeigt die Ansteuerung eines Modellbauservos mit dem Arduino über I2C.

// Control of RC servos by I2C with PiKoder/SSC PRO
// For more details on the PiKoder/SSC PRO goto www.pikoder.com
#include Wire.h
int x = 0;
int rc = 0;
void setup() {
  Serial.begin(9600); // Setup of host communication
  Wire.begin(); // Start I2C communication
}

void loop() {
  do { // make sure to sent message
    Serial.print("Servo position = ");
    Serial.print(x);
    Wire.beginTransmission(byte(0x40)); // Address Pikoder/SSC PRO
    Wire.write(byte(0x1)); // Servo @ channel 1
    Wire.write(byte(x)); // Transmit new servo position
    rc = Wire.endTransmission();
    Serial.print(" - Return code: ");
    Serial.println(rc);
    } while (rc != 0);
  x = (x + 20)% 255;
  delay(1000);
}

Weitere Informationen zum PiKoder/SSC PRO wie ein ausführliches USER’s Manual und Schaltungsvorschläge finden Sie auf der PiKoder/SSC PRO Webseite.

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 dem PiKoder/PROBE 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 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.

 

Kalibrator 0 dBm (50 Ω)

 

Für einige meiner Projekte habe ich einen HF Kalibrator benötigt. Bei meinen Recherchen im Internet bin ich auf den Kalibriergenerator von Andreas Lindenau, DL4JAL (www.dl4jal.eu), gestoßen, der eine Schaltung von Thomas Moliere, DL7AV, überarbeitet und auf SMD umgestellt hat. Besonders ansprechend fand ich die Möglichkeit, den HF Pegel mit einem Vielfachmessgerät einzustellen.

Mit den Layout-Daten, die Andreas Lindenau mir freundlicherweise zur Verfügung gestellt hat, konnte ich eine Musterserie Leiterplatten fertigen lassen. Die Beschaffung der Bauteile war ebenfalls kein Problem.

Die Leiterplatte wurde mit Hilfe einer einglöteten und verklebten BNC-Einbaubuchse an der Frontplatte des vorgesehenen Gehäuses befestigt. Zusätzlich habe ich als Einschaltkontrolle noch eine LED mit Konstantstromquelle auf einer Lochrasterplatte eingebaut.

Einbau Frontplatte

Einbau Frontplatte Unterseite

Die folgenden Bilder zeigen das Gerät von vorne und hinten.

Vorderseite Kalibrator

Rückseite Kalibrator

Das Signal macht – im Rahmen meiner Messmöglichkeiten – einen sehr stabilen und guten Eindruck.

Screen Capture

P.S.: Ich habe noch einige Leiterplatten übrig, die ich gerne zu Selbstkosten (5 Euro plus Porto von 1,45 Euro) abgebe. Wenn Sie Interesse haben, dann senden Sie mir bitte eine E-mail (webmaster@makerprojekte.de) oder bestellen Sie direkt über PayPal im Store.

 

Baudrate Bluetooth shield mit Arduino einstellen

Für mein Projekt einer digitalen Bluetooth-Fernsteuerung mit meinem PiKoder Serial Servo Controller auf http://www.pikoder.de/Bluetooth_RC.htm 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, ergab sich die Notwendigkeit zur Änderung der Baudrate.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.

 

Röhrenoszillator mit Obertonquarz

Beim Design eines Röhrenoszillators  mit einem Obertonquarz, der üblicherweise bei Frequenzen > 10 MHz … 15 MHz zum Einsatz kommt, sind zwei wesentliche Punkte zu beachten: Der Quarz ist in Serienresonanz zu betreiben und die maximale Quarzbelastung ist einzuhalten.

Nur im Fall von Serienresonanz ist ein stabiles Arbeiten des gesamten Oszillators gewährleistet. Wie schon das „Quarz 1×1“ von Helmut A. Wuttke in den fünfziger Jahren ausführte, sind für Obertonquarze „Röhrenschaltungen einfacher Art, bei denen nur eine Triode Verwendung findet und der Quarz zwischen Gitter und Masse liegt (Parallelresonanz), .. . abzulehnen. Die Stabilität dieser Schaltungen ist unzureichend. Zudem sind Obertonquarze grundsätzlich auf die Serien-Resonanz-Frequenz abgestimmt; die Frequenz würde also bei solchen Oszillatoren zu hoch liegen.“

Zusätzlich ist die maximale Quarzbelastung zu berücksichtigen, die bei heutigen Quarzausführungen im Bereich von 1 mW liegt. Eine höhere Belastung des Quarzes gefährdet die Frequenzstabilität (Langzeitkonstanz) und kann sogar zur Zerstörung des Quarzes führen. Von daher sind im Schaltungsentwurf geeignete Maßnahmen zur Amplitudenbegrenzung vorzusehen.

Der nachfolgend dargestellte Quarzoszillator mit einer Triode in Gitterbasisschaltung wird den genannten Anforderungen vollständig gerecht.  Durch den Einsatz einer Kombiröhre mit Triode und Pentode kann die erwartungsgemäß kleine Leistung des Oszillators bis auf ca. 50 mW an 50 Ohm erhöht werden.

 

Schaltplan Röhrenoszillator mit Obertonquarz
Schaltplan Röhrenoszillator mit Obertonquarz (für eine vergrößerte Darstellung anklicken)