LOOKY LUKE. Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10. - Att välja en lyckosam väg EITF11 Digitala projekt

Relevanta dokument
Effektpedal för elgitarr

Thunder s Truck projektrapport

ETSA01 Digitala Projekt (I) VT- 13. Projektarbete AC Handledare Bertil Lindvall

Bilen som inte kan krocka

Växtviskaren EITF11 Digitala projekt VT15, I12

LTH. EITF11- Digitalaprojekt. Projektrapport WEB

JOFEN-Prototypes. Målsökande pansarvagn. Projektarbete i Kursen EITA15. Jonatan Claesson, Olle Jonasson, Felix Rödén, Edvin Rossi & Nils Olén

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

EITF11 - Digitala projekt. Hastighetsmätare. Hugo Backmyr Mattias Karlsson

High Core Remote Car X8000 Cool

EITF11: Bandkanon Grp 05

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Digitala Projekt(EITF40) - Larm

The Intelligent Timer

TEMPERATURMÄTARE MED GRAFRITARE

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

Linjeföljare Digitala projekt Johan Engström e02je Henrik Persson e02hp

Digitala Projekt(EITF40) - Larm

Digitala Projekt (EITF11)

DIGITALA PROJEKT (EITF40) Fartmätare

Feeding Daisy. EITF11 Lunds Tekniska Högskola. Grupp 12: Pontus Akervall Louise Landare Anton Schölin. En automatisk blomvattnare

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

Projektrapport - Feststation

Självgående fordon Rapport i kursen digitala projekt, EDI021

Väderstation. Digitala Projekt EITF11 Institutionen för Elektro- och Informationsteknik Lunds Tekniska Högskola

Digitala Projekt (EITF11) Hemlarm

Digitala projekt Linjeföljande bil

Projekt EITA15. Väckarklocka. LTH Ingenjörshögskolan vid Campus Helsingborg Datateknik

Digitalt Projekt: Radiostyrd Bil

Pulsmätare med varningsindikatorer

Projektrapport - Roterande digital LED-klocka

Temperaturmätare med lagringsfunktion DIGITALA PROJEKT EITF11 GRUPP 14, ERIK ENFORS, LUDWIG ROSENDAL, CARL MIKAEL WIDMAN

The Phenomenal Doorbell Bilaga 2. Källkod

DANCING ROBOT. EITF11, Grupp 10. Kajsa Salomonsson, Hugo Hedin och Petter Mårtensson

DIGITALA PROJEKT Väderstation

Rafiki Wa Kupanda. EITF11, Digitala projekt VT18. Linnea Håkansson, Anton Gunneberg, Ruben Schultz

EITF11. WormFight. Axel Eriksson, Felix Geuken Handledare: Bertil Lindvall EITF11

Från idé till skapelse av en äkta RoomBot

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

Liftmaestro. Lunds Tekniska Högskola Elektro- och informationsteknik. Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13

/* * dancing3.c * * Created: :53:20 * Author: digpi10 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

Projektrapport Målgång

Digitala Projekt: Digitala Projekt, EITF11 - VT17 Oscar Ahlgren, Patrik Lorentsson och Sten Hellberg Handledare: Bertil Lindvall

1 Bakgrund 4. 2 Kravspecifikation Definitioner Grundläggande krav Användarfall 5

Digitala Projekt (EITF11) Larmanläggning

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

EITF11 Digitala Projekt TIC TAC TOE. Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall

Rapportsammanfattning. Optima Sous Vide

Projektrapport i Digitala System

LUNDS TEKNISKA HÖGSKOLA. Väderstation. Digitala Projekt, EITF11. Martin Olofsson, I08 & Fredrik Oher, I08 Vt 2012

The Secure Light. Digitala Projekt EITF11. Hanna Tinglöf, I-12 Anna Horvath, I-12 Filippa Österlin, I-12. Handledare: Bertil Lindvall

RAPPORT: DIGITALA PROJEKT

Helena Harrysson och Linnéa Wickberg

Projektrapport i Digitala projekt EITF11. Institutionen för Elektro- och informationsteknik, Lunds tekniska högskola

Digitala Projekt EITF11 Grupp 9 Projektarbete Hanna Bondesson Marcus Skog. Reaktionsspel EITF11

Pulsmätare. EITF11 Digitala Projekt VT15. Grupp 9: Emma Albertz, Mathilde Hagander & Alexandra Mansner Handledare: Andreas Johansson & Bertil Lindvall

Avståndsmätare. Digitala System EITA Grupp 7. Abdelsalem Yabrag, Abdulhadi kikar, Fredrik Peterson, Jesper Annefors

Pulsmätare Digitala Projekt EITF11

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

Digitala projekt. Henrik Lundstedt Gustav Darpö

Mekanisk solros, Digitala projekt(edi021) Kristoer Nordvall, Stefan Windfeldt, Inlämmnad: 4 december 2006

Digitala Projekt VT13. PING-Pong

Digitala projekt - Radiostyrd bil

Lunds Tekniska Högskola. I-10 Grupp 11: David Sundström Max Schulz Albert Lundberg Handledare: Bertil Lindvall

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Institutionen för informationsteknologi

RemoteBud. Inlämnas: Patrik Johnsson, e01pjo Viktor Karlsson, e01vk

Guitar tuner Digitala Projekt (EITF40)

Rapport Digitala Projekt EITF Grupp 12 Elin Blomstergren, Victor Sundgren Handledare: Bertil Lindvall. Fyra i rad

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia

Laboration 5. Temperaturmätning med analog givare. Tekniska gränssnitt 7,5 p. Förutsättningar: Uppgift: Temperatur:+22 C

Linjeföljare. Digitala projekt

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Rapport i Digitala Projekt (EDI021)

EITF11 - Digitala Projekt

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

ELEKTRO- OCH INFORMATIONSTEKNIK. Radiostyrd bil. EITF11 Digitala Projekt. Thomas Bergsten & Marcus Halbauer

Projekt Digitala system. Rörelsekänsligt Larmsystem

PROJEKTTYP: Rapportsammanfattning STUDENTER: Larsson, J. ( ) och Oredsson, J. ( ) DATUM: 26 april, 2015

Det finns en handledning till kortet på hemsidan. AVR STK500.

Department of Information Technology Digitala projekt. SuperKull. Daniel Öhman Alexander Persson

EDI021 Digitala projekt. Rapport LARMSYSTEM. Utförd av: Niklas Eklund E03 David Olsson E04. Inlämnad:

Gustaf Backman, Anton Nystedt, Nicholas Peebo Battleships. Lunds tekniska högskola. EITF11 Digitala projekt

Robotfotboll med Arduino

Kla ggvisarskylt. -med en underton av rassel. av Jonathan So nnerup & Gabriel Jo nsson

Projektrapport - RoboWalter

DIGITALA PROJEKT - EITF11

Väderstation. EITF11, Digitala projekt RAPPORT. Isabella Bergvik, Emma Sandén & Hanna Åberg

AVR 5. Styrning av trafikljus. Digitala system 15 p

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Datorteknik 1 (AVR 1)

THE VISUAL EGGTIMER. Skola: Lunds Tekniska Högskola Institution: Elektro- och informationsteknik Kurs: Digitala projekt (EITF11)

Microprocessor / Microcontroller. Industrial Electrical Engineering and Automation

Transkript:

LOOKY LUKE - Att välja en lyckosam väg EITF11 Digitala projekt Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10 Handledare: Bertil Lindvall 2013-05-19

Abstract This project was done within the course EITF11 Digitala projekt at Lunds Tekniska Högskola, spring 2013. The course aims to teach how an industrial development project is executed. A prototype was created, programmed and tested. In this project an automotive vehicle which could avoid obstacles was built. A requirements specification was first written and approved by the mentor. The different components were then connected according to their datasheets. The foundation of the construction was an ATMega16 microcontroller. A servo was connected with a distance measuring sensor to turn the sensor in different directions. The sensor was used to detect obstacles in front of the vehicle. To move the vehicle caterpillar treads were used together with two engines. When turned on, the vehicle moves forward and continuously measures the distance to obstacles in front of it. When the distance reaches a critical level the vehicle stops. It then measures to the left and to the right, to determine a suitable new direction. The vehicle then reverses, makes a turn and continues driving forward in the new direction until another obstacle is detected. It has been a challenging and educational project. Especially in terms of working within unfamiliar areas and dealing with uncertainty. 1

Innehållsförteckning 1 Inledning... 3 2 Kravspecifikation... 3 2.1 Grundläggande krav... 3 2.2 Utökade krav... 3 3 Teori... 3 3.1 Hårdvara... 3 3.2 Mjukvara... 4 4 Metod... 4 4.1 Övergripande... 4 4.2 Beskrivet utifrån nyckelkomponenter... 5 5 Resultat... 6 6 Diskussion och analys... 7 7 Referenslista... 8 7.1 Datablad... 8 8 Bilagor... 9 8.1 Bilaga 1 Kopplingsschema... 9 8.2 Bilaga 2 Källkod... 10 2

1 Inledning Projektuppgiften inom kursen Digitala Projekt (EITF11) innefattade konstruktion av en prototyp. Prototypen skulle sedan byggas, programmeras i C samt testas. Samtidigt skulle lämplig dokumentation göras så att prototypen kan återskapas och/eller vidareutvecklas. I den här rapporten beskrivs arbetet med att utveckla ett självgående fordon som ska kunna undvika hinder. Fordonet ska köra framåt tills den stöter på ett hinder. Den ska då stanna och avgöra ny lämplig riktning, för att sedan fortsätta köra i denna riktning. Som grund för konstruktionen tillhandahölls en mikroprocessor, ATMega16. 2 Kravspecifikation 2.1 Grundläggande krav Nedan följer kraven på de grundläggande egenskaperna prototypen ska uppfylla. Fordonet ska: Kunna köra framåt, bakåt, svänga höger och vänster. Kunna läsa av sin omgivning och undvika hinder genom att avgöra ny lämplig riktning att fortsätta köra i. Fordonet ska vara batteridrivet. 2.2 Utökade krav De utökade kraven tas till hänsyn i mån av tid. Nedan följer kraven på de utökade egenskaperna prototypen i mån av tid ska uppfylla. Fordonet ska: Signalera med ljus vid hinder, till exempel blinkers. Kunna koppla ifrån sensorn och fjärrstyras. 3 Teori 3.1 Hårdvara Nedan beskrivs de hårdvarukomponenter som användes i prototypen. 3.1.1 Mikroprocessor ATMega16 ATMega16 är en 8-bits mikroprocessor med 16kB programmerbart flash-minne som programmeras i C. Processorn har 32 programmerbara I/O-pinnar och ett JTAG interface för debugging. Mikroprocessorn innehåller även AD-omvandlare samt tre timers/counters med möjlighet till både interna och externa avbrott. Driftspänningen är 4,5 5,5 V. 3.1.2 Servomotor Parallax #900-00005 Parallax-servon är en servomotor som genom pulsvågsmodulation kan hålla positioner mellan 0 och 180 grader. Servot kräver pulser var 20:e ms, där positionen för servot avgörs av pulslängden (0,75 2,25 ms). Driftspänningen är 4-6 V. 3.1.3 Avståndsmätare SHARP GP2Y0A02YK Avståndsmätaren kan genom triangulering via sin sensor mäta avståndet till objekt på 20 till 150 centimeters avstånd från sensorn. Avståndsmätaren mäter avstånd genom att skicka ut en IR-stråle som reflekteras på objektet framför. Avståndet avspeglas i spänningen på den analoga signal som 3

sensorn skickar ut. Ju längre från avståndsmätaren objektet befinner sig, desto lägre blir spänningen. Driftstpänningen är 4,5 5,5 V. 3.1.4 H-brygga Dual Full-Bridge Driver L298 Dual Full-Bridge Driver L298 innehåller två H-bryggor som används för att ändra riktningen på likström. Dessa kan användas för att styra exempelvis motorer. Den klarar av en driftsspänning på upp till 46 V. 3.1.5 Spänningsregulator LP3855 LP3855 reglerar spänningen ut till en konstant spänning, exempelvis från 6 V på ett batteri till 5 V som mikroprocessorn ATMega16 behöver. Driftspänningen är 2,5 7,0 V. 3.1.6 Larvfötter Larvfötter med tillhörande likströmsmotorer. Driftspänningen är 6 V. 3.1.7 Lysdioder Röd, gul och grön lysdiod med driftspänning 2 V. 3.1.8 Strömbrytare Enkel på/av-strömbrytare. 3.1.9 Batteri Laddningsbart batteri med en spänning på 6 V. 3.2 Mjukvara Nedan beskrivs den mjukvara som användes i projektet. 3.2.1 PowerLogic PowerLogic är en mjukvara som kan användas för att rita allt från enkla till avancerade kopplingsscheman. 3.2.2 AVR Studio 4 AVR Studio 4 är en integrerad utvecklingsplattform för utveckling och debugging av bland annat AVRmikroprocessorer. I AVR Studio 4-miljön skrivs, byggs och debuggas applikationer i C/C++ eller assemblerkod. 4 Metod 4.1 Övergripande Första delen av projektet bestod i att skriva en kravspecifikation (se 2 Kravspecifikation) som i korta drag beskrev konstruktionens tänkta egenskaper. Ur kravspecifikationen kunde de olika komponenterna som skulle ingå i konstruktionen sedan härledas. Med hjälp av datablad för respektive komponenter togs ett kopplingsschema fram som ritades med hjälp av programmet PowerLogic. Se Bilaga 1. När kopplingsschemat var godkänt av handledare började konstruktionsdelen av projektet. Förutom de grundläggande komponenterna beskrivna i avsnitt 3.1 användes resistorer, kondensatorer, sladdar, lödtenn, skruvar, muttrar samt ett tomt kretskort som utgjorde basen för elektroniken. De 4

elektriska komponenterna löddes eller virades ihop enligt kopplingsschemat. Kretskortet skruvades sedan fast på larvfötterna. Då alla komponenter var påmonterade kopplades konstruktionen till en 5 V-strömkälla samt en dator genom JTAG-interfacet. I AVR Studio 4 programmerades och felsöktes det tills fordonet fick önskat beteende. Även korrigeringar i hårdvaran fick göras allt eftersom fel upptäcktes. 4.2 Beskrivet utifrån nyckelkomponenter Spänningsregulatorn Fordonet ska drivas av ett 6 V-batteri. Mikroprocessorn och avståndsmätaren behöver däremot en spänning på 5 V, varför en spänningsregulator måste användas för att omvandla spänningen till 5 V för dessa komponenter. Larvfötterna För att kunna driva larvfötternas två 6 V-motorer samt kunna låta dessa byta riktning behövs H- bryggor. Genom dessa kan de två motorerna styras separat och köras i båda riktningar med hjälp av mikroprocessorn. För att bestämma hastigheten på motorerna används pulsbreddsmodulering. Avståndsmätaren Då fordonet ska kunna upptäcka hinder under tiden den kör mäter avståndsmätaren kontinuerligt sin omgivning. För att kunna använda resultatet från avståndsmätaren måste den analoga utsignalen från IR-sensorn först omvandlas till digital. Detta görs genom att använda mikroprocessorns interna AD-omvandlare. För att få maximal upplösning på AD-omvandligen behövs en inputklockfrekvens mellan 50kHz och 200kHz. Då mikroprocessorn är inställd att arbeta på 8MHz väljs 128 som prescaler, vilket ger en inputfrekvens på 62,5 khz. För att avläsa resultaten av AD-omvandlingarna används avbrott. Servot För att ställa in servot i rätt läge behövs pulser på 0,75-2,25 ms i internvall om 20 ms. För att åstadkomma dessa används mikroprocessorns interna timer. Genom att välja 8 som prescaler och låta mikroprocessorn generera avbrott var 100:e klockslag görs avbrott varje 0,1 ms då mikroprocessorn är inställd på 8 MHz. För att få intervall om 20 ms låter man en count-variabel öka ett steg vid varje avbrott, och låta den gå i cykler från 0 till 200. Med hjälp av denna count-variabel kan pulser skickas till servot för att ställa denna i önskat läge. 5

5 Resultat Den färdiga prototypen fungerar i enlighet med kravspecifikationen. Av de utökade kraven införlivades den om signalering, medan fjärrstyrningen uteblev på grund av tidsbrist. Bild 1. Färdig konstruktion. 6

6 Diskussion och analys Projektet har varit roligt, utmanande och lärorikt. Vi har fått angripa problem inom områden som vi tidigare saknade erfarenhet av. Vi har aldrig tidigare arbetat med elektroniska komponenter på det här sättet, och vi har tidigare inte tittat på kopplingen mellan just hårdvara och mjukvara. Vidare har vi under projektet programmerat i C, vilket är nytt för oss. Instruktionerna för projektet var vaga, och stort ansvar lades på projektgrupperna att själva bestämma upplägg och arbetsmetoder. Generellt har projektet präglats av osäkerhet. En osäkerhet som man har blivit tvungen att lära sig hantera. Vi valde att göra ett självgående fordon eftersom det verkade som ett kul projekt, samtidigt som resultatet är väldigt konkret. Man får helt enkelt se fordonet röra sig, servot vridas, lampor tändas/släckas etc. Under projektets gång stötte vi dock på flertalet utmaningar. Den första utmaningen bestod av att bekanta sig med facktermer och förstå hur datablad används, för att därefter förstå hur de olika komponenterna skulle kopplas ihop. Så fort kopplingsschemat var klart gick det relativt snabbt att koppla ihop och bygga fordonet. Då fordonet var färdigbyggt ägnade vi en del tid åt att testa de enskilda komponenterna genom att manuellt slå på och av portar genom AVR Studio:s debug-läge. Därefter var det dags att börja programmera. Vi ägnade mycket tid åt att få servot att fungera. Här handlade det framför allt om att lära sig hur mikroprocessorns interna timer fungerar, samt vad avbrott innebär och hur dessa kan utnyttjas. Grundfaktan fanns i databladen, men för att förstå hur man skulle applicera denna behövdes ytterligare hjälp. Genom mycket googlande och en del handledning lyckades vi till slut få servot att fungera. Något som försvårade programmeringen av servot var att vi under våra avbrott utförde för processorkrävande kommandon utan att vi tänkte på det. Vi hade helt enkelt gjort misstaget att tänka på tidskomplexitet som vi tidigare gjort vid exempelvis Java-programmering, utan att reflektera över vad ett enskilt kommando faktiskt innebär för en mikroprocessor. Nästa stora utmaning låg i att förstå hur avståndsmätaren fungerade. Efter att ha ägnat en stor del av tiden åt att ha felsökt i koden upptäckte vi att det inte var koden det var fel på, utan att felet helt enkelt berodde på glapp i en av kontakterna. Då glappet var åtgärdat fungerade avståndsmätaren utan problem. Det var dock en lång process, med många kreativa lösningar på eventuella felkällor innan vi kunde isolera felet. Mot slutet av projektet hade vi lyckats programmera de enskilda komponenterna var för sig, men det blev fel när vi försökte integrera dessa. Ett stort genombrott kom här då det visade sig att mikroprocessorn var inställd på att optimera den kod vi skrivit. Detta innebar i sin tur att processorn helt enkelt hoppade över vissa kodrader. Då vi tog bort den här optimeringen fungerade plötsligt allt som tänkt. Vår sista utmaning låg i att mikroprocessorn inte betedde sig likadant då den var inkopplad med JTAG som då den var frånkopplad. Genom att lägga till några kondensatorer kunde dock även det här felet åtgärdas. 7

7 Referenslista 7.1 Datablad ATMega16: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/processors/atmega16.pdf Dual Full-Bridge Driver: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/analog/linear/l298.pdf LP3855: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/analog/voltage/lp3855.pdf SHARP GP2Y0A02YK: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/sensors/gp2y0a02.pdf Parallax #900-00005: http://www.parallax.com/portals/0/downloads/docs/prod/motors/900-00005-stdservo-v2.2.pdf 8

8 Bilagor 8.1 Bilaga 1 Kopplingsschema 9

8.2 Bilaga 2 - Källkod #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> uint8_t stopdist, dist1, dist2, leftdist, rightdist, count, leftdir, rightdir, middir, servodir, nextaction, lefte, righte; int dist, measuretime, reversetime, turningtime; long pausetime; _Bool obstacle, nextdist; void main(void) { setup(); wait(15000); forwardengines(); PORTB = 0x01; //Green light while (1) { if (pausetime > 0 ) { continue; if (obstacle) { PORTB = 0x04; //Red light stopengines(); scout(); PORTB = 0x02; //Yellow light changedirection(leftdist <= rightdist); PORTB = 0x01; //Green light forwardengines(); obstacle = 0; void setup() { setupports(); setuptimer(); setupadc(); setupvariables(); sei(); //Enable global interrupts, used by timer and ADC void setupports() { DDRD = 0xFF; //Configure Port D as output DDRB = 0xFF; //Configure Port B as output DDRA = 0x00; //Configure Port A as input DDRC = 1 << PORTC0; //Configure PORTC0 as output void setuptimer() { TCCR0 = 0x02; //Prescaler = 8 TCNT0 = 0x00; //Start count = 0 TIMSK = 0x02; //Enable Timer/Counter0 Overflow Interrupt 10

OCR0 = 100; //Max count void setupadc() { //8 000 000/50 000 = 160, 8 000 000 / 200 000 = 40 => choose prescaler: 128 ADCSRA = 1 << ADPS2; //Prescaler: 128 ADCSRA = 1 << ADPS1; //Prescaler: 128 ADCSRA = 1 << ADPS0; //Prescaler: 128 ADMUX = 0x60; //internal voltage, left adjusted, use ADC0 ADCSRA = 1 << ADIE; ADCSRA = 1 << ADEN; ADCSRA = 1 << ADSC; //Start next conversion void setupvariables() { count = 0; pausetime = 0; middir = 13; leftdir = 18; rightdir = 8; servodir = middir; dist = 0; dist1 = 0; dist2 = 0; leftdist = 0; rightdist = 0; stopdist = 120; //Bigger value => shorter distance. Default stopdist = 130 nextaction = 1; nextdist = 1; obstacle = 0; reversetime = 3000; //Default reversetime = 5000 measuretime = 5000; //Default measuretime = 7500 turningtime = 6500; //Default turningtime = 6500 lefte = 128; //Default lefte = 68 righte = 98; //Default righte = 60 void wait(int time) { pausetime = time; while (1) { if (pausetime <= 0) { return; void scout() { changesensdirection(rightdir); rightdist = dist; 11

changesensdirection(leftdir); leftdist = dist; changesensdirection(middir); void changesensdirection(int dir) { servodir = dir; wait(measuretime); void changedirection(_bool dir) { //true = turn left, false = turn right reverseengines(); wait(reversetime); stopengines(); wait(measuretime); lefte = 90; righte = 82; if (dir) { turnleft(); else { turnright(); wait(turningtime); lefte = 128; righte = 98; stopengines(); wait(measuretime); void forwardengines() { PORTD = 0x3C; void reverseengines() { wait(measuretime); PORTD = 0x66; void stopengines() { PORTD = 0x00; void turnleft() { rightengine(); reverseleftengine(); void turnright() { leftengine(); reverserightengine(); void rightengine() { PORTD &= ~(1 << PORTD1); PORTD = 1 << PORTD2; 12

PORTD = 1 << PORTD3; void leftengine() { PORTD = 1 << PORTD4; PORTD = 1 << PORTD5; PORTD &= ~(1 << PORTD6); void reverseleftengine() { PORTD &= ~(1 << PORTD4); PORTD = 1 << PORTD5; PORTD = 1 << PORTD6; void reverserightengine() { PORTD = 1 << PORTD1; PORTD = 1 << PORTD2; PORTD &= ~(1 << PORTD3); //Timer0 overflows every 0.1 ms ISR(TIMER0_COMP_vect) { //Update counters count++; if (count == 200) { count = 0; if (pausetime > 0) { pausetime--; //Sensor position if (count == 0) { PORTC = 1 << PORTC0; if (count == servodir) { PORTC &= ~(1 << PORTC0); //Engine power if (count == 0) { PORTD = 1 << PORTD2; PORTD = 1 << PORTD5; if (count == righte) { PORTD &= ~(1 << PORTD2); if (count == lefte) { PORTD &= ~(1 << PORTD5); 13

TCNT0 = 0x00; //Resets timer count //Handle conversion ISR(ADC_vect) { //Get average distance if (nextdist) { dist1 = ADCH; nextdist = 0; else { dist2 = ADCH; dist = (dist1 + dist2); dist = dist >> 1; nextdist = 1; if (dist > stopdist) { obstacle = 1; ADCSRA = 1 << ADSC; //Start next conversion //Catch unintended interrupts ISR(BADISR_vect) { 14