EEZYbot Arm, Teil 2
Die ersten Ansteuerversuche mit den Servos haben stattgefunden (siehe Teil 1). Ich muss gestehen, dass ich mir im Vorfeld keine Gedanken gemacht habe, wie man Servos überhaupt ansteuert. Das Internet muss wieder einmal herhalten um mein Problem zu lösen. Den Roboterarm habe ich noch nicht fertig zusammengebaut, da ich nicht genau weiß, in welchem Drehbereich die Servos nachher den Arm bewegen müssen.

Ich verwende einen alten Arduino Uno R3 für erste Tests mit den Servos. SG90- bzw. MG90-Servos werden über Pulsweitenmodulation (PWM) angesteuert. Dazu gibt man dem Arduino Werte zwischen 0° und 180°, und die Library servo.h setzt das in entsprechende PWN Signale um. Meine Ideen ist es, vor der Montage alle Servos auf eine 90°-Position zu fahren, um dann einen vernünftigen Bewegungsspielraum in beide Richtungen zu haben.
1#include <Servo.h>
2Servo myServo;
3void setup() {
4 myServo.attach(8);
5}
6void loop() {
7 myServo.write(0);
8 delay(3000);
9 myServo.write(90);
10 delay(3000);
11 myServo.write(180);
12 delay(3000);
13}Dazu habe ich mir ein recht statisches Arduino-Sketch gesucht, dass ich für meine Zwecke angepasst habe (Quelle). Das Sketch fährt die drei Winkel 0°, 90° und 180° nacheinander mit maximaler Geschwindigkeit an. Wahrscheinlich muss ich die Drehgeschwindingkeit im eingebauten Zustand später reduzieren, und das Sketch langsam auf den gewünschten Winkel hochzählen lassen. Andernfalls dreht der Servo mit max. Geschwindigkeit, und der Arm hat dafür zuviel Masse. Die Wahrscheinlichkeit ist dann sehr hoch, dass der Servo stirbt.

Ich habe die Teile des Greifers nochmal angepasst und dafür gesorgt, dass alles schön leichtgängig funktioniert. Den kleinen schwarzen Servoarm zum aufschrauben auf die Achse habe ich mit dem blauen Zahnrad verklebt. Das blaue gedruckte Zahnrad verschob sich immer auf der Achse, und blockierte den gesamten Greifermechanismus.
1#include <Servo.h>
2
3Servo myservo; // create servo object to control a servo
4// twelve servo objects can be created on most boards
5
6int pos = 0; // variable to store the servo position
7
8void setup() {
9 myservo.attach(8); // attaches the servo on pin 9 to the servo object
10}
11
12void loop() {
13 for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
14 // in steps of 1 degree
15 myservo.write(pos); // tell servo to go to position in variable 'pos'
16 delay(15); // waits 15ms for the servo to reach the position
17 }
18 for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
19 myservo.write(pos); // tell servo to go to position in variable 'pos'
20 delay(15); // waits 15ms for the servo to reach the position
21 }
22}Das oben abgebildete Sketch bewegt den Servo langsam zwischen den beiden angegebenen Winkeln hin und her (Quelle). Beim Herumexperimentieren mit den Servomotoren ist mir noch eine Kleinigkeit aufgefallen. Die günstigen Servos decken nicht den auf der Verpackung angegebenen Drehwinkel von 180° ab! Meine Servos machen so zwischen 160° und 170° als maximalen Winkel. Zwischen 0° und 90° laufen alle Servos gut.
Ich weiß noch nicht, ob es an der Ansteuerung liegt, oder an den Servos selbst. Dazu sind noch weiter Versuche notwendig. Ich verwende übrigens die MG90 Servos mit Getriebe aus Metall. Ich hoffe sie halten etwas länger…
Meine Idee für die Ansteuerung wäre ein ESP8266, in Form eines Wemos D1 mini. Dieser brächte eine WLAN-Schnittstelle mit, und ich könnte die Steuerung des Roboter Arms eventuell via MQTT machen. Ich denke aber, ich werde erstmal einen Arduino Uno nehmen, und die einzelnen Servos einfach über ein Potentiometer ansteuern. Erst einfach dann schwer. Weiter geht es im nächsten Teil…