Göra en krypande Robot Zombie med avhuggna ben (19 / 22 steg)

Steg 19: Kod: krypa



Arduino verktyg och kunskap för stiftelsen

Om du letar efter en bra introduktion till Arduinos, då det är en hel del av Instructables för dig, här är en stor en.

Jag ska anta att du har laddat ner och installera Arduino IDE och kan ladda upp koden till din Arduino, den tidigare nämnda instructable kommer att guida dig genom allt detta och mycket mer.

Kodöversikt

I föregående steg beslutade vi att vi skulle genomföra genomsökning av cykling genom "ramar" av animation som skulle definiera var och en av servon vid en viss position i tid.

Den fullständiga koden är ansluten som en fil, men jag kommer gå igenom de flesta avdelningar här så att du kan förstå dem. Om du redan förstår dem, är detta bra, eftersom du kan förmodligen komma på ett bättre sätt att göra detta som jag gjorde.

Importera krävs bibliotek

Det enda bibliotek som krävs för denna koden är "Servo.h" som är full av praktiska funktioner som gör det extremt enkelt att kontrollera servon från en Arduino.

#include < Servo.h >

Definiera globala variabler

Detta är variabler som kan nås från någonstans i koden. Vi använder dem för att lagra information som kommer att krävas i ett senare skede

Timer variabler

Kommandot millis() returnerar antalet millisekunder sedan Arduino styrelsen började köra nuvarande program. Vi kan lagra resultatet av millis() och sedan jämföra den till resultatet i ett senare skede bestämma hur länge det har funnits mellan de två samtalen.

lång previousFrameMillis = 0;
lång previousInterpolationMillis = 0;

Servo ingående variabler

Dessa variabler lagra vilken pin varje servo är ansluten till, samt hur många micros motsvarar min (indragen eller nedsänkta) och max (upp/extended)

servo pins
int LNpin = 7. vänstra hals muskel
int RNpin = 6; rätt hals muskel
int LSpin = 5; vänster axel
int LEpin = 4; vänster armbåge
int RSpin = 2; höger axel
int REpin = 3; höger armbåge

dessa är de 'min' och 'max' vinklar för varje servo
kan inverteras för servon i motsatt riktning
int LSMin = 1000;
int LSMax = 1700;

int RSMin = 2000.
int RSMax = 1300;

int LEMin = 1700;
int LEMax = 1300;

int REMin = 1300;
int ordet REMax = 1700;

int LNMin = 1400;
int LNMax = 1600;

int RNMin = 1600;
int RNMax = 1400;

Ramar

Sin första intryck kan vara att vi precis som servon till de position som har definierats av den första bildrutan, vänta en viss fördröjning (frameDuration) och sedan ange servon till nästa position.

Detta kommer att resultera i en hemsk animering dock eftersom servon kommer att hoppa så snabbt som möjligt till den angivna position och sedan vänta där på deras nästa instruktion.

Sättet runt detta är att interpolera mellan ramar. Med andra ord, om min ram längd är 2 sekunder, vill efter 1,75 sekunder jag servon till vara tre fjärdedelar (eller 75%) väg mellan bildruta 1 och bild 2.

Det är lite triviala av matematik att räkna ut där servo bör vara om vi vet hur mycket av ramen har förflutit som förhållande. Ord är det bara (föregående ram) +(the difference between the next and previous frames) * (andelen ram varaktighet förflutit), detta är känt som "linjär interpolation".

int frameDuration = 800; längden på en bildruta i millisekunder
int frameElapsed = 0; räknaren millisekunder av denna ram som har förflutit
int interpolationDuration = 30. antalet millisekunder mellan interpolation steg

Här definierar vi de faktiska ramarna. Obs att jag använt 0-1000, där 0 anger indragen och sänkas och 1000 anger extended/upp. Jag kunde valt något nummer, och det kan väl vara mer logiskt val, men intervallet gav mig en tillfredsställande kompromiss mellan upplösning och läsbarhet.

Vi kommer att använda funktionen map() senare till karta 0 till LSMin variabel och 1000 till LSMax variabel som vi definierat tidigare (självklart detta exemplet är för vänster axel, men det skulle vara samma process för alla de andra servon).

Om du vill definiera mer komplexa eller mjukare animeringar kan du enkelt lägga till fler bilder och också använda siffror än min/max. Ett alternativ skulle vara att använda ca 8 ramar för att göra en trevlig elliptisk rörelse.

ramar för den krypande gångarten lagras här
int currentFrameIndex = 0;
int numFrames = 4;
int crawlGaitRS [] = {0,1000,1000,0}.
int crawlGaitRE [] = {0,0,1000,1000}.
int crawlGaitLE [] = {1000,0,0,1000}.
int crawlGaitLS [] = {0,0,1000,1000}.
int crawlGaitLN [] = {1000,1000,0,1000}.
int crawlGaitRN [] = {0,1000,1000,1000}.

För att genomföra denna interpolation beräkning måste vi hålla reda på den föregående bildrutan och följande ram, så vi satt upp vissa variabler till gör så pass.

servo sista bildruta micros
int LSlast = 0;
int RSlast = 0;
int LElast = 0;
int RElast = 0;
int LNlast = 0;
int RNlast = 0;

servo nästa bildruta micros
int LSnext = 0;
int RSnext = 0;
int LEnext = 0;
int REnext = 0;
int LNnext = 0;
int RNnext = 0;

variabeln som används för att lagra den aktuella bildrutan i animeringen
int currentFrameIndex = 0;

Servo objekt

Slutligen, vi skapar vissa servo objekt och tilldela dem till variabler. Dessa är förekomster av klassen servo som vi ingår i Servo.h och kommer att ge användbara funktioner för att styra varje servo.

skapa servo objekt för att kontrollera servon
Servo LS;
Servo RS;
Servo LE;
Servo RE;
Servo LN;
Servo RN;

Definiera funktioner

Arduino Setup-funktionen

Arduino setup() funktion är den första lite kod som får köra efter de globala variablerna har definierats. Allt som behövs här för nu är att koppla servo objekt till deras stift och starta upp den seriella porten, om vi vill rapportera något för debuggging.

void setup()
{
Serial.BEGIN(9600);
LS.attach(LSpin);
RS.attach(RSpin);
LE.attach(LEpin);
RE.attach(REpin);
LN.attach(LNpin);
RN.attach(RNpin);
}

Ange nästa bildruta

Denna funktion kallas när våra servon kommer till slutet av en ram. Allt som den gör är:

  • Öka den "currentFrameIndex" (om vi inte har nått den sista bildrutan, i vilket fall det loopar tillbaka till ram 0)
  • Lagra aktuell ram position som "sista bildrutan"
  • Hämta nästa ram position från arrayen animation

void setNextFrame()
{
om detta var den sista bildrutan, börja om igen
om (currentFrameIndex < numFrames - 1) {
currentFrameIndex ++;
}
annat {
currentFrameIndex = 0;
}

Vi har nått målbildrutan, så spara det som "sista bildrutan"
LSlast = LSnext;
RSlast = RSnext;
LElast = LEnext;
RElast = REnext;
LNlast = LNnext;
RNlast = RNnext;

generera nya "nästa frame"
LSnext = crawlGaitLS [currentFrameIndex];
RSnext = crawlGaitRS [currentFrameIndex];
LEnext = crawlGaitLE [currentFrameIndex];
REnext = crawlGaitRE [currentFrameIndex];
LNnext = crawlGaitLN [currentFrameIndex];
RNnext = crawlGaitRN [currentFrameIndex];

}

Interpolation funktion

Som beskrivits tidigare, kommer att vi använda en linjär interpolation för att avgöra exakt vilken ställning en servo bör vara i vid en given tidpunkt mellan två ramar.

Min dator vetenskap föreläsare sa alltid att vara en bra programmerare handlade om att vara lat, om du kan undvika skriva kod flera gånger genom att sätta det i en funktion, då göra det.

Denna funktion helt enkelt genomför linjär interpolation ekvationen mellan två bildrutor och sedan kartor ram position till en servo position och tillämpar det till servo-objektet.

void writeInterpolatMicros (Servo servo, int prevFrame, int nextFrame, int servoMin, int servoMax, float elapsedRatio) {
int interpolerad = prevFrame + int (float (nextFrame - prevFrame) * elapsedRatio);
servo.writeMicroseconds(map(interpolated,0,1000,servoMin,servoMax));

}

Servo uppdateringsfunktionen

Denna funktion gör koden snyggare genom att ta bort en bit av det från den huvudsakliga loopen.

Först beräknas förhållandet mellan den ram som redan är klar med antalet millisekunder som har förflutit sedan ramen började, dividerat med antal millisekunder det tar för att slutföra en ram.

Detta förhållande är skickas vidare till funktionen interpolation för varje servo, uppdatera varje position.

void updateServos()
{

flyta frameElapsedRatio = float(frameElapsed)/float(frameDuration);

writeInterpolatMicros(LS,LSlast,LSnext,LSMin,LSMax,frameElapsedRatio);
writeInterpolatMicros(LE,LElast,LEnext,LEMin,LEMax,frameElapsedRatio);
writeInterpolatMicros(RS,RSlast,RSnext,RSMin,RSMax,frameElapsedRatio);
writeInterpolatMicros(RE,RElast,REnext,REMin,REMax,frameElapsedRatio);
writeInterpolatMicros(LN,LNlast,LNnext,LNMin,LNMax,frameElapsedRatio);
writeInterpolatMicros(RN,RNlast,RNnext,RNMin,RNMax,frameElapsedRatio);

}

Huvudloop

Den huvudsakliga loop() är där all action händer, så snart den är klar att köra alla koden som finns inuti den hoppar tillbaka till början och börjar om igen.

Det första steget i den huvudsakliga slingan är att spela in det aktuella antalet millisekunder sedan programmet startade kör) så att vi kan avgöra hur mycket tid har förflutit sedan den senaste iterationen av loopen.

Använda denna tid kan vi avgöra om förfluten tid är större än den period som vi definierade för interpolation steg, så anropa funktionen updateServos() att generera nya interpolerade positioner.

Vi kontrollerar också om förfluten tid är större än vad ram, då vi behöver att anropa funktionen setNextFrame().

void loop()
{
osignerade långa currentMillis = millis();

om (currentMillis - previousInterpolationMillis > interpolationDuration) {
Spara sista gången att vi uppdaterat servon
previousInterpolationMillis = currentMillis;
Increment ramen gått coutner
frameElapsed += interpolationDuration;
uppdatera servon
updateServos();

}

om (currentMillis - previousFrameMillis > frameDuration) {
Spara sista gången att vi uppdaterat servon
previousFrameMillis = currentMillis;
återställa förfluten ram tiem till 0
frameElapsed = 0;
uppdatera servon
setNextFrame();
}

Se Steg
Relaterade Ämnen

GSM baserade mångsidig Robotic fordonet med hjälp av PIC mikrokontroller

detta projekt syftar till att utveckla som en robot som kan styras av en mobiltelefoner. DTMF-kommandon från en telefon skicka till en annan mobiltelefon som är monterad på robotic fordonet. Dessa kommandon matas till en PIC mikrokontroller för 8-bit...

Hur man gör en robotic bil med fjärrstyrda. (Ashwini sinha).

radiostyrd robot bil med arm...Steg 1: Saker som behövs you need-4 leksak hjul-1 inriktade motor-4 stål rod (tunn som i pic)-1motoratt minska redskap -6-20 cm trådSteg 2: Ordna redskap som i pic.then fixa motorn med hjälp av adeshive... Steg 3: monte...

Mobil kontrollerade robotic bilen med arduino och DTMF

Hej killar!Detta är mitt första projekt på instructables, hoppas du kommer att njuta av denna.Detta projekt handlar om hur du kan kontrollera en robotic bil med hjälp av mobiltelefon och hur du kan kontrollera att bil från var som helst i världen.Pro...

Robot kostym med lysdioder

anledningarna till varför jag ville göra en robot som passar är komplexa. För att göra en lång historia kort, jag ville ha en kostym som jag kunde använda för att underhålla mina jämnåriga medan de omsorgsfullt förberedda för slutprov. Men jag ville...

Robotic Hand med gest recogntion - AVATAR

Remeber AMP kostym från AVATARMänskliga kontrollerade Robotic Hand med gestigenkänningInspirerad från AVATAR Amp kostym.Jag hade just gjort bara hand handled...den har 3 DOF handled rulle och pitch, fingrar lock och release....

Gest kontrollerade robotic bil med android ansökan

FYP - gest kontrollerade Robotic bil med Android ansökan. Fullständiga koden inklusive gest erkännande och bluetooth dataöverföring är tillgänglig. Människor som behöver någon form av hjälp angående detta projekt eller några andra projekt som (bildbe...

Brutit Arm tårta med knaprande ben

detta är receptet och taktik för att göra en sockerglasyr täckta avhuggna arm tårta med knaprande ben. Detta var en stor succé på en Halloween husmanskost och hade bonusen inkomstbringande människor ut. :)Du behöver:2 silikon matsGrytlapparMarsipan e...

Super Mario Brothers med torra ben Dungeon "Snö" världen

Välkommen kära instructable Lovin ' användare!Idag kommer du lära dig hur du skapar din egen Super Mario Brothers med torra ben Dungeon "Snö" Globe! Jag vet vad ni tänker, vänta poofrabbit inte du bara göra Super Mario Brothers guldmynt "Sn...

LEGO NXT 2.0 Robot Zombie-av Muchen Jiang

Tack alla för att rösta, detta instructable har vunnit tvåan pris för zombie tävlingen och även har varit med här.Steg 1: Steg 1 Hej där, har jag gjort en Lego NXT 2.0 växter vs zombies kon huvudet zombie: Ddenna zombie behöver inte programmering, me...

BRRRRAAAAIIINSSSSSS!!! Gör dig själv till en zombie med hjälp av photoshop CS5

detta instructable gjordes för halloween-tävling för fotoredigering. Detta är mitt första försök till en instructable så jag hoppas jag gjorde det lätt att följa. Efter massor av försök och misstag kunde jag slutligen producera en zombiefied bild av...

Barns Robot kostym med ljudeffekter, godis detektor och mer

jag gjorde min dotter denna robot kostym till halloween. Jag blev inspirerad av denna Kid Robot kostym. Jag tog mig i lite av en annan riktning och till några mer nyheter såsom lampor i antenner och öron, en big button-kontrollen med en ljudeffekt fö...

Android Aplication för Robot kontroll med hjälp av HC-05 och Arduino (Android Studio)

Hej alla, denna gång som jag kommer att visa dig hur man styr roboten med telefonen, följ denna instruktion noga. Detta projekt är faktiskt fortfarande under utveckling.Steg 1: Vad behöver vi för robotInnan vi går till android ansökan, måste vi förbe...

Bygga en modulär Robot chassi med Actobotics

Jag har älskat robotar från min tidiga barndom. Första filmen robotarna jag minns någonsin verkligen gillar först, där tre robotar från "Silent Running" (fortfarande en av mina favoritfilmer!) Dessa fånig liten vandrande lådor nådde mitt intress...

Den pumpa Zombie - med Pixlr

Hi guys,Jag har redigerat detta foto med denna fantastiska mjukvara pixlr. Jaghar försökt att vända en man äta hans pumpa till en zombie. Jag har också redigera pumpa att ge det en mer skrämmande känsla.Jag hoppas ni gillar detta instructable så myck...

Simon zombie med Sketchbook Pro 5 & Wacom

Uuuuuggghhh... Jag vill visa dig... Hur Rita. Mig, Simon. Braaii... Eeeh Rita!Detta är väl egentligen min skapelse! Träffa Simon zombie. Han var en doodle och jag gav honom livet. Nu är han här i mitt instructable för dig att se och eventuellt lära *...

Hur man skapa Zombies med Projection Mapping

detta instructable visar du hur du enkelt skapar en illusion av zombies på ditt hus, eller någonstans. Den hårda vägen att göra detta, innebär utveckling av ett undeadly virusoch smitta dina nära och kära (rekommenderas inte). Kolla in videon nedan f...

Hur man gör en Boomerang (The Robot avkastning med mörka draken)

jag hade aldrig gjort en bumerang innan, så jag tänkte det var dags.Detta är två boomerang projekt i en. Instruktionerna för varje är anmärkningsvärt liknande, och du kan följa skillnaderna i noterna på bilderna.Traditionella bumeranger har två forme...

Hur man gör en avlägsen kontrollerade Robotic Hand med Arduino

Detta är mitt skolprojekt för den 5: e året i gymnasiet (jag är italienska, vi har 5 år på gymnasiet).Det består i en konstgjord hand kontrolleras av en handske med flex sensorer. Konstgjord hand återger rörelser i handen med kontroll handsken, trådl...

Arduino Robotic Hand med Haptic Feedback

i år för science fair, jag gjorde en engineering projekt med målet att skapa ett system för att ge haptic feedback från en robotic hand. Den robotic handen styrs av flex motstånd på en handske som bärs på någons hand och en Arduino konverterar fingra...