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

Relevanta dokument
LTH. EITF11- Digitalaprojekt. Projektrapport WEB

Thunder s Truck projektrapport

Bilen som inte kan krocka

High Core Remote Car X8000 Cool

Växtviskaren EITF11 Digitala projekt VT15, I12

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

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

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

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

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

Effektpedal för elgitarr

Digitala Projekt(EITF40) - Larm

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

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

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

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

DIGITALA PROJEKT (EITF40) Fartmätare

Digitala projekt Linjeföljande bil

Pulsmätare med varningsindikatorer

TEMPERATURMÄTARE MED GRAFRITARE

EITF11: Bandkanon Grp 05

Linjeföljare. Digitala projekt

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

RAPPORT: DIGITALA PROJEKT

Projektrapport - Roterande digital LED-klocka

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

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

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

DIGITALA PROJEKT Väderstation

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

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

Projektrapport i Digitala System

Digitala projekt - Radiostyrd bil

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

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

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

Projektrapport Målgång

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

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

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

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

Digitala Projekt (EITF11)

The Phenomenal Doorbell Bilaga 2. Källkod

Digitala Projekt(EITF40) - Larm

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

Digitalt Projekt: Radiostyrd Bil

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

Pulsmätare Digitala Projekt EITF11

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

The Intelligent Timer

Laboration 5 C-programmering på AVR TSEA57 Datorteknik I

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

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Innehåll. 1 Inledning 3

Institutionen för informationsteknologi

Enchipsdatorer med tillämpningar LABORATION 7, ROBOT

Digitala Projekt (EITF11) Hemlarm

Rapport i Digitala Projekt (EDI021)

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

Guitar tuner Digitala Projekt (EITF40)

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

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

DEPARTMENT OF INFORMATION TECHNOLOGY. Digitala Projekt. Redovisning av Projekt - Grupp 14

Digitala projekt. Henrik Lundstedt Gustav Darpö

Helena Harrysson och Linnéa Wickberg

Projektrapport - RoboWalter

Micro:bit och servomotorer

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

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

Träff 1 - Introduktion

Elektro och Informationsteknik LTH. Laboration 6 A/D- och D/A-omvandling. Elektronik för D ETIA01

Projektrapport - Feststation

Design av inbyggda system

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Digitalteknik: CoolRunner-II CPLD Starter Kit

Datorteknik 1 (AVR 1)

Digitalteknik: CoolRunner-II CPLD Starter Kit Med kommentarer för kursen ht 2012

Formula Blue. Digitala Projekt 8p. Jesper Ferm E02 Carl Hakenäs E04

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

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

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

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

Källkod. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define green_diode PD5. #define RS PD4

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

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

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

Accelerometer. Rikard Ekström Mattias Kindborg. Informationsteknologi Lunds Universitet

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

Design vid utveckling av inbyggda system

Design av inbyggda system

Systemkonstruktion Z3

Digitala projekt rapport

Temperaturregleringssystem

Elektro och Informationsteknik LTH. Laboration 3 RC- och RL-nät i tidsplanet. Elektronik för D ETIA01

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

Servicemanual. Autonomous Pallet System 800 Prototyp. Utfärdat:

Digitala Projekt(EITF40) Robert Linjeföljaren

Experiment med schmittrigger

Digitala Projekt (EITF11) Larmanläggning

Transkript:

Självgående fordon Rapport i kursen digitala projekt, EDI021 Nina Wirandi e04nw Mårten Kjellsson e04mk Handledare: Bertil Lindvall Mars 2010

Abstract This project was for the course Digital Systems, EDI021 at LTH. The project was chosen to be a vehicle that had the ability to drive around without hitting something. The components used was one microprocessor Atmel AVR mega32, one servo, one dual full-bridge driver L298, one long distance measuring sensor GP2Y0A02YK, two engines, one linear regulator LP3855 and a 6V battery. At first all the components were tested individually and then they were put together. The servo and the long distance measuring sensor was working successfully together but when the engines were connected as well, it didn't work. To overcome the problem the delays were deleted and the code was put into overflow interrupts. As a last thing the microprocessor was put in a sleep-mode while it was waiting for an interrupt to execute. In the end the vehicle was working successfully. The servo was sitting at the front of the vehicle and spinning from one end to the other. On top of the servo the long distance measuring sensor was put to look if there was anything in the way for the vehicle. The sensor was sending an analogue signal to the processor and the A/D-converter converted the signal to a digital value. When something were in the way for the vehicle the signal was decreased to one of the engines and the speed was reduced on that side that made the vehicle turn. 2

Innehåll Abstract...2 Innehåll...3 Inledning...4 Kravspecifikation...5 Teori...5 Processor...5 Servo...6 H-brygga...6 Avståndsgivare...7 Motorer...7 Spänningsregulator...7 Utförande...7 Resultat...8 Källförteckning...10 Bilagor...11 Bilaga 1: Kopplingsschema...11 Bilaga 2: Källkod...12 Bilaga 3: Bilder...15 3

Inledning Det här projektet ingick i kursen digitala projekt, EDI021, på LTH. Syftet med kursen var att få känna på hur ett utvecklingsarbete ute i arbetslivet kan gå till och att utvidga sina kunskaper inom digitaltekniken. Projektet valdes till en självgående fordon som skulle kunna köra omkring och väja för saker som dök upp i dess färdriktning. Detta val gjordes på grund av en viss förkärlek för saker som rör sig. 4

Kravspecifikation Det första som skulle göras var att skriva en kravspecifikation på vad fordonet skulle ha för egenskaper. Som krav sattes följande; Ett självgående fordon på hjul som ska kunna: 1. Köra rakt fram 2. Svänga höger och vänster 3. Känna att något är framför den och då kunna svänga åt ett håll där det inte är något i vägen 4. Stänga av drivmotor då den lyfts från marken 5. Stanna I mån av tid ska fordonet kunna: 1. Backa sig ur ett hörn 2. Ha någon radiokontakt så att den kan gå att styras med yttre påverkan Teori De olika komponenterna som användes i projektet var följande; Processor Mikroprocessorn som används i projektet var en Atmel AVR ATmega32. Detta är en processor som har en klockfrekvens på upp till 16MHz som innehåller många integrerade funktioner så som; intern klocka, A/D-omvandlare, 2KB SRAM, 1KB EEPROM, 32KB programmerbart minne, avbrottsrutiner, 32 I/O-pinnar med flera. Alla dessa funktioner styrs av en stor mängd så kallade styrregister som består av 8-bitar data per register. ATmega32 och de flesta andra processorer i AVR-serien används, på grund av sin låga kostnad och stora flexibilitet, till vardags inom väldigt många områden, allt från tvättmaskiner till hobbyprojekt. Att processorer i AVR-serien är väldigt strömsnåla och relativt lätthanterliga gör dem eftertraktade trots att de funnits i nästan 15 år och att det i dag finns ett flertal bättre processorer. 5

32 av pinnarna på atmega32 är I/O-pinnar. Dessa kan styras individuellt om de ska fungera som input eller output. 8 av dessa är analoga ingångar med inbyggd A/D-omvandlare som kan användas vid behov. I projektet användes fyra av I/O-pinnarna, två till att styra motorer, en till att styra servon och en till att läsa av avståndsgivaren.[1] Servo Servo används i bred utsträckning i bland annat robotar, fordon och i radiostyrda flygfordon. På servon som användes i projektet satt det en mekanisk axel, dit en potentiometer var kopplad. Potentiometerns spänning indikerade åt vilket håll som axeln skulle vridas. På servon satt det tre stycken anslutningar, en för jord, en för matningsspänning och den sista för kontrollsignal. Till kontrollanslutningen skulle det skickas en PWM-signal (pulse width modulated) för att indikera önskad position på servons axel. Servo hade en rotationsvinkel på 90 och PWM-signalen hade en bredd som varierar mellan en och två millisekunder, se figur nedan.[2] H-brygga En H-brygga används för att styra en högre spänning med hjälp av en lägre signal till bryggan. L298 som används i detta projekt är en krets som innehåller två H-bryggor, vilket passar väldigt lägligt då det är två motorer som ska styras. Signalen till H-bryggan styrs med två separata PWM-signaler från processorn.[3] 6

Avståndsgivare I det här projektet användes avståndsgivaren GP2Y0A02YK, från SHARP. Avståndsgivaren kunde detektera ett föremål som befann sig inom ett avstånd på 20 till 150 centimeter från själva givaren. Avståndsgivaren hade tre anslutningar, en till matningsspänningen, en till jord och en för signal. Via signalanslutningen skickade avståndsgivaren en analog signal, vars spänning berodde på avståndet till föremålet. [4] Motorer För att fordonet skulle förflyttas framåt behövdes det någon form av motor som drev. För att kunna styra utan ett svänghjul användes det två DC-motorer för framdrift. Dessa styrdes separat med hjälp av två H-bryggor och separata PWM-signaler från processorn. Detta för att kunna ställa olika spänning till dem så fordonet blev styrbart. Spänningsregulator Spänningsregulatorn som användes var en LP3855 från National Semiconductor. Denna specifika spänningsregulator var bra då den gav en stabil 5V utsignal, vilket var ett krav för att mikroprocessorn skulle fungera önskvärt. Spänningsregulatorn krävde en insignal mellan +2,5 och +7,0 V. Spänningsregulatorn hade 5 anslutningar, en SD (shutdown),en SENSE, en för matningsspänning, en för jord, en för utspänningen. [5] Utförande Ett tidigt moment i arbetet var att rita ett kopplingsschema, se bilaga 1. Nästa steg var att styra varje enskild komponent med hjälp av processorn, utan inblandning av övriga komponenter. För att styra servon behövdes det genereras en pwm-signal som hålls hög mellan en och två millisekunder, följt av mellan 25 och 35millisekunder låg signal för att flytta motorn från ena sidan till den andra. Detta åstadkoms genom att ställa in OCR2 på processorn som utsignal och att ställa in dess klocka, TCNT2, till att skicka ut pulser på 33millisekunder. Då servon skulle pendla från ena sidan till andra sattes det från början en while-loop som räknade upp till ett lagom värde för att generera en puls till den ena sidan för att sedan räkna ner denna igen tills servon styrts till den andra sidan. Efter projektets gång byttes detta system med while-loop ut till förmån för ett avbrottsbaserat styrsystem. 7

Avståndsgivaren som användes behövde läsas av vid de tillfällen det skulle kontrolleras om något var i vägen för fordonet. Detta åstadkoms genom att koppla in avståndsgivaren till pinne PA0 och aktivera A/D-omvandlaren i processorn för denna pinne. För att sedan få ett lagom brytvärde på signalen från avståndsgivaren då fordonet skulle svänga testades detta ut genom att hålla något framför givaren och läsa av den genom JTAGen i datorn. Nästa steg var att koppla in de båda motorerna och för att kunna styra dem så behövdes en Hbrygga. Pinnarna OC1A och OC1B på processorn sattes som utsignaler till H-bryggan. För att enklare kunna styra motorernas hastighet användes en puls på 20 millisekunder genom att ha en 1MHz klocka med ett maxvärde på 20000. Då det inte användes ett styrhjul så styrdes fordonet med den enkla metoden att sänka signalen till den motorn som satt på den sida som fordonet skulle svänga mot. Processorn krävde en stabil matningsspänning på 5V och till förfogande fanns det ett batteri på 6V, därför krävdes det en spänningsregulator som skulle sänka batteriets signal. Den som användes hette LP3855 och för att få denna att fungera som önskat kopplades en resistor på 10 kω mellan SD-pinnen och batteriet samt att Vut- och SENSE-pinnen kortslöts. När alla enskilda komponenter fungerade som önskat så kopplades de ihop på en kopplingsplatta enligt kopplingsschemat i bilaga 1. Efter att alla komponenter var inkopplade på kopplingsplattan så bestämdes det vid vilka punkter som resultatet från avståndsgivaren skulle noteras. Om då värdet på OCR2 gav ett värde som indikerar på att ett föremål existerar inom ett lagom avstånd så sänktes signalen till H-bryggan, vilket resulterade i att motorhastigheten på aktuell motor sänktes och i förlängningen att fordonet svängde. Resultat I det tidiga skedet av projektet då alla komponenter skulle styras utan inblandning av övriga så fungerade alla komponenter önskvärt. Nästa steg var att att styra servon tillsammans med avståndsgivaren och även detta fungerade önskvärt. Även inkoppling av batteri och spänningsregulatorn fungerade utan några problem. 8

Nästa steg i projektet var att koppla in H-bryggan och båda motorerna. Det var då problemen började dyka upp. Om enbart motorerna kördes utan inblandning av servon och avståndsgivaren så fungerade dom. Men så fort motorerna skulle köras samtidigt som servon och avståndsgivaren så började servon att då och då stanna upp i ett slags vänteläge och efter en stund så startade den igen. Efter mycket sökande så upptäcktes det att detta berodde på att processorn startade om då motorerna startade. För att åtgärda detta så plockades delayerna bort. Delayerna användes mellan varje steg som servon tog för annars så snurrade den för fort. Sedan lades koden då värdena på avståndsgivaren kontrollerades in i en overflow interrupt och koden för hur servon skulle röra sig in i en annan overflow interrupt. Dock så kvarstod problemet med att processorn startade om men det löstes av att processorn sattes i viloläge i väntan på att få ett avbrott. Då började komponenterna att fungera som önskat och fordonet testades för att ställa in de slutgiltiga värdena på motorhastigheten och när avståndsgivaren skulle avläsas och på vilka avstånd värdena från avståndsgivaren skulle registreras. Då en strömbrytare till batteriet hade kopplats in så beslöts det att krav nummer fyra i kravspecifikationen inte behövdes. Det slutgiltiga resultatet blev att fyra av fem punkter i kravspecifikationen var uppfyllda. Fordonet kunde således köra rakt fram, till höger, till vänster, väja för hinder i dess färdriktning samt stanna vid oundviklig krock. 9

Källförteckning [1] Processor: Atmel AVR mega32, www.avrfreaks.net Februari 2010 [2] Servo motor control using AVR, WinAVR AVR-GCC Tutorial, www.winarv.scienceprog.com, Februari 2007 [3] Datablad: Dual full-bridge driver L298 www.st.com/stonline/books/pdf/docs/1773.pdf, Juli 2005 [4] Datablad: Long Distance Measuring Sensor GP2Y0A02YK, SHARP [5] Datablad: LP3852/LP3855 1.5A Fast Response Ultra Low Dropout Linear Regulators, National Semiconductor, Juli 2005 10

Bilagor Bilaga 1: Kopplingsschema 11

Bilaga 2: Källkod #include <avr\io.h> #include <avr\interrupt.h> #include <avr\sleep.h> #include <util\delay.h> #define FCPU 80000000UL void startvalues(); void setreg(); //---------------------- Variabler --------------------volatile int motorfart; //Max-puls till motor volatile int max; //Maximal hög puls - Vänster(i färdriktning) volatile int min; //Minimal hög puls - Höger(i färdriktning) volatile int step; //Storlek på steg mellan min och max volatile uint16_t delay; //Delay mellan steg volatile int turnvalue; //Värde på avståndsgivare då fordon ska svänga volatile int breakpoint; volatile int valueset; //-----------------------------------------------------int main(void) { setreg(); startvalues(); OCR1B = motorfart; OCR1A = motorfart; OCR2 = min; sei(); while(1){ sleep_mode(); ISR(TIMER1_OVF_vect){ //Startvärde för hög puls på servo //Tillåt avbrott //Overflowavbrott för timer 1,används för kontroll av hinder if (OCR2<=min+5){ //Sväng vänster om hinder till höger if(valueset==0){ if (ADCH > turnvalue){ OCR1A = motorfart/8; valueset=1; else OCR1A = motorfart; if (OCR2>=max-5){ //Sväng höger om hinder till vänster if(valueset==0){ if (ADCH > turnvalue){ OCR1B = motorfart/8; valueset=1; else OCR1B = motorfart; 12

if (OCR2<=min+10 && OCR2>min+5){ //Sväng vänster om hinder snett fram till höger if(valueset==0){ if (ADCH > turnvalue+20){ OCR1A = motorfart/6; valueset=1; else OCR1A = motorfart; if (OCR2>=max-10 && OCR2<max-5){ //Sväng höger om hinder snett fram till vänster if(valueset==0){ if (ADCH > turnvalue+20){ OCR1B = motorfart/6; valueset=1; else OCR1B = motorfart; if(ocr2 >= max/2+min-10 && OCR2 <= max/2+min+10 ) valueset=0; if(ocr2>=47 && OCR2<=48){ if (ADCH > 140){ OCR1A=0; OCR1B=0; ISR(BADISR_vect) // Uppsamlingsinterruptvektor { //Används för att fånga avbrott som inte är definierade ISR(TIMER2_OVF_vect){ if(breakpoint==1){ OCR2-=step; if(ocr2<=min){ breakpoint=0; //Overflowavbrott, snurrar servo fram och tillbaka //Vänster till höger //Min-läge else{ OCR2+=step; //Höger till vänster if (OCR2>=max){ breakpoint=1; //Max-läge 13

void setreg(){ // Avståndsgivare // Ad-omvandlare - Prescaler på 8 ger vettiga värden att hantera DDRA =~_BV(PA0); ADMUX = _BV(REFS0) _BV(ADLAR); ADCSRA = 0x00; ADCSRA = _BV(ADEN) _BV(ADSC) _BV(ADATE) _BV(ADPS0) _BV(ADPS1); //Fast PWM mode på timer1 TCCR1A = _BV(WGM11) _BV(COM1A1) _BV(COM1B1); //Enablea Overflow interrupt för Timer2 och Timer1 TIMSK = _BV(TOIE2) _BV(TOIE1); //Timer1 prescaler //Prescaler på 8MHz ger klocka på 1MHz TCCR1B = _BV(CS11) _BV(WGM12) _BV(WGM13); //Timer2 prescaler //Prescaler på 1024 ger puls på 8MHz/1024/256 = 33ms = 30,5 Hz TCCR2 = (_BV(COM21) _BV(WGM21) _BV(WGM20) _BV(CS22) _BV(CS21))&~_BV(CS20); //Reset TCNT2 TCNT2 = 0x00; //Reset TCNT1 TCNT1H = 0x00; TCNT1L = 0x00; //Sätt OC1A/B och OC2 pinnar till output DDRD = _BV(PD4); //OC1B DDRD = _BV(PD5); //OC1A DDRD = _BV(PD7); //OC2 void startvalues(){ //Topvärde på TCCR1 till 20000 => puls på 20ms = 50 hz ICR1 = 20000; valueset = 0; //Variabel som säger om hinder har hittats på det senaste halv-varvet breakpoint = 0; //--------- Konfigurationer av startvärden --------//Startvärde för dc-motorer motorfart = 20000; //Värden för servo max = 80; //Maximal hög puls - Vänster(i färdriktning) min = 7; //Minimal hög puls step = 1; //Värde på steg mellan min och max delay = 35; //Delay mellan steg //Avståndsgivare turnvalue = 100; //Värde då fordon ska svänga //------------------------------------------------- 14

Bilaga 3: Bilder 15