Maak een Crawling Robot Zombie met afgehakte benen (20 / 22 stap)

Stap 20: Code: besturingselement toe te voegen


In de vorige stap we een fundamentele crawl routine gedefinieerd en besproken van het gebruik van interpolatie te bewegen soepel de servo's. Nu, wat als u wilt controleren uw Zombot?

Er zijn oodles van manieren om dit, zowel in de hardware en de software te implementeren. Ik koos om te behandelen met behulp van de Arduino seriële verbinding, wat het zal echt triviaal betekent voor controle van de robot draadloos via Bluetooth, of zoals ik doe op dit moment voor foutopsporing, eenvoudig via de USB-kabel.

Dit is in geen geval de meest elegante manier om deze resultaten te bereiken, maar het is hopelijk gemakkelijk te lezen en te begrijpen, en flexibel.

Als voordat ik de volledige code hieronder zal hechten, maar ik zal gaan door de belangrijkste punten hier.

Communicatieprotocol

Ik heb besloten mijn communicatieprotocol instellen op de volgende manier.

  • Elk gegevenspakket (instructie) van de controller naar de robot is een tekenreeks die bestaat uit twee delen, gescheiden door een ":" karakter.

    • De "command" voorop en de robot vertelt wat te doen (bijvoorbeeld: beginnen met het verplaatsen)
    • De 'argument' komt tweede en extra informatie
  • Elk gegevenspakket begint met een "[" en eindigt met een "]"

Globale variabelen definiëren

Naast de eerder gedefinieerde variabelen moeten we nu om setup sommige variabelen die worden gebruikt in onze communicatieprotocol via seriële.

 char inDataCommand[10]; //array to store command char inDataArg[10]; //array to store command argument int inDataIndex = 0; //used when stepping through characters of the packet boolean packetStarted = false; //have we started receiving a data packet (got a "[" boolean argStarted = false; //have we received a ":" and started receiving the arg boolean packetComplete = false; //did we receive a "]" boolean packetArg = false; //are we reading the arg yet, or still the command 

Functies definiëren

Lezen van een opdracht van Serial

Deze functie kan worden aangeroepen om te controleren de seriële interface voor ontvangen opdrachten.

Het controleert de inkomende seriële bytes (tekens) één voor één, gooien ze weg, tenzij zij een "[" die geeft het begin van een opdracht.

Zodra een opdracht is gestart, elke byte wordt opgeslagen in de variabele "command" tot een ":" of "]" wordt ontvangen. Als een ":" is ontvangen, we beginnen met het opslaan van de volgende bytes in de variabele 'argument' tot een "]" wordt ontvangen.

Als op om het even welk punt een "[" is ontvangen tijdens de lezing van een andere instructie, dat de vorige instructie is verwijderd. Hiermee voorkomt u dat ons vast komen te zitten als iemand nooit verzonden een "]" einde-van-command teken en we wilden een nieuwe opdracht.

Na ontvangst van een volledige opdracht heeft de "processCommand"-functie wordt aangeroepen, die eigenlijk interperet zal en actie de opdracht.

 void SerialReadCommand() { /* This function checks the serial interface for incoming commands. It expects the commands to be of the form "[command:arg]" where 'command' and 'arg' are strings of bytes separated by the character ':' and encapsulated by the chars '[' and ']' */ if (Serial.available() > 0) { char inByte = Serial.read();; //incoming byte from serial if (inByte == '[') { packetStarted = true; packetArg = false; inDataIndex = 0; inDataCommand[inDataIndex] = '\0'; //last character in a string must be a null terminator inDataArg[inDataIndex] = '\0'; //last character in a string must be a null terminator } else if (inByte == ']') { packetComplete = true; } else if (inByte == ':') { argStarted = true; inDataIndex = 0; } else if (packetStarted && !argStarted) { inDataCommand[inDataIndex] = inByte; inDataIndex++; inDataCommand[inDataIndex] = '\0'; } else if (packetStarted && argStarted) { inDataArg[inDataIndex] = inByte; inDataIndex++; inDataArg[inDataIndex] = '\0'; } if (packetStarted && packetComplete) { //try and split the packet into command and arg Serial.print("command received: "); Serial.println(inDataCommand); Serial.print("arg received: "); Serial.println(inDataArg); //apply input processUserInput(); packetStarted = false; packetComplete = false; argStarted = false; packetArg = false; } else if (packetComplete) { //this packet was never started packetStarted = false; packetComplete = false; argStarted = false; packetArg = false; } } } 

Verwerken van een opdracht

Zodra een geldige opdracht (en optioneel een argument) zijn ontvangen, moeten zij worden geteld, zodat we de nodige maatregelen kan treffen.

Voor het moment heb ik niet meer dan één byte van informatie aan het definiëren van een opdracht, zodat we alleen kijken naar de eerste byte van de opdracht vereist. Met behulp van deze byte als het argument voor een switch() verklaring toe: staan ons voor het uitvoeren van een functie gedefinieerd door de byte van de opdracht.

In dit voorbeeld zijn we op zoek naar de teken "w", "s" of "c".

Als "w" wordt ontvangen, dan is de animatieframes worden overschreven met een nieuwe animatie waarin een "butterfly"-beweging.

Als "s" wordt ontvangen, dan is de animatieframes worden overschreven met een nieuwe animatie waarin een "crawl" beweging.

Als "c" wordt ontvangen, dan is de animatieframes zijn allemaal ingesteld op dezelfde positie, effectief stoppen alle verkeer.

Aangezien men niet alle waarden in een array tegelijk opnieuw toewijzen, we eerst definiëren een nieuwe tijdelijke array voor elke servo, met de nieuwe frames, gebruik dan de "memcpy" om de werkelijke frame matrix locatie in het geheugen worden deze waarden overschreven.

 void processUserInput() { /*for now all commands are single chars (one byte), can expand later if required char commandByte = inDataCommand[0]; if (commandByte != '\0') { switch (commandByte) { case 'w': { //synchronised forwards (butterfly) 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); break; } case 's': { //crawl stroke, 180 degrees out of phase 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); break; } case 'c': { //turn left 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}; break; } } } } 

Hoofdlus

De enige toevoeging vereist in de hoofdlus is een oproep om te controleren of de invoer van de gebruiker op elke iteratie van de lus.

 //get user input using the SerialReadCommand function we wrote SerialReadCommand(); 

Gerelateerde Artikelen

Maak een draadloze Robot met een Android telefoon

Maak een draadloze Robot met een Android telefoon

In dit Instructable we gonna een MouseBot bouwen.De MouseBot is een klein draadloos arduino robot die u met een computer beheren kunt. Het vereist geen een Wi-Fi-module. In plaats daarvan gebruikt het een android telefoon zelf verbinden met het inter
Maak een zelfbalancerende Robot met Arduino UNO

Maak een zelfbalancerende Robot met Arduino UNO

Self balancing Robot is zeer interessant. Veel vrienden om ons heen wilden maken een, maar ze encounted alot van chanllenges met inbegrip van het ontbreken van de gemakkelijk-aan-de vergadering van structuren, de geschikte elektronische schakelingen
Maak een RC Robot voor een film

Maak een RC Robot voor een film

oke misschien ik moet niet noemen een "robot" het is een robot marionetTerug in mei 2005 kreeg ik een telefoontje van collega bij Colpitts Design. Hij werd benaderd om te bouwen van een marionet voor speelfilm. Ze waren op zoek naar iemand om re
Maak een baby Samus Aran met behulp van plastic afval (speciale gasten: The Caicedo-Langer familie!)

Maak een baby Samus Aran met behulp van plastic afval (speciale gasten: The Caicedo-Langer familie!)

Mijn familie heeft een traditie: niemand gooit niets naar de vuilnisbak voordat ik besluit dat als ik het gebruiken kon voor het bouwen van spullen. Dus, dankzij mijn moeder, mijn stiefvader, mijn broer, mijn ooms en neven, heb ik een workshop vol...
Maak een Instructables Robot sleutelhanger!

Maak een Instructables Robot sleutelhanger!

Tijdens mijn laatste dag als een artiest in residentie in Instructables, ik was vastbesloten om wat last-minute-gebruik uit de ontzagwekkende tools die ik had voordat ik te zeggen had beschikbaar vaarwel.  Tijdens mijn verblijf hield ik die toegang h
Maak een Instructable Robot stempel

Maak een Instructable Robot stempel

ik postzegels en andere dingen zoals die te maken. En ik ook graag de Instructables Robot. Dus is hier de stempel van een Instructable Robot!Stap 1: Benodigdheden u nodig:Ambachtelijke schuimLijmSchaarSAP fles dop of iets dergelijksPenNiet getoond ma
Maak een iPad Mini boek met opbergvak

Maak een iPad Mini boek met opbergvak

ik denk dat ik ben oud genoeg om gewoon graag het gevoel van een goed boek in mijn hand.  Maar ik hou van lezen op mijn iPad mini en besloten om een holle boek om het te houden te maken.  Dit project geldt sommige gemeenschappelijke bandzagen vak tec
Pimp je oude Smartphone en maak een Steampunk MP3-speler met Touchscreen

Pimp je oude Smartphone en maak een Steampunk MP3-speler met Touchscreen

HoiWat kunt u doen met uw oude Smartphone? Verkopen, weggooien, zet het in de magnetron? * gg *Nee, we maken een Steampunk MP3-speler met Touchscreen ;)Stap 1: laten we beginnenWe moeten een heleboel dingen van messing, sommige elektronica en fantasi
Maak een aangepaste wasruimte ijdelheid met teruggewonnen hout!

Maak een aangepaste wasruimte ijdelheid met teruggewonnen hout!

DE WEDSTRIJD VAN HET ONTWERP VAN DE GUERRILLA! Als je deze gelieve stemming in de rechter bovenhoek! ***Ik pakte een oude jaren 1970 koffietafel en een bos van afgedankte hout uit de dumpster naast onze winkel (dumpster duiken!!!) en gehackte weg bij
Maak een header voor Twitter met Photoshop

Maak een header voor Twitter met Photoshop

Ooit wilde maken van een banner voor twitter? Vandaag zullen wij leren u hoe maak je een oog springende afbeelding voor je twitter-pagina met behulp van Adobe Photoshop CC.Voor dit project moet u ten minste 1 foto van uw keuze. Het kan zijn kunst, ee
Bouwen van een modulaire Robot Chassis met Actobotics

Bouwen van een modulaire Robot Chassis met Actobotics

Ik hield van mijn vroege kinderjaren robots. De eerste film robots ik herinner me ooit echt wens eerst, waar de drie bots "Stille Running", (nog steeds een van mijn favoriete films!) Die goofy beetje wandelen dozen bereikte een hoogtepunt van mi
Maak een knipperende lichten circuit met een 555 timer en een relais

Maak een knipperende lichten circuit met een 555 timer en een relais

I 'm gonna u hoe maak je een afwisselend pulserende circuit (met behulp van de 555 timer) uitvoeren van een relais.Afhankelijk van het Relais kan u kundig voor stormloop 120vac licht worden.Het doet dat goed met kleine condensator (ik zal later uitle
Maak een Wonder vrouw kostuum met uw kind

Maak een Wonder vrouw kostuum met uw kind

Wonder Woman is de perfecte prinses voor die kleine meisjes die zijn niet wachten rond voor een prins om hen te redden. Deze tutorial helpt u bij het maken van een kostuum met uw ontluikende amazon warrior, maar ook maak ton van herinneringen zo goed
Maak een Instructable Robot kostuum

Maak een Instructable Robot kostuum

dit zal laten zien van mijn instructies op hoe ik werd een Instructable Robot voor Halloween.Stap 1: Verzamel de materialen ik ongeveer 1,5 werven van gele en oranje stof gebruikt om het lichaam te maken.  Ik gebruikte ook rood, grijs en zwart vilt o