Stap 18: Code: Planning
Translate beweging in Servo posities
Het is gemakkelijk om te beschrijven hoe de wapens nodig om naar de zombot verplaatsen maken stuurt, maar hoe we dat omzetten in servo bewegingen?
Ten eerste, kunt beschrijven hoe we verder vooruit als we waren liggend op de grond en kon alleen gebruiken onze armen zou gaan.
- Verhogen van de arm van de grond
- Arm zo ver naar voren als we kunnen uitbreiden
- Lager arm en pak de grond
- Trek zelf vooruit (pull arm terug)
We kunnen dit doen met beide armen gesynchroniseerd (zoals zwemmen dagvlinder) of met alternatieve armen (zoals crawl zwemmen).
Ik zal werken in het voorbeeld met de crawl-optie, kunt u gemakkelijk gebruiken dezelfde procedure generateother patronen van beweging.
Arm links | Rechter Arm |
Verhoogd, getrokken terug | Verlaagd, uitgebreid naar voren |
Aan de orde gesteld, uitgebreid naar voren | Verlaagd, trok zich terug |
Verlaagd, uitgebreid naar voren | Verhoogd, getrokken terug |
Naar beneden trok zich terug | Aan de orde gesteld, uitgebreid naar voren |
De meest logische manier die ik bedenken kon om dit te implementeren in code moest een aantal "frames" die de positie van alle de servo's op een gegeven moment te definiëren. Doorlopen van de frames in een bepaald tempo geeft ons een animatie van de beweging.
Ik overweeg hier verhogen/uitbreiding als "maximum" en verlagen/intrekken als "minimum".
Frame | Links van de schouder | Links van de elleboog | Rechterschouder | Rechter elleboog |
1 | Max | Min | Min | Max |
2 | Max | Max | Min | Min |
3 | Min | Max | Max | Min |
4 | Min | Min | Max | Max |
Servo grenzen te bepalen
Voordat we code schrijven kunnen om te gebruiken van onze mooie nieuwe frame-voor-frame animatie, moeten we bepalen de minimum en maximum voor elke servo. Er zijn twee belangrijke factoren te overwegen
- Kan er een fysieke obstructie. Als uw mechanische assemblage staat niet toe dat uw servo te schakelen zoveel uw software aanvragen kan het schadelijk zijn voor de servo.
- We moeten "min" en "max" omgezet in milliseconden, en dit zijn de tegenovergestelde aan beide zijden van het lichaam. Bijvoorbeeld: de servo van de schouder (zoek van de voorkant) aan de rechterkant moet Draai rechtsom om de arm, maar op de linkerhand de kant met de klok mee de arm zal verlagen.
Ik schreef het volgende kleine stukje code om te bepalen van het bereik van de beweging van een servo. Gewoon uploaden naar je arduino en sluit een servo naar de opgegeven pin (pin 3 in het voorbeeld).
- Gebruik een seriële terminal (ik liever putty) verbinden met de Arduino (9600 Baud).
- Druk op 'q' verzenden van de servo naar min (1000 microseconden)
- Druk op 'w' naar het midden van de servo
- Druk op 'e' voor het verzenden van de servo naar max (2000 microseconden)
- Gebruik ' o ' en 'p' incrememnt of decrement de huidige positie door 5 microseconden
- Noteer hoeveel microseconden ingetrokken/verlaagd correspondeert
- Noteer hoeveel microseconden verlengd/verhoogd correspondeert
Zodra u hebt bepaald hoeveel microseconden overeenkomen met ingetrokken/verlaagd en verlengd/verhoogd, doe hetzelfde voor de andere servo's.
// 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); }