Intro till Robotics (8 / 10 steg)

Steg 8: Software Design




Rover är ett hinder att undvika robot som övergår gradvis till undvika ett närliggande hinder och frysa om det inte helt går att flytta, som bör förhindra skador. Programvaran för roboten är en grundläggande tillståndsdator, vilket gör för enkel och tydlig kontroll. Efter initieringen GPIO anvisningarna, kommer Edison kontinuerligt känsla, process, och reagera oändligt. I det här fallet är robotens enda utdata en förändring i motor riktning. IR-sensorer har rent digitala utgångar som är antingen hög eller låg, vilket gör att omvandla dem till enkla händelser som lätt kan lagras som en boolesk stat. Pågrund kort räckvidd av sensorer är robot software enbart reaktiv till yttre händelser. Om utrustad med en IR eller ultraljud avståndsmätare, skulle roboten kunna aktivt bestämma en väg som skulle göra för mer intressant beteende. När börjar, föreslår jag att arbeta med en enda typ av sensor och lära sig hur väl du kan bearbeta data från den. När du är bekväm att arbeta med en enda typ av ingång, långsamt lägga till sensorer och testa dem längs vägen. Detta tillvägagångssätt är mycket mer metodiskt, men sparar huvudvärk av försöker integrera många olika sensorer samtidigt, vilket kan vara svårt att felsöka.

Intellekten Intro till Robotics Demo

#define PIN_MOTOR1IN1 4
#define PIN_MOTOR1IN2 5
#define PIN_MOTOR1PWM 6
#define PIN_MOTOR2IN1 7
#define PIN_MOTOR2IN2 8
#define PIN_MOTOR2PWM 9
#define PIN_SENSOR_FRONT_L 0 / / främre vänster
#define PIN_SENSOR_FRONT_R 1
#define PIN_SENSOR_REAR_L 2 / / bak vänster
#define PIN_SENSOR_REAR_R 3

#define STATE_TURNING_L 0
#define STATE_TURNING_R 1
#define STATE_FORWARD 2
#define STATE_REVERSE 3
#define STATE_IDLE 4

booleska sensorFrontLActive = false;
booleska sensorFrontRActive = false;
booleska sensorRearLActive = false;
booleska sensorRearRActive = false;

int driveTime = 4000; millisekunder

osignerade långa curTime = 0;
osignerade långa lastTime = 0;
int currentState = STATE_FORWARD;
int lastState = STATE_IDLE;
byte motorSpeed = 64; Max är 255

void setup() {

pinMode (PIN_MOTOR1IN1, OUTPUT);
pinMode (PIN_MOTOR1IN2, OUTPUT);
pinMode (PIN_MOTOR2IN1, OUTPUT);
pinMode (PIN_MOTOR2IN2, OUTPUT);
pinMode (PIN_SENSOR_FRONT_L, indata);
pinMode (PIN_SENSOR_FRONT_R, indata);
pinMode (PIN_SENSOR_REAR_L, indata);
pinMode (PIN_SENSOR_REAR_R, indata);

} / / END SETUP RUTIN

void loop() {

getSensorInput(); spela in raw status av IR-detektorerna
currentState = processSensorData(); besluta vilka staten att gå in

/ * curTime = millis(); liten test rutin att köra igenom staterna
om (curTime - lastTime > driveTime) {
lastTime = curTime;
currentState ++;
om (currentState > 4) {
currentState = 0;
}
}*/

om (currentState! = lastState) {/ / endast uppdatera drivrutinen om något har förändrats
lastState = currentState;
Växla (currentState) {
fall STATE_FORWARD:
moveForward();
bryta;
fall STATE_REVERSE:
moveReverse();
bryta;
fall STATE_IDLE:
Idle();
bryta;
fall STATE_TURNING_L:
moveLeft();
bryta;
fall STATE_TURNING_R:
moveRight();
bryta;
standard: / / idle om processSensorData() gjorde ett misstag
Idle();
bryta;
} / / END SWITCHCASE
} / / END IF currentState

} / / END MAIN LOOP

void getSensorInput() {

sensorFrontLActive =! digitalRead(PIN_SENSOR_FRONT_L); spara den logiska inte läget för digitalRead() eftersom sensorerna är aktiv låg
sensorFrontRActive =! digitalRead(PIN_SENSOR_FRONT_R);
sensorRearLActive =! digitalRead(PIN_SENSOR_REAR_L);
sensorRearRActive =! digitalRead(PIN_SENSOR_REAR_R);

} / / END funktionen getSensorInput()

int processSensorData() {

Om det finns någon input, bara gå framåt
om (! sensorFrontLActive & &! sensorFrontRActive & &! sensorRearLActive & &! sensorRearRActive) {
återvända STATE_FORWARD;
}
Om något är framför roboten, omvänd
om (sensorFrontLActive & & sensorFrontRActive) {
återvända STATE_REVERSE;
}
Om något är till höger medan du flyttar framåt, sväng vänster
om (currentState == STATE_FORWARD & & sensorFrontRActive) {
återvända STATE_TURNING_L;
}
Om något är till vänster när du flyttar fram, sväng höger
om (currentState == STATE_FORWARD & & sensorFrontLActive) {
återvända STATE_TURNING_R;
}
Om något är till höger medan du flyttar bakåt, sväng höger
om (currentState == STATE_REVERSE & & sensorFrontLActive) {
återvända STATE_TURNING_R;
}
Om något är bara på vänster medan du flyttar i omvänd, sväng vänster
om (currentState == STATE_REVERSE & & sensorFrontLActive) {
återvända STATE_TURNING_L;
}
Om alla sensorer är aktiv, inaktiv på plats
om (sensorFrontLActive & & sensorFrontRActive & & sensorRearLActive & & sensorRearRActive) {
återvända STATE_IDLE;
}
/*
(inte genomfört)
Accelerera om inga hinder upptäcks, Använd en långsam hastighet om något hittas!
Om något är framför roboten samtidigt vända, påskynda!
Om något upptäcks bakom roboten, påskynda!
* / < br >

} / / END funktionen processSensorData()

void moveForward() {/ / vänster = fram, höger = bakåt
digitalWrite (PIN_MOTOR1IN1, hög);
digitalWrite (PIN_MOTOR1IN2, låg);
analogWrite (PIN_MOTOR1PWM, motorSpeed);

digitalWrite (PIN_MOTOR2IN1, hög);
digitalWrite (PIN_MOTOR2IN2, låg);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}

void moveReverse() {/ / vänster = bakåt, höger = framåt
digitalWrite (PIN_MOTOR1IN1, låg);
digitalWrite (PIN_MOTOR1IN2, hög);
analogWrite (PIN_MOTOR1PWM, motorSpeed);
digitalWrite (PIN_MOTOR2IN1, låg);
digitalWrite (PIN_MOTOR2IN2, hög);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}

void moveLeft() {/ / vänster = bakåt, höger = bakåt
digitalWrite (PIN_MOTOR1IN1, låg);
digitalWrite (PIN_MOTOR1IN2, hög);
analogWrite (PIN_MOTOR1PWM, motorSpeed);
digitalWrite (PIN_MOTOR2IN1, hög);
digitalWrite (PIN_MOTOR2IN2, låg);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}

void moveRight() {/ / vänster = fram, höger = framåt
digitalWrite (PIN_MOTOR1IN1, hög);
digitalWrite (PIN_MOTOR1IN2, låg);
analogWrite (PIN_MOTOR1PWM, motorSpeed);
digitalWrite (PIN_MOTOR2IN1, låg);
digitalWrite (PIN_MOTOR2IN2, hög);
analogWrite (PIN_MOTOR2PWM, motorSpeed);
}

void idle() {/ / motor ingångar låg
digitalWrite (PIN_MOTOR1IN1, hög);
digitalWrite (PIN_MOTOR1IN2, låg);
digitalWrite (PIN_MOTOR1PWM, låg);
digitalWrite (PIN_MOTOR2IN1, hög);
digitalWrite (PIN_MOTOR2IN2, låg);
digitalWrite (PIN_MOTOR2PWM, låg);
}

Se Steg
Relaterade Ämnen

Konfiguration av MKS Sbase v1.2 32-bitars Controller grunderna och intro till Smoothieware.

ProlougeJag är verkligen glad att se hur denna grundläggande intro till Smoothieware och MKS Sbase 1.2 controller har fått så mycket uppmärksamhet, och hoppas verkligen att det kommer att hjälpa människor att komma igång eller besluta att inte.Jag ha...

3D-utskrifter Intro till Makerbot

Här är och Intro till använder Makerbot Desktop skriva ut 3D-objekt på skrivbordet Makerbot Replicator 5! Mycket grundläggande instruktioner, Känn dig fri att röra runt med programvaran lite mer. (:Steg 1: Välj din fil. Antingen gör din egen 3D-model...

Intro till ARM del 1

I den här första videon kommer jag att ge ett intro till STM32F0Discovery utveckling styrelsen som vi kommer att använda för nästa några videor. Jag kommer att beskriva hårdvaran i styrelsen och vad alla dev kit har att erbjuda.Länk till ST: s hemsid...

Fläkt RPM med inre hall effekt sensor och Arduino (Intro till hårdvara avbryta och LCD display)

För mitt andra projekt för arbete, jag var tvungen att mäta rotationshastigheten av rotoren i varv Per minut (RPM) av en modifierad dator fläkt. Den hade tre kablarna kommer ut och som kryssat mig som kanske har något sätt att kontrollera sin hastigh...

Intro till PIC-mikrokontroller

ett minimum av vad du behöver för att få igång programmering PIC micros för användning i elektronik projekt (robotics, etc)Steg 1: Vad du behöver för projektet Obs: verkar som om du har windows XP, det finns ingen gratis PIC programmerare programvara...

Läder fodral Tutorial & Intro till grundläggande läder arbetande

God afton mina damer och herrar. I denna fina Instructable kommer jag att visa dig hur du skapar din egen läder påsar! Detta är också en stor inledande grundläggande läder arbeta.Om du har några frågor när det gäller handledning, gör din egen cosplay...

Intro till produktfotografering (för instructables)

detta instructable är avsedd för någon att göra en instructable eller slide show som inte tycks kunna få bra bilder eller kritiseras alltid om sina bilder. Dessa särskilda tips är avsedda för fotografering små till medelstora medelstora projekt som k...

Intro till IR bilder

detta är en kort och enkel intro i till IR-fotografering. Det finns en hel del grejer på IR-bilder men jag hade fortfarande att göra en massa prov och misstag och gräva att komma så långt som jag har gått. Mycket av det handlar om fotoredigering, men...

Intro till ölbryggning

Ett av de projekt som jag har velat prova sedan college är ölbryggning min egen öl. Som tur var en god vän till mig har viss erfarenhet i bryggning och erbjöd sig att ge mig en hand. I detta instructable, jag kommer att visa dig grunderna i ölbryggni...

Början Microcontrollers del 12: Intro till avbryter

I denna del av handledningen vi prata om avbrott arbeta till exempel med räknaren. Avbryter förbättra mikrokontroller i stort sätt. Avbryter göra din program reagerar på hårdvaran i microcontrollers, vilket kan vara en reaktion från circuit utanför m...

Början Microcontrollers del 13: Intro till LCD gränssnitt

Mikrokontroller är en underbar bit av ingenjörskonst och det kan göra många saker (med hjälp av några bra programmering), men det är fortfarande en ogenomskinlig svart låda. Om du vill att dela information, eller visa dig vad det försöker göra det, m...

Ett Intro till personlig PowerPoint-mallar

en av de svåraste sakerna att göra under ett affärsmöte eller föreläsning är att titta på en tråkig presentation. Eller kanske är du den som fastnade med att designa en PowerPoint för ditt företag eller grupp projekt. Detta instructable visar process...

Intro till SMD

SMD (eller surface mount enheter) är en ny teknik som bygger på redan gemensamma PCB styrelser ofta används i modern teknik. Men saker som iPhone blir smalare, tack till SMD. SMD har blivit populärt de senaste åren, och ursprungligen bara kunde ske g...

Intro till SMD lödning

många här tror SMD är omöjligt eftersom stiften är så små och löda vill klamra varje stift men det är faktiskt mycket lätt. Detta kommer att lära dig grunderna i SMD lödning om du bygga något som fungerar med SMD lödning och min tutorial hjälpt dig b...

Intro till Excel: bekostnad Tracker

Jag vilja protokollföra min månatliga utgifterna mönster för att få en bra känsla för hur mycket jag spendera i vissa kategorier, om jag går i månatliga underskott, etc. Jag har uppdaterat en anpassad kalkylblad i Microsoft Excel (kalkylbladsprogramm...

Intro till GPS med Microcontrollers

När faller av strikt militära operationer, GPS har blivit en regelbunden del av modern livsstil och på relativt kort tid! Vem skulle inte vilja veta när och var de är någonstans på planeten? Det är en science fiction-dröm i verkligheten, en nu så väv...

Laser minska telefonhållaren (Intro till akryl böjande)

har du någonsin varit irriterad av det faktum att du måste ladda den nära en tabell för att ladda telefonen (allmänt ganska fancy), eller, * suck *, lämnar enheten $100 + i händerna på golvet?Tja, så hade Bob, så han beslutat att göra en telefonhålla...

Intro till 3D-utskrifter

Vad är 3D utskrift?3D-utskrifter är en process för att göra ett fysiskt objekt från en tre-dimensionell digital modell, vanligtvis genom att fastställa många flera tunna lager av material. Ett enkelt sätt att visualisera detta skulle vara att tänka p...

Intro till LED Strips

LED strips är ett mycket roligt och effektivt sätt att ge massor av glöd och färg till ett projekt. I detta Instructable lär du dig de grundläggande typer av band och hur man kan koppla in dem till Intel Edison med Arduino breakout ombord. Dessa kret...