Dank der mit der Arduino Entwicklungsumgebung gelieferten Servo Library ist der Anschluss und die Ansteuerung eines Servomotors (Wikipedia) recht einfach.
Alle benötigten Teile gibt es z.B. in diesen Sets:
Ein kleiner Standardservo, wie er zum Beispiel im Modellbau verwendet wird, benötigt neben der Stromversorgung nur einen weiteren Pin als Steuerleitung. Für die Stromversorgung reichen die 5V vom Arduino Board aus. Das Steuersignal, welches den gewünschten Einstellwinkel angibt, wird mit Hilfe der Pulsweitenmodulation (Wikipedia) übertragen. Mit den aktuellen Servo-Librarys kann aber ein beliebiges Pin am Arduino gewählt werden.
An die Steuerleitung wird alle 20 ms ein zwischen 1 und 2 ms langer Puls gesendet, wobei eine Pulsdauer von 1 ms für 0 Grad und 2 ms für 180 Grad Einstellwinkel stehen. Ein Puls von 1.5 ms Länge würde den Servo also auf 90 Grad setzen.
Wie ein Servo intern funktioniert, ist hier ganz gut erklärt:
http://www.electronicsplanet.ch/Roboter/Servo/intern/intern.htm
Der Aufbau der Schaltung:
Im Beispielprojekt koppeln wir die Position des Servos an die Stellung eines Potentiometers.
Dazu wird der Wert des Potentiometers an A5 eingelesen, aus dem Wertebereich von 0-1023 nach 0-180 umgerechnet und als Einstellwinkel an den Servo gesendet. Den komplizierten Teil mit der Umwandlung in ein korrektes PWM-Signal übernimmt dabei glücklicherweise die Arduino Servo Library für uns.
Und hier der Arduino Sketch dafür:
// Servo Library einbinden #include <Servo.h> // Neues Servo Objekt erstellen Servo myservo; // Wert des Potentiometers hier speichern int val; // setup() wird einmal zu Programmbeginn ausgeführt void setup() { // Servo an Pin 9 koppeln myservo.attach(9); // Serielle Kommunikation starten Serial.begin(9600); } // loop() wird endlos wiederholt void loop() { // Stellung des Potentiometers an Anlog-Eingang 5 auslesen val = analogRead(5); // 10-bit Wert des Analogeingangs (0-1023) in Winkel 0-180 umrechnen val = map(val, 0, 1023, 0, 180); // Errechneten Winkel zur Kontrolle an den PC übertragen (Seriellen Monitor starten!) Serial.println(val); // Einstellwinkel in Grad an das Servo-Objekt schicken myservo.write(val); // Kurze Pause, damit der Servo die neue Position anfahren kann delay(50); } |
Das Video zum Projekt gibts hier:
[youtube id=“aAxbp507B9I“]
Habe den Code probiert und er funktioniert perfekt. Jetzt möchte ich den Code erweitern. Ich habe hier einen Tilt Sensor mit dem ich das Servo auf die Nullposition fahren möchte wenn dieser Sensor sich neigt. Also ich kann das Servo von 0-180 Grad steuern und wenn der Sensor sich z.B. 90° neigt schaltet dieser und stellt das Servo sofort zurück auf 0. Es gibt das Poti erst wieder frei wenn der Sensor wieder unter die 90° kommt. Kannst du mir einen Tip geben wie ich den Code erweitern müsste damit das funktioniert?
Hallo Florian,
in der einfachsten Version brauchst du da nur auf das Digitalpin schauen, an dem der Tilt-Sensor hängt und abhängig von dessen Zustand mit einem IF-Statement rund um das myservo.write(val); das Signal an den Servo ändern, also z.B. sowas wie
if (tiltPin == HIGH) { // Tilt Sensor geneigt
myservo.write(0);
}
else { // Tilt Sensor nicht geneigt
myservo.write(val);
}
Der Status vom Tilt Sensor kann auch umgekehrt sein, abhängig von der Anschlussart. Damit wird der Servo beim Tilt immer auf 0 gehalten und im anderen Fall darf er den vom Poti geliefertem Wert ansteuern.
Ich hoffe ich hab deine Frage richtig verstanden und das hilft dir weiter.
lg, Adi
Ist es möglich das Signal auch per Funkmodul (2,4GHz oder 433MHz) an das Servo zu übertragen?
Gruß Moritz
Hallo Adi,
Tolle Anwendung und eine super Erklärung!!! Perfekt für einen blutigen Anfänger, wie mich ;-) Ich würde jetzt gerne den Servo nur von 0° auf 15° auslenken (das war für mich kein Problem), aber dafür ein externes digitales Signal als Schalter verwenden (TTL, 5V). Da ich immer nur zw. 0° und 15° hin- und herschalten möchte brauche ich das Potentiometer dabei wohl nicht. Nach einer Ausrichtung auf 15° soll nach gewissen Zeit (z.B. 500 ms) der Servo dann wieder auf 0° zurückfahren. Ich bräuchte hierfür beim Code und Aufbau ein wenig Hilfestellung. Ich hoffe, mein Problem ist nicht zu trivial!?
LG, Marco
Hallo Marco, wenn du ein externes 5V-Signal hast, dann kannst du das ja direkt an einen Digitalpin des Arduino leiten und in der loop()-Methode des Sketch anstatt des Potentiometer-Wertes auf den Wert des Pins schauen. Sobald sich dieser von 0 auf 1 ändert, fährst du den Servo in die Zielstellung und – falls der Arduino nichts anderes zu tun hat und in der Zwischenzeit keine weiteren Signale verarbeitet werden sollen – nach einem delay(500) wieder zurück auf 0. Einfachste Realisierung wäre ein Sketch wie hier http://www.makerblog.at/2015/01/tilt-sensor-mit-dem-arduino-abfragen/ – nur dass statt der for()-Schleife im Inneren der Servo angesteuert wird. Hilft dir das schon weiter?
wie kann ich zwei kontinuierlich drehende servos ansteuern, sodass sie per tasterdruck links bzw. rechts rum laufen? Servos (Tower Pro 995) 360
Ich wollte 5 servos mit 5 potenriometer ansteuern wie müsste dann der scratch aussehen. Müsste sich ja nicht viel ändern oder?.
Hi, tolle Beschreibung. Ich bin blutiger Anfänger und bei Dir gelandet. Ich möchte für eine Absauganlage sogenannte Blast Gates mit einem Servo öffnen und schließen. Aufbau wäre dabei: 230v-Maschine läuft, servo dreht sich um 180 grad und öffnet dabei den Blast Gate, Maschine aus, 5 sec warten, (da die Absaugung eine Nachlaufverzögerung hat) Servo geht wieder auf 0 Grad und schließt damit das Bladt Gate.
Was bräuchte ich für diesen Aufbau? Wie wäre der Programmierweg und wie löse ich es mit 5 unterschiedlichen Maschinen (Kreissäge, Schleifteller, Bandsäge…), die jeweils einen Impuls geben und jeweils einen Servo benötigen? Brauche ich da entsprechend viele ardoidos oder kann ich das mit einem machen…? Schließlich wäre immer nur eine Maschine in Aktion.
Danke für hilfreiche Tipps. Hoffe, ich konnte den Zweck anschaulich verdeutlichen. Lg Paul
Wie kann ich den Servowert der Nullstellen auslesen und damit ich ihn später wieder auf einen anderen Wert von null aus stellen kann.