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.