Schritt 18: Code: Planung
Bewegung in Servo-Positionen zu übersetzen
Es ist leicht zu beschreiben, wie die Arme bewegen sich um die Zombot bewegen machen müssen nach vorne, aber wie wir das in Servo Bewegungen umwandeln?
Zunächst können Sie beschreiben, wie wir uns bewegen würden, dass vorwärts wenn wir auf dem Boden lagen und nur konnte unsere Arme zu benutzen.
- Arm aus dem Boden zu erhöhen
- Erweitern Sie Arm so weit vorne wie möglich
- Unteren arm und schnappen Sie sich den Boden
- Ziehen Sie uns nach vorn (Pull Arm zurück)
Wir konnten dies mit beiden Armen (wie Schwimmen Schmetterling) synchronisiert oder mit anderen Armen (wie Crawl Schwimmen) tun.
Ich werde daran arbeiten, das Beispiel mit der Crawl-Option, können Sie leicht das gleiche Verfahren zur Generateother Bewegungsmuster.
Den linken Arm | Rechter Arm |
Aufgewachsen, zog zurück | Gesenkt, verlängert sich nach vorne |
Angehoben, nach vorne verlängert | Senkte, zog sich zurück |
Gesenkt, verlängert sich nach vorne | Aufgewachsen, zog zurück |
Wieder nach unten gezogen | Angehoben, nach vorne verlängert |
Der logischste Weg, was, dem ich denken konnte dies in Code implementiert, war, eine Reihe von "Frames" enthielt die Position der Servos zu einem bestimmten Zeitpunkt zu definieren. Durchlaufen die Frames mit einer bestimmten Rate geben uns eine Bewegung Animation.
Ich überlege hier Erhöhung/Erweiterung als "Maximum" und als "Minimum" Senkung/einfahren.
Frame | Linke Schulter | Ellenbogen links | Rechte Schulter | Rechten Ellbogen |
1 | Max | Min | Min | Max |
2 | Max | Max | Min | Min |
3 | Min | Max | Max | Min |
4 | Min | Min | Max | Max |
Servo-Grenzen zu bestimmen
Bevor Sie schreiben Code, um unsere Phantasie neue Frame-by-Frame-Animation verwenden können, müssen wir die minimale und maximale für jedes Servo zu bestimmen. Es gibt zwei wichtige Faktoren zu berücksichtigen
- Gäbe es eine körperliche Behinderung. Wenn Ihre mechanische Montage nicht ist Ihre Servo möglich, soweit Ihre Softwareanfragen zu machen kann das Servo beschädigt werden.
- Wir müssen "min" und "max" in Millisekunden zu übersetzen, und diese sind gegenüber auf beiden Seiten des Körpers. Zum Beispiel: die Schulter-Servo (Blick von vorne) auf der rechten Seite drehen im Uhrzeigersinn, um den Arm zu heben muss, aber auf der linken Seite im Uhrzeigersinn senken Sie den Arm.
Ich schrieb das folgende kleine Stück Code, um die Bewegungsfreiheit eines Servos festzustellen. Einfach laden Sie sie auf Ihrem Arduino und schließen Sie einen Servo an die angegebene Pin (Pin 3 im Beispiel).
- Verwenden Sie einen seriellen Anschluss (Ich bevorzuge Kitt) Verbindung mit dem Arduino (9600 Baud).
- Taste "Q" das Servo an min (1000 Mikrosekunden) senden
- Taste "w", um das Servo zu zentrieren
- Taste "e", das Servo (2000 Mikrosekunden) Max senden
- Verwendung ' o ' und 'p' Incrememnt oder Dekrement der aktuellen Position von 5 Mikrosekunden
- Notieren Sie sich wie viele Mikrosekunden zurückgezogen/gesenkt entsprechen
- Notieren Sie sich wie viele Mikrosekunden erweitert/angehoben entsprechen
Sobald Sie festgestellt haben, wie viele Mikrosekunden entsprechen zurückgezogen/gesenkt und erweitert/erhöht, gehen Sie genauso für alle anderen Servos.
// By Jason Suter 2014 // This example code is in the public domain. #include <Servo.h> //pin details int servoPin = 3; static int minMicros = 1000; static int midMicros = 1500; static int maxMicros = 2000; Servo servoUnderTest; // create servo object to control a servo int posMicros = 1500; // variable to store the servo position void setup() { servoUnderTest.attach(servoPin); //configure serial port Serial.begin(9600); } void loop() { if (Serial.available() > 0) { char inByte = Serial.read();; //incoming serial byte if (inByte == 'q') { posMicros = minMicros; } else if (inByte == 'w') { posMicros = midMicros; } else if (inByte == 'e') { posMicros = maxMicros; } else if (inByte == 'o') { posMicros = max(posMicros-5,minMicros); } else if (inByte == 'p') { posMicros = min(posMicros+5,maxMicros); } } //report current position Serial.print(posMicros); servoUnderTest.write(posMicros); }