PathFinder (11 / 14 steg)

Steg 11: Arduino - kod



Följande kod redigerades använder Arduino 1.6.7. Detta är en fullständig lista över koden.

#include
RedBotSensor vänster = RedBotSensor(A3); initiera en vänster sensor objekt på A3
RedBotSensor center = RedBotSensor(A6); initiera en center sensor objekt på A6
RedBotSensor höger = RedBotSensor(A7); initiera en rätt sensor objekt på A7
konstanter som används i koden. LINETHRESHOLD är den att upptäcka
om sensorn är på linjen eller inte. Om sensorn värdet är större än detta
sensorn är ovanför en mörk linje.
//
HASTIGHETEN anger nominella hastigheten
#define LINETHRESHOLD 800
#define hastighet 60 / / anger nominella hastigheten. Tilldela ett värde mellan 0 - 255.
#define CORRECTIONFACTOR 10
#define ADJUSTMENTTHRESHOLD 4000 //milliseconds att starta en justering i förväg

RedBotMotors motorer.
int leftSpeed; variabeln som används för att lagra leftMotor hastighet
int rightSpeed; variabeln som används för att lagra rightMotor hastighet
osignerade långa startTime;
int correctionIndex = 0;
int correctionCounter = 0;
osignerade långa korrigeringar [20].
int correctionsDir [20].
char åtgärder.
bool biljett = false;
void setup()
{
Serial.BEGIN(9600);
Serial.println ("Välkommen till experiment - följande raden");
Serial.println("---");
Delay(2000);
Serial.println ("IR-sensorn avläsningar:");
Delay(500);
startTime = millis();
korrigeringar [0] = 0;
leftSpeed =-hastighet;
rightSpeed = hastighet;
}
void loop()
{
Serial.Print(left.Read());
Serial.Print("\t"); Tab-tecken
Serial.Print(Center.Read());
Serial.Print("\t"); Tab-tecken
Serial.Print(Right.Read());
Serial.println();
Serial.Print ("Action:"); Tab-tecken
Serial.Print(action);
Serial.println();
om (åtgärder == "g") {
om alla sensorer på svart eller upp i luften, stoppa motorerna.
annars kör motors ges kontroll hastigheterna ovan.
om ((left.read() > LINETHRESHOLD) || (Center.Read() > LINETHRESHOLD))
{
Turn(0);
}
annars om ((center.read() > LINETHRESHOLD) || (Right.Read() > LINETHRESHOLD))
{
Turn(1);
}
annat
{
applyAdjustment(nextCorrection());
motors.leftMotor(leftSpeed);
motors.rightMotor(rightSpeed);
}
Delay(0); lägga till en fördröjning för att minska känsligheten.
}
annat {
startTime = millis();
Motors.Brake();
}
}
Annullera tur (int direkt)
{
om (correctionCounter > = 0) correctionCounter--;
int justera = correctionCounter * 500;
addCorrection(direct,adjust);
Motors.stop();
leftSpeed = 200.
rightSpeed = -200;
motors.leftMotor(leftSpeed);
motors.rightMotor(rightSpeed);
Delay(100);
om (direkt == 0)
{
leftSpeed =-(SPEED - 50) * 2;
}
annat
{
rightSpeed = hastighet - 50 * 2.
}
motors.leftMotor(leftSpeed);
motors.rightMotor(rightSpeed);
Delay(250);
leftSpeed = - hastighet;
rightSpeed = hastighet;
}
void addCorrection (int riktning, int correctionTime)
{
korrigeringar [correctionIndex] = millis() - startTime-correctionTime;
correctionsDir [correctionIndex] = riktning;
Serial.println("Correction");
Serial.println(Corrections[correctionIndex]);
Serial.println(correctionsDir[correctionIndex]);
correctionIndex ++;
correctionCounter ++;
}
int nextCorrection()
{
int jag = 0;
osignerade långa currentTime = millis() - startTime;
medan ((korrigeringar [i] < currentTime) & & (jag < correctionIndex)) i ++;
tillbaka i;
}
void applyAdjustment (int nextCorrectionIndex)
{
osignerade långa currentTime = millis() - startTime;
osignerade långa remainingTime = korrigeringar [nextCorrectionIndex] - currentTime;
Tid att rätta
om (remainingTime < ADJUSTMENTTHRESHOLD)
{
om (correctionsDir [nextCorrectionIndex] == 1)
{
rightSpeed = hastighet + applyWeight(remainingTime);
leftSpeed =-(SPEED - applyWeight(remainingTime));
}
annat
{
rightSpeed = hastighet - applyWeight(remainingTime);
leftSpeed =-(hastighet + applyWeight(remainingTime));
}
biljett = sant;
}
annars om ((currentTime > corrections[nextCorrectionIndex]) & & (biljett == true))
{
biljett = false;
correctionIndex ++;
}
annat {//No korrigering
leftSpeed = - hastighet;
rightSpeed = hastighet;
}
}
int applyWeight (int wRemainingTime) {
osignerade långa currentTime = millis() - startTime;
int remainingTime=(int)abs(correctionsDir[nextCorrectionIndex]-currentTime);
int newSpeed = 0;
om ((wRemainingTime=2000)) {
newSpeed = CORRECTIONFACTOR * 1;
}
annars om ((wRemainingTime<2000) & (wRemainingTime > = 1000)) {
newSpeed = CORRECTIONFACTOR * 2;
}
annars om ((wRemainingTime<1000) & (wRemainingTime > = 400)) {
newSpeed = CORRECTIONFACTOR * 3;
}
annars om (wRemainingTime < 400) {
newSpeed = CORRECTIONFACTOR * 1;
}
återvända newSpeed;
}
void serialEvent() {
om (Serial.available()) {
Action = (char)Serial.read();
om (åtgärder == "g") {
correctionIndex = 0;
correctionCounter = 0;
}
Serial.println("EVENTO");
}
}

Koden i "setup"-metoden är vanlig standard koden för att ställa in meddelande till seriella portar och diagnos information. De "förseningarna" är viktigt så att du ger tid för alla att systemet är upp och löpande.

"Loop" koden

Loop koden är ansvarig för kontinuerligt titta på värdet i sensorerna. När en av dessa sensorer når en fördefinierad tröskel bör roboten vidta lämpliga åtgärder.

Om vänster-sensorn når bandet (tröskelvärde), sedan, måste roboten vända till höger. Likaså om höger-sensorn når bandet (tröskelvärde), måste roboten vända sig till vänster.

Roboten använder en kunskapsdatabas där det registrerar tiden när det kraschade mot linjen. Under varje körning, roboten registrerar varje krasch i framtiden går det kommer att söka i dess kunskapsbas att "look-ahead" för krascher och korrigerar sin väg.

Det finns också "justeringar". Till exempel, låt oss säga att i den första körningen roboten kraschade på sekunder 4 och 9. I kraschen på andra 4 roboten var tvungen att gå tillbaka lite för att korrigera sökvägen och därmed förlorar lite tid. Det innebär att kraschen på andra 9 skulle hända vid en annan tidpunkt i nästa tar om kraschen på andra 4 undviks. Detta "undvikande" fall spåras i variabeln "correctionCounter". Riktningen av korrigeringen också spåras.

Metoden "applyWeight" används för att lägga till en vikt till korrigering hastighet beroende på hur nära vi är att nästa förutspådde kraschen. Ju närmare till nästa kraschen desto snabbare anpassning måste ske.

"Turn" koden

Denna kod gör roboten sväng åt vänster eller höger beroende på de argument som skickas till den. Det verkliga arbetet i denna kod är att kunna bestämma avstånd och hastighet för att flytta för att komma tillbaka på rätt spår. Detta bestäms i princip av försök och fel strategi.

Se hur hastigheten på motorn är från början inställt till en bas av 200 och -200 för vänster och höger motors respektive. Denna värden i hastigheten kommer att göra roboten att gå bakåt.

Beroende på vilken riktning att vända, beräknas värdet av hastigheten för en motor eller annat. Detta är det sätt vi gör roboten att gå tillbaka på rätt spår.

Så enkelt som denna kod kan se ut, detta gör roboten att gå runt alla slags väg och när når ett slut, den kan finna sin väg runt att gå tillbaka och börja vägen igen.

Se Steg
Relaterade Ämnen

Pathfinder Goblin Mask (2014)

This is a mask of Goblin from the Pathfinder board game series. Det gjordes för en gaming café ligger i närheten av NDG i Montréal, Kanada. Med tanke på att det finns ett kafé, en avtagbar mustasch och cabby hatt lades till.Jag har skrivit en steg fö...

Skapa en karaktär med hjälp av Pathfinder Roleplaying System

Pathfinder Roleplaying System, utgiven av Paizo, är otroligt lik Dungeons & Dragons 3.5 i de flesta avseenden. I allmänhet, men spelaren ges fler alternativ och många förvirrande regler har förenklats. Detta är ett utmärkt system som man kan introduc...

Den Pathfinder Dart - Atlatl med String(With Duct Tape Fletching)

de flesta människor har hört talas om atlatl (AT-latl). För er som inte har, var det metoden för jakt mellan spjut och båge och pil. Det var helt enkelt en förlängning av armen för att kasta spjut, ökande utbud, hastighet, och precision. I detta fall...

Nighttime Pathfinder

Detta projekt, vid namn Nighttime Pathfinder, ger ägaren möjlighet att navigera hans eller hennes hem i mörkret utan att störa resten av åkande i hemmet. Pathfinder består av två huvuddelar, en huvudsaklig chassi, (som består av Lego Mindstorm tegels...

Pathfinder Zybot

Detta projekt görs för Digilent hårdvara Design Contest Europa regionen 2016 och det är en begginging version till vårt projekt.Detta instructable är utformad för dem som har lite erfarenhet och vill bygga en robot med Zynq styrelse (ZYBO) häxa inneh...

Halo 5 Pathfinder hjälm prototyp del 1

detta kommer att delas upp i flera separata Instructables, så sparka tillbaka, koppla av och njuta lite av denna första del.Steg 1: Varför skulle jag göra det? Varför annars skulle alla göra något sådant? Jag vill ta något från ett spel till det verk...

Stående lampa gjord av akryl

KungörelseOm du stöter på några problem eller fastnar på någon punkt inom instructable (särskilt i den bild bearbetning avsnitt eller om några delar) bara gärna skicka mig ett Instructable-meddelande eller ett e-postmeddelande och jag ska göra mitt b...

Laserskurna rippel klockan

det är en trä klocka med massor av koncentriska cirklar som efterliknar ringar i en damm. Skär med en frickin' laserstrålen. Jag ville ha något som var abstrakt och ändå hade de grundläggande funktionerna i en klocka. Det är lite arbete med Illustrat...

3D-tryckt tacksägelse spel dekoration från 2D-bild med Tinkercad

Ja, en 3D-tryckt 2D sak. MEN - som innebär att bara om någon bild kan vara pressad och givit djup!Obs: Jag använder en Mac och ge dessa kortkommandon i detta Instructable - PC kommer verkligen bara vara annorlunda med CMD + _ genvägar.Jag fick en för...

Vackra bilden citat för Social Media

Har du sett bilder med inspirerande citat cirkulerar runt Facebook, Twitter, Pinterest eller andra sociala medier webbplatser? Jag slår vad du har, och det är poängen. Dessa typer av bilder är populära eftersom de ger människor ett uppsving av inspir...

Skapa annons i Adobe Illustrator

Detta är en Instructable för alla nivåer av erfarenheter. Om du är nybörjare i Illustrator det skulle ta ungefär en timme till slut. Jag hade använt tekniker från denna handledning innan och fann dem både lätt och nyttigt.Att slutföra denna tutorial...

AX/Handyxa restaurering

jag i min trettioårsåldern men berättelser från min barndom fortfarande genljuder... "Min sida av berget," och "Handyxa" att vara mer specifik. Efter att ha haft läsa dessa böcker i bästa av mina yester-år jag har alltid velat en yxa (...

Klipp på trä fluga (laser cut)

Denna laser skär klipp på fluga är super snabb och lätt att göra. Jag använde hårspännen i detta, så du kan antingen bära den som en fluga eller som stora hår tillbehör.Material:plywoodHårspänneVarmlimma fastSteg 1: Design Jag använde Illustrator, me...

Ändra disk bromsbelägg

ändra din bromsbelägg är en enkel process som du kan göra själv med bara afew verktyg och lite tid. Detta gjordes på baksidan av en 94 Nissan Pathfinder men de verktyg som behövs och principen bakom det kan tillämpas på alla skivbromsar. Jag är inte...

Altoids Survival Kit 2.0

Hej jag är BudgetBugout och i detta Instructable jag visa er min nya och förbättrade Altoids survival kit! Även om detta kit är anpassad efter mina behov och miljö anser jag att grunderna i detta kit är tillämpliga för alla! Välkommen att lämna komme...

Black Ops prestation guider

i denna artikel kommer jag lära dig om några Black Ops prestationer som jag har tjänat. Detta är inte alla av dem. Jag kommer att innehålla guider till svårare kära när begäret. Jag kan också säga att detta är det sätt jag fick dem (Theres alltid ett...

En släktklenod lägenhet arbetsbänk.

"Oslipad diamant": en idiom gjort populärt i modern tid, tack själv delvis till en ödmjuk gatan råtta och hans, nyckfull, mystisk följeslagare (ah, du kommer att missa Mr Williams). Ovan nämnda frasen är baserad på konceptet att du inte kan se d...

Återanvändbara bröllopinbjudningar

Jag är ett stort fan av två ord "inte kasta". Som barn samlade jag alltid inbjudningar eftersom jag inte tyckte kasta bort dem. En kort livslängd är knappast några minuter eller till dess bröllop. (dvs om du uppmanas att bära inbjudan till festp...

Laser skär snöflinga prydnad

år min flickvän och jag valde att göra några snöflinga smycken att ge bort till vänner och familj för semester. Jag har nyligen lärt sig att använda den nya Trotec Laser på TechShop. Detta projekt var perfekt för att testa olika inställningar på lase...