Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

Praktischer Einsatz von 360 Grad Servos: Programmierung mit Arduino leicht gemacht

Posted on 22. Januar 202410. März 2024 by Stefan Draeger

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.

Programmieren eines 360° Servomotors mit einem Arduino UNO
Dieses Video auf YouTube ansehen.

Inhaltsverzeichnis

  • Aufbau der Schaltung – 360 Grad Servomotor am Arduino UNO
  • Programmieren der Schaltung – steuern eines 360 Grad Servos am Arduino UNO mit Taster
    • Manipulieren der Geschwindigkeit des 360° Servos mit einem Drehpotentiometer

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.

Schaltung - steuern eines 360 Grad Servos am Arduino UNO mit Taster
Schaltung – steuern eines 360 Grad Servos am Arduino UNO mit Taster

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.

Schaltung - Arduino UNO mit Servomotor, Taster & Drehpotentiometer
Schaltung – Arduino UNO mit Servomotor, Taster & Drehpotentiometer

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);
  }
}

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}