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

Steg 20: Kod: att lägga till kontroll



I föregående steg vi definierat en grundläggande crawl rutin och diskuterade hur man använder interpolation flytta servon smidigt. Nu, vad händer om du vill styra din Zombot?

Det finns massor av sätt att genomföra detta, både hårdvaran och mjukvaran. Jag valde att hantera den med den Arduino seriell anslutning, vilket innebär att man egentligen trivialt att styra roboten trådlöst via Bluetooth, eller som jag gör just nu för felsökning, helt enkelt via USB-kabeln.

Detta är ingalunda det mest eleganta sättet att uppnå dessa resultat, men det är förhoppningsvis lätt att läsa och förstå, samt flexibla.

Som innan jag kommer att koppla den fullständiga koden nedan, men jag kommer gå igenom de viktigaste punkterna här.

Kommunikationsprotokoll

Jag har beslutat att inrätta min kommunikationsprotokoll på följande sätt.

  • Varje datapaket (instruktion) från styrenheten till roboten är en teckensträng som består av två delar, en ":" karaktär.
    • "Kommandot" kommer först och berättar roboten vad ska göra (till exempel: börja röra sig)
    • "Argumentet" kommer andra och ger extra information
  • Varje datapaket börjar med en "[" och slutar med en "]"

Definiera globala variabler

Förutom de tidigare definierade variablerna måste vi nu konfigurera vissa variabler som används i våra kommunikationsprotokoll via följetong.

char inDataCommand [10]. matrisen att lagra kommando
char inDataArg [10]. matrisen att lagra kommandoargument
int inDataIndex = 0; används när du stegade igenom tecken på paketet
booleska packetStarted = false; har vi börjat ta emot ett datapaket (fick en "["
booleska argStarted = false; har vi fått en ":" och börjat ta emot arg
booleska packetComplete = false; fick vi en "]"
booleska packetArg = false; läser vi arg ännu fortfarande kommandot eller

Definiera funktioner

Läs ett kommando från Serial

Denna funktion kan anropas för att kontrollera det seriella gränssnittet för mottagna kommandon.

Den kontrollerar inkommande seriell byte (tecken) taget, kasta bort dem om de inte är en "[" som anger början av ett kommando.

När ett kommando har startat, varje byte lagras i variabeln "kommando" till en ":" eller "]" tas emot. Om en ":" är emot, vi börja lagra följande byte till variabeln "argument" till en "]" tas emot.

Om på någon punkt en "[" tas emot under läsningen av en annan instruktion, att tidigare instruktion ignoreras. Det hindrar oss att fastna om någon aldrig översänds en "]" end-of-kommandot karaktär och vi ville skicka ett nytt kommando.

När en full kommandot har tagits emot "processCommand" funktionen anropas, som kommer att faktiskt interperet och åtgärd kommandot.

void SerialReadCommand() {
/*
Denna funktion kontrollerar det seriella gränssnittet för inkommande kommandon.
Det förväntar sig kommandon till ha formatet "[kommando: arg]"
där "kommando" och "arg" är strängar byte åtskilda av den
tecknet ':' och inkapslat av tecken "[" och "]"
*/
om (Serial.available() > 0) {
char inByte = Serial.read(); inkommande byte från serial
om (inByte == ' [') {
packetStarted = sant;
packetArg = false;
inDataIndex = 0;
inDataCommand [inDataIndex] = '\0'; sista tecknet i en sträng måste vara en null terminator
inDataArg [inDataIndex] = '\0'; sista tecknet i en sträng måste vara en null terminator
}
annars om (inByte == ']') {
packetComplete = sant;
}
annars om (inByte == ':') {
argStarted = sant;
inDataIndex = 0;
}
annars om (packetStarted & &! argStarted) {
inDataCommand [inDataIndex] = inByte;
inDataIndex ++;
inDataCommand [inDataIndex] = '\0';
}
annars om (packetStarted & & argStarted) {
inDataArg [inDataIndex] = inByte;
inDataIndex ++;
inDataArg [inDataIndex] = '\0';
}

om (packetStarted & & packetComplete) {
prova och dela paketet i kommandot och arg
Serial.Print ("kommando fick:");
Serial.println(inDataCommand);
Serial.Print ("arg fick:");
Serial.println(inDataArg);

tillämpa input
processUserInput();

packetStarted = false;
packetComplete = false;
argStarted = false;
packetArg = false;

}
annars om (packetComplete) {
Detta paket var aldrig startat
packetStarted = false;
packetComplete = false;
argStarted = false;
packetArg = false;
}

}
}

Bearbeta ett kommando

När du har tagit emot ett giltigt kommando (och eventuellt ett argument), måste de vara processuppföljning, så att vi kan vidta lämpliga åtgärder.

För tillfället har jag inte behövde mer än en byte för att definiera ett kommando, så vi bara titta på den första byten i kommandot. Med detta byte som argument för ett switch() tillåter uttalande oss att utföra en funktion som definieras av kommandobyte.

I detta exempel söker vi karaktär "w", "s" eller "c".

Om "w" tas emot, skrivs då animeringsbildrutorna över med en ny animering som definierar en "butterfly" rörelse.

Om det "s", skrivs sedan animeringsbildrutorna över med en ny animering som definierar en "krypa" rörelse.

Om "c" tas emot, då är animeringsbildrutorna redo att samma position, effektivt stoppa alla rörelser.

Eftersom man inte kan re-tilldela alla värden i en matris på en gång, vi först definiera en ny tillfällig array för varje servo, som innehåller de nya bildrutorna och sedan använda "memcpy" för att kopiera dessa värden över faktiska ram matrisens plats i minnet.

void processUserInput() {
/ * för alla kommandon är nu enda tecken (en byte), kan expandera senare om det behövs
char commandByte = inDataCommand [0];
om (commandByte! = '\0') {
växel (commandByte) {
fallet "w": {
synkroniserad framlänges (fjäril)
numFrames = 4;
int newRS [] = {0,1000,1000,0}.
int newRE [] = {0,0,1000,1000}.
int newLE [] = {0,0,1000,1000}.
int newLS [] = {0,1000,1000,0}.
int newLN [] = {1000,1000,0,1000}.
int newRN [] = {0,1000,1000,1000}.

memcpy (crawlGaitRS, newRS, numFrames);
memcpy (crawlGaitRE, newRE, numFrames);
memcpy (crawlGaitLE, newLE, numFrames);
memcpy (crawlGaitLS, newLS, numFrames);
memcpy (crawlGaitLN, newLN, numFrames);
memcpy (crawlGaitRN, newRN, numFrames);
bryta;
}
fallet ": {
crawl stroke, 180 grader ur fas
numFrames = 4;
int newRS [] = {0,1000,1000,0}.
int newRE [] = {0,0,1000,1000}.
int newLE [] = {1000,0,0,1000}.
int newLS [] = {0,0,1000,1000}.
int newLN [] = {1000,1000,0,1000}.
int newRN [] = {0,1000,1000,1000}.

memcpy (crawlGaitRS, newRS, numFrames);
memcpy (crawlGaitRE, newRE, numFrames);
memcpy (crawlGaitLE, newLE, numFrames);
memcpy (crawlGaitLS, newLS, numFrames);
memcpy (crawlGaitLN, newLN, numFrames);
memcpy (crawlGaitRN, newRN, numFrames);

bryta;
}
fallet "c": {
Sväng vänster

crawlGaitRS [] = {250,250,250,250}.
crawlGaitRE [] = {250,250,250,250}.
crawlGaitLE [] = {250,250,250,250}.
crawlGaitLS [] = {250,250,250,250}.
crawlGaitLN [] = {250,250,250,250}.
crawlGaitRN [] = {250,250,250,250}.

bryta;
}

}
}
}

Huvudloop

Det enda tillägget krävs i de viktigaste loopen är en uppmaning att kontrollera indata från användaren för varje iteration av loopen.

får indata från användare med hjälp av funktionen SerialReadCommand vi skrev
SerialReadCommand();

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...