In diesem Beitrag möchte ich dir gerne aufzeigen, wie du 360 Grad Servos am Arduino UNO programmierst. Wie du einen normalen Servo welcher sich lediglich um 180 Grad drehen kann, habe ich dir bereits im Beitrag Arduino, Lektion 16: Servo ansteuern aufgezeigt.
Inhaltsverzeichnis
- Aufbau der Schaltung – 360 Grad Servomotor am Arduino UNO
 - Programmieren der Schaltung – steuern eines 360 Grad Servos am Arduino UNO mit Taster
 
Aufbau der Schaltung – 360 Grad Servomotor am Arduino UNO
Der 360° Servomotor weist in Bezug auf die Pinbelegung keine Unterschiede zu einem 180° Servomotor auf. Daher kannst du ihn genauso unkompliziert mit einem Arduino verbinden wie zuvor. Allerdings ist es wichtig zu beachten, dass du keine präzise Winkelsteuerung durchführen kannst. Der Servomotor vollführt vielmehr eine kontinuierliche Drehbewegung in beide Richtungen, ohne die Möglichkeit, einen bestimmten Winkel oder Geschwindigkeit fest einzustellen.
Nachfolgend eine kleine Schaltung, um die Drehrichtung mit Tastern zu manipulieren. Zusätzlich habe ich einen Taster eingebaut (in der Mitte mit einer roten LED), mit welchem man den Servomotor stoppen kann.
Wenn du diese kleine Schaltung nachbauen möchtest, dann benötigst du:
- einen Arduino UNO R3* (inkl. Datenkabel),
 - einen 360° Servomotor*,
 - drei 5 mm LEDs* (2x gelb, 1x rot),
 - drei 220 Ohm Widerstände*,
 - drei Taster für Pintmontage*,
 - diverse Breadboardkabel*,
 - ein 400 Pin Breadboard*
 
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Programmieren der Schaltung – steuern eines 360 Grad Servos am Arduino UNO mit Taster
Das kleine Programm schreiben wir in der Arduino IDE. Diese kannst du dir unter https://www.arduino.cc/en/software/ für Windows, Linux und macOS herunterladen.
Für das Programm benötigen wir zusätzlich die Bibliothek Bounce2. Mit dieser können wir die Taster sehr einfach entprellen und somit verhindern, dass bei einem Tastendruck das Signal mehrfach empfangen und vom Mikrocontroller verarbeitet wird. Wenn du mehr über das entprellen eines Tasters lesen möchtest, dann empfehle ich dir den Beitrag Arduino Lektion 87: Taster entprellen.
Um den Servomotor nach rechts drehen zu lassen, müssen wir diesem einen Wert von > 90 und < 360 zuweisen und um den Servomotor nach links laufen zu lassen von > 1 und < 90. Den Servo stoppen wir, indem wir diesen den Wert 90 zuweisen!
Je größer der Wert ist, desto schneller dreht sich dieser!
//Einbinden der Bibliotheken zum
//ansteuern des Servomotors
#include <Servo.h>
//entprellen der Taster
#include <Bounce2.h>
//Servomotor am digitalen Pin D9 angeschlossen
#define servoPin 9
//Taster für die Drehrichtung Rechts,
//am digitalen Pin D12 angeschlossen
#define tasterRechts 12
//Status LED am digitalen Pin D11 angeschlossen
#define ledRechts 11
//Taster für die Drehrichtung Links,
//am digitalen Pin D4 angeschlossen
#define tasterLinks 4
//Status LED am digitalen Pin D3 angeschlossen
#define ledLinks 3
//Taster für das Stoppen des Servos,
//am digitalen Pin D7 angeschlossen
#define tasterStopp 7
//Status LED am digitalen Pin D6 angeschlossen
#define ledStopp 6
//Objekt für den Servo erzeugen
Servo servo;
//Objekte vom Typ Button für jeden Taster erzeugen
Bounce2::Button btnLinks = Bounce2::Button();
Bounce2::Button btnStopp = Bounce2::Button();
Bounce2::Button btnRechts = Bounce2::Button();
//Konstante für den Intervall der Taster
const int BTN_INTERVAL = 5;
//Konstanten für die Drehrichtungen bzw. Stopp
const int LINKS_DREHEN = 45;
const int STOPP = 92;
const int RECHTS_DREHEN = 135;
void setup() {
  //Beginn der seriellen Kommunikation mit 9600 Baud
  Serial.begin(9600);
  //definieren das die Pins der LEDs als Ausgang dienen
  pinMode(ledLinks, OUTPUT);
  pinMode(ledStopp, OUTPUT);
  pinMode(ledRechts, OUTPUT);
  //verbinden des Servopins mit dem Servoobjekt
  servo.attach(servoPin);
  //Konfigurieren der Buttons
  //Taster werden über den internen 10 kOhm PullUp Widerstand verbunden
  btnLinks.attach(tasterLinks, INPUT_PULLUP);
  btnLinks.interval(BTN_INTERVAL);
  //Wenn der Taster gedrückt wird, dann wird dieses als LOW / 0 Signal ausgewertet.
  btnLinks.setPressedState(LOW);
  btnStopp.attach(tasterStopp, INPUT_PULLUP);
  btnStopp.interval(BTN_INTERVAL);
  btnStopp.setPressedState(LOW);
  btnRechts.attach(tasterRechts, INPUT_PULLUP);
  btnRechts.interval(BTN_INTERVAL);
  btnRechts.setPressedState(LOW);
  //Initial soll der Servomotor in die Stopp Position sein,
  //die rote LED leuchtet.
  setServoPos(STOPP);
}
//Funktion zum setzen einer Servoposition
//über die Position wird die Drehrichtung bestimmt.
void setServoPos(int pos) {
  //aktivieren der entsprechenden LED
  activeLED(pos);
  //setzen der Position
  servo.write(pos);
  //Ausgeben der Servoposition auf der seriellen Schnittstelle
  Serial.println(pos);
}
//Funktion zum aktivieren der Status LED
void activeLED(int pos) {
  int ledPin = -1;
  //prüfen welche Position angesteuert werden soll,
  //zuweisen des Pins der entsprechenden LED
  switch (pos) {
    case LINKS_DREHEN:
      ledPin = ledLinks;
      break;
    case STOPP:
      ledPin = ledStopp;
      break;
    case RECHTS_DREHEN:
      ledPin = ledRechts;
      break;
  }
  //alle LEDs deaktivieren
  digitalWrite(ledLinks, LOW);
  digitalWrite(ledStopp, LOW);
  digitalWrite(ledRechts, LOW);
  //Wenn der Wert der Variable ledPin größer als -1 ist, dann...
  if (ledPin > -1) {
    //aktivieren der LED
    digitalWrite(ledPin, HIGH);
  }
}
void loop() {
  //aktualisieren der Status der Taster
  btnLinks.update();
  btnStopp.update();
  btnRechts.update();
  if (btnLinks.pressed()) { //Wenn der Taster Links betätigt wurde, dann...
    //den Servo nach links drehen lassen
    setServoPos(LINKS_DREHEN);
  } else if (btnStopp.pressed()) { //Wenn der Taster Stopp betätigt wurde, dann...
    //den Servo stoppen
    setServoPos(STOPP);
  } else if (btnRechts.pressed()) { //Wenn der Taster Rechts betätigt wurde, dann...
    //den Servo nach rechts drehen lassen
    setServoPos(RECHTS_DREHEN);
  }
}
Mit diesem Code kannst du nun mit den drei Tastern die Drehrichtung am 360° Servomotor steuern.
Manipulieren der Geschwindigkeit des 360° Servos mit einem Drehpotentiometer
Mit einem 50 kOhm Drehpotentiometer können wir jetzt die Geschwindigkeit des Servomotors manipulieren. Dieser wird an den Arduino UNO über einen analogen Pin sowie 5V & GND angeschlossen.
Um den Servomotor in den Code zu implementieren benötigen wir nur sehr wenig Zeilen Code.
//Drehpotentiometer am analogen Pin A0 angeschlossen
#define drehPoti A0
//Felder zum speichern der berechneten Werte für die Geschwindigkeit des Servomotors
int geschwindigkeitRechts = 0;
int geschwindigkeitLinks = 0;
void setup() {
  ...
  //definieren das der Pin des Drehpotentiometers als Eingang dient
  pinMode(drehPoti, INPUT);
  ...
}
//Funktion zum setzen einer Servoposition
//über die Position wird die Drehrichtung bestimmt.
void setServoPos(int pos) {
  //aktivieren der entsprechenden LED
  activeLED(pos); 
  //Ausgeben der Aktion auf der seriellen Schnittstelle
  //und setzen der Geschwindigkeit des Servomotors  
  Serial.println("Servomotor ");
  if (pos == LINKS_DREHEN){
    Serial.print("links drehen");
    Serial.println("Geschwindigkeit: "+ String(geschwindigkeitLinks, DEC));
    servo.write(geschwindigkeitLinks);
  } else if (pos == RECHTS_DREHEN){
    Serial.print("rechts drehen");
    Serial.println("Geschwindigkeit: " + String(geschwindigkeitRechts, DEC));
    servo.write(geschwindigkeitRechts);
  } else if (pos == STOPP){
    Serial.print("stoppen");
    servo.write(STOPP);
  }
  Serial.println("");
}
void loop() {
  ...
  //Auslesen des aktuellen Wertes des Drehpotentiometers
  int drehPotiValue = analogRead(drehPoti);
  //Mappen des Wertes von 0 bis 1023 auf die Range 1 bis 80
  geschwindigkeitLinks = map(drehPotiValue, 0,1023, 1,80);
  //Mappen des Wertes von 0 bis 1023 auf die Range 100 bis 360
  geschwindigkeitRechts = map(drehPotiValue, 0,1023, 100,360);
  ...
}
Über den Drehpotentiometer können wir nun die Geschwindigkeit recht einfach manipulieren.
Hier nun der gesamte Code zum steuern eines 360° Servomotors mit drei Tastern und der manipulation der Geschwindigkeit mit einem Drehpotentiometer.
//Einbinden der Bibliotheken zum
//ansteuern des Servomotors
#include <Servo.h>
//entprellen der Taster
#include <Bounce2.h>
//Servomotor am digitalen Pin D9 angeschlossen
#define servoPin 9
//Taster für die Drehrichtung Rechts,
//am digitalen Pin D12 angeschlossen
#define tasterRechts 12
//Status LED am digitalen Pin D11 angeschlossen
#define ledRechts 11
//Taster für die Drehrichtung Links,
//am digitalen Pin D4 angeschlossen
#define tasterLinks 4
//Status LED am digitalen Pin D3 angeschlossen
#define ledLinks 3
//Taster für das Stoppen des Servos,
//am digitalen Pin D7 angeschlossen
#define tasterStopp 7
//Status LED am digitalen Pin D6 angeschlossen
#define ledStopp 6
//Drehpotentiometer am analogen Pin A0 angeschlossen
#define drehPoti A0
//Objekt für den Servo erzeugen
Servo servo;
//Objekte vom Typ Button für jeden Taster erzeugen
Bounce2::Button btnLinks = Bounce2::Button();
Bounce2::Button btnStopp = Bounce2::Button();
Bounce2::Button btnRechts = Bounce2::Button();
//Konstante für den Intervall der Taster
const int BTN_INTERVAL = 5;
//Konstanten für die Drehrichtungen bzw. Stopp
const int LINKS_DREHEN = 1;
const int STOPP = 90;
const int RECHTS_DREHEN = 360;
//Felder zum speichern der berechneten Werte für die Geschwindigkeit des Servomotors
int geschwindigkeitRechts = 0;
int geschwindigkeitLinks = 0;
void setup() {
  //Beginn der seriellen Kommunikation mit 9600 Baud
  Serial.begin(9600);
  //definieren das die Pins der LEDs als Ausgang dienen
  pinMode(ledLinks, OUTPUT);
  pinMode(ledStopp, OUTPUT);
  pinMode(ledRechts, OUTPUT);
  //verbinden des Servopins mit dem Servoobjekt
  servo.attach(servoPin);
  //Konfigurieren der Buttons
  //Taster werden über den internen 10 kOhm PullUp Widerstand verbunden
  btnLinks.attach(tasterLinks, INPUT_PULLUP);
  btnLinks.interval(BTN_INTERVAL);
  //Wenn der Taster gedrückt wird, dann wird dieses als LOW / 0 Signal ausgewertet.
  btnLinks.setPressedState(LOW);
  btnStopp.attach(tasterStopp, INPUT_PULLUP);
  btnStopp.interval(BTN_INTERVAL);
  btnStopp.setPressedState(LOW);
  btnRechts.attach(tasterRechts, INPUT_PULLUP);
  btnRechts.interval(BTN_INTERVAL);
  btnRechts.setPressedState(LOW);
  //definieren das der Pin des Drehpotentiometers als Eingang dient
  pinMode(drehPoti, INPUT);
  //Initial soll der Servomotor in die Stopp Position sein,
  //die rote LED leuchtet.
  setServoPos(STOPP);
}
//Funktion zum setzen einer Servoposition
//über die Position wird die Drehrichtung bestimmt.
void setServoPos(int pos) {
  //aktivieren der entsprechenden LED
  activeLED(pos); 
  //Ausgeben der Aktion auf der seriellen Schnittstelle
  //und setzen der Geschwindigkeit des Servomotors  
  Serial.println("Servomotor ");
  if (pos == LINKS_DREHEN){
    Serial.print("links drehen");
    Serial.println("Geschwindigkeit: "+ String(geschwindigkeitLinks, DEC));
    servo.write(geschwindigkeitLinks);
  } else if (pos == RECHTS_DREHEN){
    Serial.print("rechts drehen");
    Serial.println("Geschwindigkeit: " + String(geschwindigkeitRechts, DEC));
    servo.write(geschwindigkeitRechts);
  } else if (pos == STOPP){
    Serial.print("stoppen");
    servo.write(STOPP);
  }
  Serial.println("");
}
//Funktion zum aktivieren der Status LED
void activeLED(int pos) {
  int ledPin = -1;
  //prüfen welche Position angesteuert werden soll,
  //zuweisen des Pins der entsprechenden LED
  switch (pos) {
    case LINKS_DREHEN:
      ledPin = ledLinks;
      break;
    case STOPP:
      ledPin = ledStopp;
      break;
    case RECHTS_DREHEN:
      ledPin = ledRechts;
      break;
  }
  //alle LEDs deaktivieren
  digitalWrite(ledLinks, LOW);
  digitalWrite(ledStopp, LOW);
  digitalWrite(ledRechts, LOW);
  //Wenn der Wert der Variable ledPin größer als -1 ist, dann...
  if (ledPin > -1) {
    //aktivieren der LED
    digitalWrite(ledPin, HIGH);
  }
}
void loop() {
  //aktualisieren der Status der Taster
  btnLinks.update();
  btnStopp.update();
  btnRechts.update();
  //Auslesen des aktuellen Wertes des Drehpotentiometers
  int drehPotiValue = analogRead(drehPoti);
  //Mappen des Wertes von 0 bis 1023 auf die Range 1 bis 80
  geschwindigkeitLinks = map(drehPotiValue, 0,1023, 1,80);
  //Mappen des Wertes von 0 bis 1023 auf die Range 100 bis 360
  geschwindigkeitRechts = map(drehPotiValue, 0,1023, 100,360);
  if (btnLinks.pressed()) { //Wenn der Taster Links betätigt wurde, dann...
    //den Servo nach links drehen lassen
    setServoPos(LINKS_DREHEN);
  } else if (btnStopp.pressed()) { //Wenn der Taster Stopp betätigt wurde, dann...
    //den Servo stoppen
    setServoPos(STOPP);
  } else if (btnRechts.pressed()) { //Wenn der Taster Rechts betätigt wurde, dann...
    //den Servo nach rechts drehen lassen
    setServoPos(RECHTS_DREHEN);
  }
}
Letzte Aktualisierung am: 10. März 2024

