Göra en krypande Robot Zombie med avhuggna ben (18 / 22 steg)
Steg 18: Kod: planering
Översätt rörelse i Servo positioner
Det är lätt att beskriva hur armarna behöver flytta till göra zombot flytta framåt, men hur gör vi konvertera som in i servo rörelser?
Först, kan beskriva hur vi skulle gå framåt om vi var liggande på marken och kunde endast använda våra armar.
- Höja arm från marken
- Förlänga arm så långt fram som möjligt
- Lägre beväpna och ta tag i marken
- Dra oss framlänges (pull arm tillbaka)
Vi kunde göra detta med båda armarna synkroniserad (som simning fjäril) eller med alternativa vapen (som simning crawl).
Jag kommer att arbeta i exemplet med alternativet crawl, du kan enkelt använda samma förfarande att generateother rörelsemönster.
Vänster Arm | Höger Arm |
Upp, drog tillbaka | Sänkt, Extended framåt |
Uppkommit, utsträckt framåt | Sänkt, drog tillbaka |
Sänkt, Extended framåt | Upp, drog tillbaka |
Drog ner tillbaka | Uppkommit, utsträckt framåt |
Det mest logiska sättet jag kunde tänka på att implementera detta i koden var att definiera en serie av "frames" som innehöll alla servon ställning vid ett visst tillfälle. Loopa igenom bildrutorna i en viss takt kommer att ge oss en rörelse animation.
Här funderar jag på att höja/förlängning som "maximum" och sänka/indragning som "minimum".
Frame | Vänster axel | Vänster armbåge | Höger axel | Höger armbåge |
1 | Max | Min | Min | Max |
2 | Max | Max | Min | Min |
3 | Min | Max | Max | Min |
4 | Min | Min | Max | Max |
Bestämma Servo
Innan vi kan skriva koden för att använda våra fancy ny bildruta-för-bildruta-animering, måste vi fastställa minimum och maximum för varje servo. Det finns två viktiga faktorer att överväga
- Det kan vara ett fysiskt hinder. om din mekaniskt montage inte tillåter din servo att slå så långt som din programvara begäranden kan det skada servo.
- Vi måste omsätta "min" och "max" i millisekunder, och dessa är motsatt på vardera sidan av kroppen. Till exempel: axeln servo (sett framifrån) på höger sida måste Vrid medurs för att höja armen, men på vänstra sidan medurs sänker armen.
Jag skrev följande lilla del av kod för att bestämma rörelseintervallet för en servo. Helt enkelt ladda upp den till din arduino och ansluta ett servo till den angivna pin (stift 3 i exemplet).
- Använda en seriell terminal (jag föredrar kitt) att ansluta till Arduino (9600 Baud).
- Tryck på "q" Skicka servo till min (1000 mikrosekunder)
- Tryck på "w" att centrera servo
- Tryck på "e" att skicka servo till max (2000 mikrosekunder)
- Använd ' o ' och 'p' incrememnt eller minska den aktuella positionen av 5 mikrosekunder
- Anteckna hur många mikrosekunder motsvarar indragen och sänkas
- Anteckna hur många mikrosekunder motsvarar extended/upp
När du har bestämt hur många mikrosekunder motsvarar indragen/sänks och extended/höjs, göra samma sak för alla de andra servon.
Jason Suter 2014
Denna exempelkod är offentlig.
#include < Servo.h >
PIN Detaljer
int servoPin = 3;
statisk int minMicros = 1000;
statisk int midMicros = 1500;
statisk int maxMicros = 2000.
Servo servoUnderTest; skapa objekt för att styra en servo servo
int posMicros = 1500; variabel att lagra servo position
void setup()
{
servoUnderTest.attach(servoPin);
Konfigurera seriell port
Serial.BEGIN(9600);
}
void loop()
{
om (Serial.available() > 0) {
char inByte = Serial.read(); inkommande seriell byte
om (inByte == "q") {
posMicros = minMicros;
}
annars om (inByte == "w") {
posMicros = midMicros;
}
annars om (inByte == "e") {
posMicros = maxMicros;
}
annars om (inByte == ' o ') {
posMicros = max(posMicros-5,minMicros);
}
annars om (inByte == "p") {
posMicros = min(posMicros+5,maxMicros);
}
}
rapportera aktuella position
Serial.Print(posMicros);
servoUnderTest.write(posMicros);
}