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