Institut for Elektro- og Computerteknologi Elektronik, Elektrisk energiteknologi og Softwareteknologi Semesterprojekt 1 ”Bilen” SW1 1. Semester PRJ1 16/6-2023 Aarhus Universitet #1 Stud.nr.: 202208165 #2 Stud.nr.: 202210045 #3 Stud.nr.: 202209871 #4 Stud.nr.: 202104844 #5 Stud.nr.: 201805439 Navn: Lasse Borring Petersen Navn: August Lind Hansen Navn: Altaf Rezai Navn: Louise Andersen Navn: Kim Van Le Vejleder: Thomas Nielsen PRJ1 SW1 1. Problemformulering............................................................................................................................ 5 2. Kravspecifikation ................................................................................................................................. 9 2.1 Aktør-kontekst diagram .................................................................................................................... 9 2.2 Funktionelle krav............................................................................................................................. 10 2.3. Ikke-funktionelle krav: ................................................................................................................... 12 3. Accepttestspecifikation ..................................................................................................................... 14 3.1 Accepttestspecifikation for funktionelle krav (use cases) .............................................................. 14 Use case 1: ............................................................................................................................................ 14 Use case 2: ............................................................................................................................................ 15 Use case 3: ............................................................................................................................................ 16 Use case 4: ............................................................................................................................................ 17 Test af ikke-funktionelle krav ................................................................................................................ 18 4. Systemarkitektur (HW og SW) .......................................................................................................... 21 4.1 Hardwarearkitektur......................................................................................................................... 21 4.1.1 BDD-diagram ................................................................................................................................ 21 4.1.2 IBD-diagram ................................................................................................................................. 22 4.1.3 Signalbeskrivelse .......................................................................................................................... 23 4.2 Softwarearkitektur .......................................................................................................................... 25 4.2.1 Moduldiagram.............................................................................................................................. 26 4.2.2 Modulbeskrivelse ......................................................................................................................... 27 5. Hardwaredesign ................................................................................................................................ 28 5.1 Motorstyring ................................................................................................................................... 28 5.2 Lyd ................................................................................................................................................... 32 5.3 Forlys ............................................................................................................................................... 34 5.4 Baglys .............................................................................................................................................. 37 5.5 Strømforsyning................................................................................................................................ 42 6. Softwaredesign ................................................................................................................................. 43 6.1 Class Motor ..................................................................................................................................... 43 6.1.1 setSpeed() .................................................................................................................................... 43 6.1.2 setDirection() ............................................................................................................................... 44 6.2 Class Lyd .......................................................................................................................................... 44 6.2.1 InitLyd() ........................................................................................................................................ 45 6.2.2 startLyd() ...................................................................................................................................... 45 6.2.3 reflexLyd() .................................................................................................................................... 45 6.2.4 slutLyd()........................................................................................................................................ 46 6.3 Class Lys .......................................................................................................................................... 46 Side 2 af 74 PRJ1 SW1 6.3.1 initLight() ...................................................................................................................................... 46 6.3.2 PWM-styrings funktioner ............................................................................................................. 47 6.4 Class Reflex...................................................................................................................................... 49 6.4.1 Interrupts ..................................................................................................................................... 49 6.5 SW-design af main-rutine ............................................................................................................... 50 7. Hardwareimplementering og modultest .......................................................................................... 51 7.1 HW-implementering og test af motor ............................................................................................ 51 7.2 HW-implementering og test af lys .................................................................................................. 52 7.3 HW-implementering og test af lyd.................................................................................................. 53 7.4 HW-implementering og test af refleksbrik ..................................................................................... 53 8. Softwareimplementering og modultest............................................................................................ 54 8.1 SW-implementering og test af motordriver ................................................................................... 54 8.2 SW-implementering og test af lysdriver ......................................................................................... 54 8.3 SW-implementering og test af lyddriver ......................................................................................... 55 8.4 SW-implementering og test af refleksbriksensor-driver ................................................................ 57 8.5 SW-implementering og test af main-rutine .................................................................................... 57 9. Integrationstest ................................................................................................................................. 58 9.1 Integrationstest af bilens motor ..................................................................................................... 58 9.2 Integrationstest af bilens lys ........................................................................................................... 58 9.3 Integrationstest af bilens lyd .......................................................................................................... 58 10. Accepttest ....................................................................................................................................... 59 10.1 Test af funktionelle krav ............................................................................................................... 59 Use case 1: ............................................................................................................................................ 59 Use case 2: ............................................................................................................................................ 60 Use case 3: ............................................................................................................................................ 61 Use case 4: ............................................................................................................................................ 62 10.2 Test af ikke-funktionelle krav ........................................................................................................ 63 11. Konklusion ....................................................................................................................................... 66 11.1 Konklusion for hardwaredelen...................................................................................................... 66 11.2 Konklusion for softwaredelen ....................................................................................................... 66 11.3 Konklusion for projektet ............................................................................................................... 66 12. Individuelle konklusioner ................................................................................................................ 67 12.1 Individuel konklusion: Altaf Rezai ................................................................................................. 67 12.2 Individuel konklusion: Louise Andersen ....................................................................................... 67 12.3 Individuel konklusion: Kim Van Le ................................................................................................ 68 12.4 Individuel konklusion: Lasse Borring Petersen ............................................................................. 68 Side 3 af 74 PRJ1 SW1 12.5 Individuel konklusion: August Lind Hansen .................................................................................. 68 13. Bilagsoversigt .................................................................................................................................. 69 Bilag 1. Konkurrencen ........................................................................................................................... 69 Bilag 2. Fysiske mål for karosseriet ....................................................................................................... 71 Bilag 3. Arduinoens bendiagram ........................................................................................................... 72 Bilag 4: Arbejdsfordeling ....................................................................................................................... 73 Indhold Side 4 af 74 PRJ1 SW1 1. Problemformulering Det tværfaglige projekt PRJ1, der gennemføres på 1. semester for E- og SW-studierne, drejer sig om udvikling af hardware og software til styring af en elektrisk bil. Som en indledning til projektet gennemføres 4 øvelser i E-LAB. Disse kan betragtes som en forundersøgelse eller analyse af de teknikker, der tænkes anvendt under projektet. Projektet skal udarbejdes efter retningslinjerne i dokumentet ”Vejledning til gennemførelse af projekt 1”. Under projektets forskellige faser gives der enkelte forelæsninger, der uddyber indholdet af disse faser. Et bilkarrosseri med påmonteret motor bliver udleveret til hver enkelt projektgruppe. Se figur 1. Figur 1 - Karrosseri med printplader, pendul og Arduino Mega2560 Den færdige bils formål er, at den skal kunne gennemkøre en konkurrencebane efter regler, der er nærmere beskrevet i bilag 1, ”Konkurrencen”. Side 5 af 74 PRJ1 SW1 3 Bilen skal udstyres med: Mikrocontroller. Elektronik til regulering af motor. Sensorer til detektering af refleksbrikker. For- og baglygter. Elektronik til styring af for- og baglygter. Elektronik og højtaler til afspilning af lyd. Nogle af de nødvendige hardwareenheder vil helt eller delvis blive udviklet i andre kurser på 1. semester. Arbejdet med disse opfattes derfor ikke som en del af semesterprojektet. Det drejer sig om: Print med kredsløb til detektering af refleksbrikker. Dette print skal forbindes til bilens mikrocontroller. Hvis der foretages modifikationer af printet for at tilpasse det projektet, skal disse modifikationer beskrives i projektdokumentationen. ”Fejltæller”: Print med kredsløb til tælling og visning af pulser fra et pendul. Pendulet anvendes kun som et påmonteret måleudstyr under konkurrencen, og den er ikke en del af selve projektet. Bilen skal forsynes med fremadrettet kørelys (hvidt) og baglys (rødt), samt bremselys (kraftigt rødt). Se figur 2 og figur 3. Bremselys og baglys udsendes fra samme kilde og skal kunne reguleres i to forskellige styrker. Hvert enkelt for-, bag- eller bremselys kan realiseres som et antal lysdioder, der opbygges som et LED-sæt. Hvert sæt kan opbygges som en kombination af serie- og/eller parallel-forbundne lysdioder. I projektet anvendes microcontrolleren Mega2560 på et ”Arduino Mega2560” kit. Denne anvendes til: Styring af bilens fart og retning. Styring af for- og baglygternes lysstyrke. Detektering af banens refleksbrikker. Afspilning af lyde og/eller melodier. Bilen skal under konkurrencen køre på en bane med to bander, hvor banderne vil sikre, at bilen bliver på banen. Banderne er udstyret med 7 par refleksbrikker, der kan detekteres af optiske sensorer placeret på bilen. Ved start skal bilen afspille en specifik startlyd eller startmelodi, og efter passage af mållinjen skal afspilles en specifik slutlyd eller slutmelodi. Ved passage af hver enkelt af refleksbrikkerne skal bilen afgive en specifik ”refleksbriklyd”. På figur 4 er vist placering af et af printene til detektering af refleksbrikker (der skal være et på hver side). Figur 5 viser en mulig placering af print med anden elektronik, som skal konstrueres for at kunne styre bilen. De præcise fysiske mål for bilkarrosseriet kan ses i bilag 1. Side 6 af 74 PRJ1 SW1 4 Figur 2 - Placering af to print til forlys, højre og venstre side Figur 3 - Placering af print til bag- og bremselys Side 7 af 74 PRJ1 SW1 Figur 4 - Placering af print til detektering af refleksbrikker Figur 5 - Print med øvrig elektronik placeret midt i bilen Side 8 af 74 PRJ1 SW1 2. Kravspecifikation 2.1 Aktør-kontekst diagram Skrevet af: Lasse Borring Petersen Figur 6 - Aktør-kontekst diagram Det system, som skal laves, er selve bilen. På figur 6 ses systemet, samt de aktører der interagerer med det. Aktøren ”bruger” skal starte bilens gennemløb af banen. Brugeren er derfor en primær aktør. Aktøren ”refleksbrik på venstre/højre side” kan detektere hvornår bilen passerer en refleksbrik. De regulerer altså bilen mens den kører banen, men kan ikke regulere noget ellers. Derfor er refleksbrikkerne en sekundær aktør. Side 9 af 74 PRJ1 SW1 2.2 Funktionelle krav Uarbejdet i fællesskab Figur 7 viser de ”Use Cases” som bilen skal udføre, samt hvilke aktører der indgår i disse. Figur 7 - Use case diagram for "bilen" Use case 1: ”Kør banen”: Mål: Denne use case beskriver, hvordan banen skal gennemkøres. Initieres af: Bruger. Normalt scenarie: 1. Brugeren tænder for bilen og placerer den, så den kører forlæns ind på banen ved at passere startlinjen. 2. Når bilen har passeret refleksbrik nummer 6, bringes bilen til standsning, inden refleksbrik nummer 7 nås. 3. Bilen bakker, indtil refleksbrik nummer 5 er passeret, og bringes til standsning, inden refleksbrik nummer 4 nås. 4. Bilen kører forlæns, indtil refleksbrik nummer 7 nås. 5. Bilens bringes til standsning i målområdet, der er defineret som området mellem banens slutende og en meter derefter. Generelt gælder: • Lyd afspilles som beskrevet i use case 2 ”Afspil lyd”. • Forlyset styres som beskrevet i use case 3 ”Styr forlys”. • Baglyset styres som beskrevet i use case 4 ”Styr baglys”. Side 10 af 74 PRJ1 SW1 Use case 2: ”Afspil lyd” Mål: Denne use case beskriver styringen af en systemindbygget lydgiver. Initieres af: Use case 1 ”Kør banen”. Normalt scenarie: 2.1. Når bilen tændes, afspilles en specifik ”startlyd” eller ”startmelodi”. 2.2. Hver gang en refleksbrik passeres, afspilles en specifik ”refleksbriklyd”. 2.3. Når refleksbrik nummer 7 passeres, afspilles en specifik ”slutlyd” eller ”slutmelodi”. ”Startlyden/melodien” er den lyd der afspilles i Mario Kart når man i spillet gør klar og der tælles ned fra 3-2-1-go. ”Refleksbrikslyden” er den lyd der afspilles i spillet Mario Kart når man kører ind i en item box. ”Slutlyden” er den lyd der afspilles i spillet Mario kart når man passerer mållinjen på 3. omgang i spillet. Use case 3: ”Styr forlys” Mål: Denne use case beskriver styringen af bilens indbyggede forlys. Forlyset kan være slukket eller tændt. Initieres af: Use case 1 ”Kør banen”. Normalt scenarie: Forlyset skal være tændt, når bilens motor påtrykkes en spænding der får bilen til at køre. Ellers skal forlyset være slukket. Use case 4: ”Styr baglys” Mål: Denne use case beskriver styringen af bilens indbyggede baglys. Baglyset kan være slukket, lyse med mellemstyrke (”almindeligt baglys”) eller lyse med kraftig styrke (”bremselys”). Initieres af: Use case 1. ”Kør banen”. Normalt scenarie 4.1 Baglyset skal lyse med mellemstyrke (”almindeligt baglys”), når bilens motor påtrykkes en spænding, der får bilen til at køre. Ellers skal baglyset være slukket. 4.2 Baglyset skal lyse med kraftig styrke (”bremselys”), mens spændingens til bilens motor mindskes. Side 11 af 74 PRJ1 SW1 9 2.3. Ikke-funktionelle krav: Uarbejdet af alle. 1. Generelle krav 1.1. Bilen skal på en enkelt opladning af dennes batterier kunne gennemføre mindst 5 gennemkørsler af banen. 1.2. På bilens højre og venstre side skal placeres detektorer, der kan registrere en R80 refleksbrik i afstanden 2 cm til 25 cm. 1.3. Bilen monteret med al udstyr må maksimalt veje 5,2 kg. 1.4. Bilens maksimale højde skal være 41 cm. 1.5. Bilens maksimale bredde skal være højst 46cm. 2. Bilens forlys 2.1. Forlyset består a 2 hvide LED-sæt, der monteres i højre og venstre side. 2.2. Forlyset skal kunne ses tydeligt når man ser på bilen forfra, mens der går en strøm gennem LED’erne på 60 mA +/- 6 mA. 2.3. Når forlyset er tændt, skal strømmen gennem hvert LED-sæt være 60 mA +/- 6mA. 3. Bilens bag- og bremselys 3.1. Implementeres med 2 røde LED-sæt, der monteres i højre og venstre side bag på bilen. 3.2. Baglyset skal kunne ses tydeligt når man ser bilen bagfra, mens der går en strøm gennem LED’erne på 20 mA +/- 2 mA. 3.2. Ved ”bremselys” skal middelstrømmen gennem hvert LED-sæt være 60 mA +/- 6 mA. 3.3. Ved ”almindeligt baglys” skal middelstrømmen gennem hvert LED-sæt være 20 mA +/- 2 mA. Side 12 af 74 PRJ1 SW1 4. Bilens lyd 4.1. Startlyd / startmelodi: - Mario Kart – Countdown og startlyd fra Mario Kart 8. 4.2. Refleksbriklyd: - Mario Kart - item box pickup sound fra Mario Kart 8. 4.3. Slutlyd / slutmelodi: - Mario Kart – Løbsafslutningsmelodi fra Mario Kart 8. 4.4. Lydkvalitet: - Lydene skal bestå af polyfonisk musik. Altså skal lyden komme ud af en højtaler som kan spille flerstemmigt. Side 13 af 74 PRJ1 SW1 3. Accepttestspecifikation Udarbejdet af alle. 3.1 Accepttestspecifikation for funktionelle krav (use cases) Use case 1: Use case 1: ”Kør banen” Test Forventet resultat 1. Brugeren tænder for bilen og placerer den, så den kører forlæns ind på banen ved at passere startlinjen. Visuel test: Bilen stopper mellem refleksbrikkerne 6 og 7. Opnået resultat Godkendt / kommentar Denne use case beskriver, hvordan banen skal gennemkøres. Punkt 1 + punkt 2 Punkt 3 Punkt 4 og 5 2. Når bilen har passeret refleksbrik nummer 6, bringes bilen til standsning, inden refleksbrik nummer 7 nås. 3. Bilen bakker, indtil refleksbrik nr. 5 er passeret, og bringes til standsning inden refleksbrik nr. 4 nås. 4. Bilen kører forlæns, indtil refleksbrik nummer 7 nås. 5. Bilens bringes til standsning i måleområdet, der er defineret som området mellem banens slut-ende og en meter efter banens slut-ende. Visuel test: Bilen bakker og standser mellem refleksbrikkerne 5 og 4. Visuel test: Bilen starter og kører frem til refleksbrik nr. 7, og stopper inden for det definerede måleområdet. Side 14 af 74 PRJ1 SW1 Use case 2: Use case 2: ”Afspil lyd” Test Forventet resultat 2.1. Når bilen tændes for at køre ind på banen, afspilles en specifik ”startlyd” eller ”startmelodi”. 2.2. Hver gang en refleksbrik passeres, afspilles en specifik ”refleksbriklyd”. Høretest: Den korrekte startlyd afspilles når bilen startes. Opnået resultat Godkendt/kommentar Denne use case beskriver styring af en i systemet indbygget lydgiver. Initieres af: Use case 1 ”Kør banen”. Punkt 1 Punkt 2 Punkt 3 2.3. Når refleksbrik nummer 7 passeres, afspilles en specifik ”slutlyd” eller ”slutmelodi”. Høretest: Den korrekte refleksbriklyd kan høres hver gang en refleksbrik passeres. Høretest: Bilen afspiller den korrekte slutlyd når den passerer mållinjen Side 15 af 74 PRJ1 SW1 Use case 3: Use case 3: ”Styr forlys” Denne use case beskriver styringen af bilens indbyggede forlys. Forlyset kan være slukket eller tændt. Initieres af: Use case 1 ”Kør banen”. Punkt 1: Punkt 2: Test Forventet resultat Forlyset skal være tændt, når bilens motor påtrykkes en spænding, for at bringe den til at køre. Ellers skal forlyset være slukket. Måletest: Forlyset lyser med en strøm på 60 mA +/- 6 mA. Den lyser kun når motoren er tændt på bilen. Forlyset skal lyse i en kold hvid farve ud af LED’en: LTW-2S3D8 Visuel test: Forlyset lyser med hvidt lys. Opnået resultat Godkendt/kommentar Side 16 af 74 PRJ1 SW1 Use case 4: Use case 4: Test ”Styr baglys” Denne use case beskriver styringen af bilens indbyggede baglys. Baglyset kan være slukket, lyse med mellemstyrke (”almindeligt baglys”) eller lyse med kraftig styrke (”bremselys”). Initieres af: Use case 1. ”Kør banen”. Punkt 1: 4.1 Baglyset skal lyse med mellemstyrke (”almindeligt baglys”), når bilens motor påtrykkes en spænding, for at bringe den til at køre. Ellers skal baglyset være slukket. Skriv hvor mange mA Punkt 2: 4.2 Baglyset skal lyse med kraftig styrke (”bremselys”), mens spændingens til bilens motor mindskes. Skriv hvor mange mA Forventet resultat Opnået resultat Godkendt/kommentar Måle og visuel test: mA gennem baglyset måles, og der vurderes om det lyser med en passende styrke. Måle og visuel test: mA gennem baglyset måles, og der vurderes om det lyser med en passende styrke. Side 17 af 74 PRJ1 SW1 Test af ikke-funktionelle krav 1. Generelle krav Krav- Krav nr. 1.1 Bilen skal på en enkelt opladning af dens batterier kunne gennemføre mindst 5 gennemkørsler af banen. 1.2 På bilens højre og venstre side skal placeres detektorer, der kan registrere en R80 refleksbrik i afstanden 2 cm til 25 cm. 1.3 Bilen monteret med al udstyr må maksimalt veje 5,2 kg. 1.4 Bilens maksimale højde skal være 41 cm. 1.5 Bilens maksimale bredde skal være højst 46cm - med ekstraudstyr. Test Resultat Godkendt/kommentar Visuel test: Bilen tændes og kører banen korrekt 5 gange i træk på en enkelt opladning Bilen tændes og kører banen. Hvis refleksprintet opfanger reflekssensorerne og giver et ”returlys” er kravet godkendt Bilen vejes, godkendes hvis vægten er under 5.2 kg. Bilens højde måles med et målebånd med 1 mm præcision fra gulvet til bilens højeste punkt. Godkendt hvis højden < 41 cm. Bilens bredde måles med et målebånd med 1 mm præcision fra yderste punkt i venstre side, til yderste punkt i højre side. Godkendt hvis bredden < 46 cm. Side 18 af 74 PRJ1 SW1 2. Bilens forlys Krav nr. 2.1 Krav Forlys implementeres med 2 hvide LED-sæt, der monteres med et sæt i henholdsvis højre og venstre side, foran på bilen. 2.2 Når forlyset er tændt, skal strømmen gennem hvert LED-sæt være 60 mA +/- 6mA. Test Visuel test: Sidder der en hvid LED i både højre og venstre side foran på bilen, som er synlige Måletest: Der tilsættes en strøm til begge LED’er hvor vi måles med et multimeter, at strømmen er inden for det godkendte område. Resultat Godkendt/kommentar Resultat Godkendt/kommentar 3. Bilens bag- og bremselys Krav nr. 3.1 3.2 3.3 Krav Baglyset implementeres med 2 røde LEDsæt, der monteres med et sæt i henholdsvis højre og venstre side bag på bilen. Ved ”bremselys” skal middelstrømmen gennem hvert LED-sæt være 60 mA +/- 6 mA. Test Visuel test: Sidder der på en LED og højre og venstre side bag på bilen, som er synlige Måletest: Når bremselyset er tændt,, måles strømmen gennem LED’erne med et multimeter. Strømmen skal måles til 60 mA +/- 6 mA Ved ”almindeligt Måletest: Når baglyset baglys” skal er tændt, måles middelstrømmen strømmen over Side 19 af 74 PRJ1 SW1 gennem hvert LED-sæt være 20 mA +/- 2 mA. LED’erne med et multimeter. Strømmen skal måles til 20 mA +/2 mA. 4. Bilens lyd Krav nr. 4.1 4.2 4.3 4.4 Krav Startlyden/melodien skal være den lyd der afspilles i Mario Kart når man i spillet gør klar og der tælles ned fra 32-1-go. Refleksbrikslyden skal være den lyd der afspilles i spillet Mario Kart når man kører ind i en item box. Slutlyden skal være den lyd der afspilles i spillet Mario kart når man passerer mållinjen i spillet. Lyden skal komme ud af en polyfonisk højtaler på bilen. Test Resultat Høretest: Er startmelodien den korrekte lyd Godkendt/kommentar Høretest: Er refleksbriklyden den korrekte lyd Høretest: Er slutlyden den korrekte lyd Kommer lyden ud af en polyfonisk højtaler Side 20 af 74 PRJ1 SW1 4. Systemarkitektur (HW og SW) Skrevet af: Lasse Udarbejdet af: Lasse og August 4.1 Hardwarearkitektur For at simplificere hardwaren ned i mindre bestanddele, har vi lavet hardwarearkitektur i form af BDD- og IBD-diagrammer. Dette er med til at give overblik over de forskellige dele der skal laves hardware til, og hvordan de skal forbindes internt. 4.1.1 BDD-diagram For at få et generelt overblik over hardwaren, laves et såkaldt BDD (Block Definition Diagram). Dette bruges til at inddele hardwaren i forskellige blokke med hver sin funktionalitet, og dermed give overblik. Som tillæg til BDD’en skrives også en kort forklaring på de forskellige blokke og deres funktionalitet. Vores BDD ses på figur 8. Figur 8 - BDD over bilen Side 21 af 74 PRJ1 SW1 4.1.2 IBD-diagram For så at få et overblik over interne forbindelser og inputs/outputs i hver blok i BDD’en, laves et IBD (Internal Block Diagram). Her ses alle interne forbindelser, samt dem der går ud til omverdenen. Derudover ses der også hvilken type forbindelserne skal have, evt. også deres størrelse. Fejltælleren ligger uden for diagrammet, da den ikke laves direkte i forbindelse med projektet, men stadig har forbindelser til andre komponenter på bilen. Figur 9 - IBD for bilen Side 22 af 74 PRJ1 SW1 4.1.3 Signalbeskrivelse Skrevet og udarbejdet af: Lasse Som udvidelse af IBD’en laves også en signalbeskrivelse, som går endnu dybere ned i de enkelte forbindelser. Her beskrives præcis hvilke pins på arduinoen der bruges til hvad, og om signalet er indgående eller udgående. Dette er igen med til at give overblik og gøre det nemmere at komme i gang med at lave de enkelte komponenter. Derudover undgås det også, at man kommer til at bruge den samme pins på arduinoen til to forskellige signaler. Signalnavn Funktion Område Port 1 (source) 0.0 V Power Supply, (ground.) Ground Reference til analog spænding ComponentPower Forsyningsspænding BigPower Forsyningsspænding 9.5-9.7 V Power Supply, 9.6V batteriet MotorPower Forsyningsspænding 7,1-7.3 V LightOut(R/L) Fysisk lys Power Supply, 7.2V batteri Sensor(R/L), (LED) 4.9-5.1 V Power Supply, (5V forsyningspins) Port 2 (Destination) Arduino ATMega2560 (Ground pin), SensorL (Ground pin), SensorR (Ground pin), Speaker (Ground pin), Lights (Ground pin), Motor (Ground stik). Lights (VCC pin), SensorL (VCC pin), SensorR (VCC pin), Speaker (VCC pin) Arduino ATMega2560 (– Power pin Vin) Fejltæller - veroboard, (Vin pin) Powersupply (Vin pin) Motor, (inputstik på bil). Kommentar Stel. 5V strøm fra powersupply 9.6V batteri 7.2V batteri Lys ud til refleksbrik Side 23 af 74 PRJ1 SW1 ReflexLight(R/L) Reflekteret fysisk lys MotorSpeed Justere bilens hastighed ForwardMotorDirection Justere om bilen kører fremad eller bagud BackLightSignal Justere baglysets intensitet. Tunes Afspille lyd Event: Indikerer modtaget SensorSignal(R/L) fysisk lys Sensor(R/L), (Fotodiode) Motorprint PWM, 0% til 100% duty cycle. On/Off Arduino Mega2560 (pin 5) Arduino Mega2560 (Pin 23) Motorprint PWM, 0% til 100% duty cycle. Arduino Mega2560 (pin 7, PH4, OC4B, PWM) Højtaler Baglysprint 0.0 V til 5.0 V Sensor(R/L) (Vout pin på printplade) Arduino ATMega2560 Pin 2 (L). Arduino ATMega2560 Pin 3 (R). Lys ind fra refleksbrik PWM-signal hvor duty cycle bruges til at regulere hastighed. Et On/Off signal som bruges til at afgøre hvilken vej motoren skal køre. Skrue op for baglyset ved opbremsning eller bagudkørsel Afspille startlyd, refleksbriklyd samt slutlyd. Fortælle arduinoen hvor langt bilen er på banen ved at sende et signal til den hver gang en refleksbrik passeres. Side 24 af 74 PRJ1 SW1 4.2 Softwarearkitektur Skrevet og udarbejdet af: Lasse For at hardwaren overholder de krav som blev specificeret tidligere i kravsspecifikationen, skal der selvfølgelig også laves noget software. Her vil vi igen starte med at lave arkitektur over softwaren, for at give overblik over hvilke funktioner der er brug for, og hvad disse funktioner skal kunne. Vi har taget udgangspunkt i den inddeling vi lavede af hardwaren og kravsspecifikationen, for at komme frem til forskellige klasser, til at beskrive de komponenter der indgår i bilen. Vi er kommet frem til en kodeinddeling der består af fire forskellige klasser, som er følgende: Motor Lys Lyd Refleks Hver af disse klasser indeholder koden til den enkelte komponent, klassen har ansvaret for at kontrollere. Disse kan vi opstille i et UML-moduldiagram, hvor vi forbinder de enkelte klasser med pile, som indikerer de interne forbindelser klasserne har med hinanden, og deres relation til main-rutinen. Ved at lave dette moduldiagram bliver vores software mere organiseret, og derved bliver det også nemmere at udarbejde de enkelte drivere, når vi skal skrive main-programmet senere. Side 25 af 74 PRJ1 SW1 4.2.1 Moduldiagram Udarbejdet af: Lasse Figur 10 - Moduldiagram over softwarearkitekturen På moduldiagrammet ser vi, at refleksklassen returnerer en integer ind i main, som den bruger til at styre hvorhenne på banen bilen befinder sig. Fra main kan vi så kalde funktionerne fra de tre andre klasser. Til sidst munder det hele så ud i hardwaren, hvor selve ændringerne sker, som fx at bremselyset tænder og slukker. Tilhørende moduldiagrammet har vi også lavet en modulbeskrivelse, som beskriver de enkelte klassers ansvar, samt funktionerne i dem. Det gør det nemmere når koden skal skrives, da vi så ved præcis hvilke funktioner der skal styre hvad, om de skal have en returværdi, og om de skal have nogle parametre. Modulbeskrivelsen ses på figur XX på næste side. Side 26 af 74 PRJ1 SW1 4.2.2 Modulbeskrivelse Udarbejdet af: Lasse Figur 11 - Modulbeskrivelse af softwarearkitekturen Side 27 af 74 PRJ1 SW1 5. Hardwaredesign Skrevet af: Lasse I dette afsnit skabes et overblik over de forskellige komponenters nødvendige hardware, i sådan en detaljeret grad at det er muligt at realisere kredsløbene. 5.1 Motorstyring Skrevet af: Lasse, med hjælp fra Kim Som beskrevet tidligere i accepttestspecifikationen, skal bilen have mulighed for at ændre køreretningen. Vi skal altså have implementeret en måde hvorpå vi kan vende strømmen gennem motoren, så bilen kan bakke. Dette gøres ved hjælp af et relæ, som indeholder to switches og en spole. Når men sender strøm gennem spolen, laver den et magnetfelt omkring sig, hvilket skubber switchen, som dermed leder strømmen ud ad den anden udgang. Ved så at forbinde disse udgange på en speciel måde som vi kommer tilbage til senere, kan vi sørge for at når der går strøm gennem spolen, ændrer strømmens retning gennem motoren sig. Derved opnår vi, at bilen både kan køre frem og tilbage. Databladet for relæet 40.52 som bruges her ses på figur XX. Figur 12 - Udsnit af databladet for relæ 40.52. Vi kan se I databladet for relæet at ved påsætning af en 5V DC-spænding på spolen, afsættes en effekt i spolen på 0.65 W. Derved skal vi altså ramme en strøm på, ifølge formlen 𝑃 = 𝐼 ∗ 𝑉, på: Side 28 af 74 PRJ1 SW1 Denne strøm er større end hvad vores arduino kan levere direkte ud af en port. Derfor bruges en transistor til at forstærke denne strøm. I øvelse 3 benyttede vi os af samme princip med en lysdiode, hvor vi brugte transistoren BD139. Da fandt vi ud af, at betaværdien for BD139-transistoren er 𝛽 = 20, samt at spændingsfaldet 𝑉𝑏𝑒 = 0.7𝑉. Altså må den strøm der skal leveres af arduinoen til basebenet være: Som er under de 20mA som et ben på arduinoen kan levere. Ved at benytte os af KVL, kan vi se at spændingsfaldet over spolen må være 4.3𝑉, da arduinoen udsender 5V, og spændingsfaldet over transistoren er 0.7𝑉. For så at få strømmen ned på de 6.5mA, skal en formodstand sættes på før transistoren. Dens størrelse beregnes ved ohms lov: Vi skal altså bruge en formodstand på 662 ohm for at få den ønskede strøm ind i transistoren fra vores arduino, og dermed få den ønskede strøm gennem spolen. Ud fra denne information kan vi nu opbygge kredsløbet for motorstyringen i multisim. Kredsløbet ses på figur XX. Side 29 af 74 PRJ1 SW1 Figur 13 - Multisim diagram for motorstyring. Udover komponenterne som er blevet beskrevet tidligere, har vi også benyttet en IRLZ44N transistor som fører strøm ind i motoren. Her bruges samme princip som beskrevet tidligere omkring BD139, da vores arduino ikke kan levere nok strøm ud af en pin til at få motoren til at køre. Strømmen der skal til for at få motoren til at køre, er dog noget større end den der skal til for at få spolen til at vende relæet. Derfor bruges en større transistor, som i det her tilfælde er en IRLZ44N. Derudover har vi også bruge to beskyttelsesdioder. Dioderne er til for, at når der slukkes for strømmen går der stadig lidt strøm gennem kredsløbet. Dette gælder især for spolen. For at reducere den elektriske støj der kan forekomme, sættes dioder på som strømmen kan løbe igennem. På diagrammet er der også en frekvensgenerator på 244 Hz. Hvordan vi er kommet frem til denne værdi, kommer vi til i senere afsnit omhandlende softwaredesignet. Side 30 af 74 PRJ1 SW1 Styklisten til motorens hardware ser således ud: Antal 1 1 2 1 1 1 1 1 1 Symbol på diagram R2 R1 D1, D2 Q2 Relæ 40.52 Q1 VCC_Batteri U1 Arduino Ben 5 Arduino Ben 23 Komponentnavn 10kΩ modstand 662Ω modstand 1N4007G Diode BD139 transistor Relæ 40.52 (Udleveret af elektronikværkstedet) IRLZ44N transistor 7.2 V batteri Motor Arduino ATMega2560 ben 5 og ben 23 Side 31 af 74 PRJ1 SW1 5.2 Lyd Udarbejdet og skrevet af: Altaf Til lyden benyttes en SOMO-II (SOMO-2) MP3-afspiller til at afspille den ønskede lyd. Selve SOMO2’en styres af en UART-driver fra vores Arduino Mega2560, og i forbindelse med at SOMO’en er tilkoblet polyfoniske højtalere, kan vi med disse 3 komponenter, få afspillet de lyde vi ønsker. MultiSIM-diagrammet længere nede demonstrerer hvordan selve opsætningen og kommunikationen mellem disse komponenter fungerer. Figur 14 Figur 15 Side 32 af 74 PRJ1 SW1 Forklaring på kredsløb, kommunikation og funktionalitet: Vi bruger UART0 fra Arduino og forbinder TXD0 (Port E, pin 1) fra Arduino til RX-benet (pin 11) på SOMO-2. Vi har mellem de nævnte pins på Arduino og SOMO-2, loddet en 1𝑘Ω-modstand på, og dette gøres for at opretholde kompatibilitet mellem de to enheder, da vores ArduinoMega2560 arbejder med standard 5V, hvorimod vores SOMO-2 er kompatibel med 3,3V logisk spænding på både TX- og RX-benet. Dette er også forklaret og anbefalet i SOMO-2’ens datablad. Specifikt for lyden, benytter vi kun RX-benet fra SOMO’en, da den blot skal modtage instrukser og ikke sende. For at forbinde højtaleren til SOMO-2, forbinder vi SPK+ (pin 15) og SPK- (pin 16) fra SOMO-2’en til højtaleren. VCC (pin 9) på SOMO-2 forbindes til den fælles spændingsforsyning der leverer 5V. Ground (pin 10) forbindes også til den fælles ground på den samme spændingsforsyning. Forklaring på porte til/fra speaker og SOMO-2: BEN-NUMMER NAVN FUNKTION 1,2,3,4,5,6,7,8 -||- -||- 9 VDD Power-supply 10 GND 0V (jord) 11 RX UART Recieve-pin 12 TX UART Transmit-pin 13 DAC_R -||- 14 DAC_L -||- 15 SPK1 Differential-forstærket output til speaker 16 SPK2 Differential-forstærket output til speaker -||- = ikke vigtigt for funktionaliteten/formålet. Stykliste: Antal 1 1 1 1 Komponentnavn SOMO-II (SOMO-2) 1𝑘Ω modstand Speaker ArduinoMega2560 Side 33 af 74 PRJ1 SW1 5.3 Forlys Udarbejdet og skrevet af: Louise og August Til brug i vores forlys har vi valgt LTW-2S3D8 som LED. En skabelon af kredsløbet for forlys opbygges i multisim, for at kunne beregne de nødvendige værdier. Figur 16 – skabelon af kredsløbet for forlys Som beskrevet i kravsspecifikationen, skal middelstrømmen for et LED-sæt af forlys være 60mA. Vi har valgt at bruge 3 stk. LED pr. forlys, hvilket bliver 60𝑚𝐴 3 = 20 𝑚𝐴 pr. LED. I databladet for LED’en LTW-2S3D8, kan vi aflæse at der ved en fremadrettet strøm på 20mA vil være et spændingsfald på 3,3V over én LED. Disse data er vist på figur 17 og 18 nedenfor Side 34 af 74 PRJ1 SW1 Figur 17 – udsnit af datablad for LED LTW-2S3D8 Figur 18 – udsnit af datablad for LED LTW-2S3D8 Den valgte transistor for kredsløbet er BD139. Denne transistor er valgt, da den er magen til den der blev brugt under projektøvelse 3, og da dens maksimale collector-strøm er 3,0A, en øvre grænse vi ikke kommer tæt på at nå. I forlygten har vi valgt at bruge én formodstand for hvert forlys (R1 og R2). Beregningen af disse formodstande foretages ved brug af KVL. Side 35 af 74 PRJ1 SW1 Transistoren Q1 antages at være i mætning, og vi regner med: o β = 20 o VCE = 0,2 V o VBE = 0,7 V (oplysninger givet under projektøvelse 3.) Forsyningsspændingen er 𝑉1 = 5𝑉. KVL over kredsløbet: −𝑉1 + 𝑉𝐿𝐸𝐷 + 𝑉𝐶𝐸 + 𝑉𝑅 = 0 Ud fra ovenstående KVL for kredsløbet, findes spændingsfaldet over vores modstande R1 og R2: 𝑉𝑅 = 5𝑉 − 3,3𝑉 − 0,2𝑉 = 1,5𝑉 Vi kan nu beregne vores modstande R1 og R2 ved ohms lov: 1,5𝑉 𝑅 = 60𝑚𝐴 = 25𝑜ℎ𝑚 Som det næste, skal der findes en passende modstand til basebenet, for at der fås den korrekte strømstyrke. PWM-spænding fra Arduino er 𝑉2 = 5𝑉, vi antager altså en 100% duty-cycle for at hvert sæt af forlys får 60mA tilført. For at finde modstanden (R3), laver vi igen KVL over kredsløbet: −𝑉2 + 𝑉𝐵𝐸 + 𝑉𝑅3 = 0 𝑉𝑅3 = 5𝑉 − 0,7𝑉 = 4,3𝑉 Derefter beregnes den ønskede strømstyrke af basestrømmen: 𝐼𝑏𝑎𝑠𝑒 = 𝐼𝑏𝑎𝑠𝑒 = 6∗20𝑚𝐴 20 𝐼𝑎𝑙𝑙𝑒𝐿𝐸𝐷 𝛽 = 6𝑚𝐴 Til sidst bruges ohms lov til at finde modstanden R3: 𝑅3 = 4.3𝑉 = 716,667𝛺 6𝑚𝐴 Grundet ECE lagerets mangel på 716 ohm modstande, bruges i stedet en 680 ohm modstand. Den reelle duty-cycle der skal til for at levere hvert sæt af forlys med 60mA vil derfor beregnes: 4.3𝑉 680𝑜ℎ𝑚 = 6𝑚𝐴 ∗ 𝑑𝑢𝑡𝑦𝑐𝑦𝑐𝑙𝑒 𝑑𝑢𝑡𝑦𝑐𝑦𝑐𝑙𝑒 = 680𝑜ℎ𝑚 4.3𝑉 6𝑚𝐴 = 0.949 = 95% Med de beregnede værdier for modstande, opbygges et diagram over kredsløbet i multisim. Kredsløbet kan ses på figur 19. Side 36 af 74 PRJ1 SW1 Figur 19 – diagram af kredsløbet for forlys Stykliste til forlys: STYKLISTE Stk. 6 stk. 2 stk. Symbol på diagram LED1-6 R1 og R2 1 stk. R3 1 stk. 1 stk. 1 stk. Q1 V1_spændingsregulator Arduino_ben_6 Komponent Hvid LED LTW-2S3D8 24 ohm modstand (tætteste på 25ohm på lager) 680 ohm modstand (tætteste på 716 ohm på lager) BD139 transistor Spændingsregulator Arduino ATMega2560 ben 6 5.4 Baglys Udarbejdet og skrevet af: Louise og August Til brug i vores baglys har vi valgt C503B-RBN-CW0Z0AA1 som LED. En skabelon af kredsløbet for baglyset opbygges i multisim for at kunne beregne de nødvendige værdier. Side 37 af 74 PRJ1 SW1 Figur 20 – skabelon af kredsløb for baglys Som beskrevet i kravsspecifikationen, skal middelstrømmen for et LED-sæt af baglys være 60mA, når bilen bremser og bakker. Vi tager udgangspunkt i baklyset, da duty-cyclen af PWM-signalet altid kan sættes ned for at få 20mA til at løbe gennem hver LED-sæt. Vi har valgt at bruge 3 stk. LED pr. baglys, hvilket bliver 60𝑚𝐴 3 = 20 𝑚𝐴 pr. LED. I databladet for LED’en C503B-RBN-CW0Z0AA1, kan vi aflæse at der ved en fremadrettet strøm på 20mA vil være et spændingsfald på 2,1V over én LED. Disse data er vist på figur 21 og 22 nedenfor. Side 38 af 74 PRJ1 SW1 Figur 21 – udsnit af datablad for LED C503B-RBN-CW0Z0AA1 Figur 22 – udsnit af datablad for LED C503B-RBN-CW0Z0AA1 Den valgte transistor for baglysets kredsløbet er BD139, af samme årsag som det var for forlyset, at denne transistors collector-strøm har en maksimalværdi på 3,0A. I baglygten har vi valgt at bruge én formodstand for hvert baglys (R4 og R5). Beregningen af disse formodstande foretages ved brug af KVL. Transistoren Q1 antages at være i mætning, og vi regner med: o β = 20 o VCE = 0,2 V o VBE = 0,7 V (oplysninger givet under projektøvelse 3.) Side 39 af 74 PRJ1 SW1 Forsyningsspændingen er 𝑉3 = 5𝑉. KVL over kredsløbet: −𝑉3 + 𝑉𝐿𝐸𝐷 + 𝑉𝐶𝐸 + 𝑉𝑅 = 0 Ud fra ovenstående KVL for kredsløbet, findes spændingsfaldet over vores modstande R4 og R5: 𝑉𝑅 = 5𝑉 − 2,1𝑉 − 0,2𝑉 = 2,7𝑉 Vi kan nu beregne vores modstande R4 og R5 ved ohms lov: 2,7𝑉 𝑅 = 60𝑚𝐴 = 45𝑜ℎ𝑚 Da den samlede strøm gennem alle LED’erne er den samme for både forlys og baglys, og de to kredsløb bruger samme transistor, ræsonnerer vi os frem til at modstanden R6 på basebenet vil være den samme. 𝑅6 = 716,667𝑜ℎ𝑚 Da vi igen mangler den præcise resistor, bruges 680 ohm resistor i stedet. Duty-cyclen findes som før. 4.3𝑉 680𝑜ℎ𝑚 = 6𝑚𝐴 ∗ 𝑑𝑢𝑡𝑦𝑐𝑦𝑐𝑙𝑒 𝑑𝑢𝑡𝑦𝑐𝑦𝑐𝑙𝑒 = 680𝑜ℎ𝑚 4.3𝑉 6𝑚𝐴 = 0.949 = 95% Baglyset skal også kunne lyse med en middelstrøm på 20mA gennem hvert sæt af baglygter. Dutycyclen for dette findes også. 4.3𝑉 680𝑜ℎ𝑚 = 2𝑚𝐴 ∗ 𝑑𝑢𝑡𝑦𝑐𝑦𝑐𝑙𝑒 𝑑𝑢𝑡𝑦𝑐𝑦𝑐𝑙𝑒 = 680𝑜ℎ𝑚 4.3𝑉 2𝑚𝐴 = 0.316 = 32% Med de beregnede værdier for modstande, opbygges et diagram over kredsløbet i multisim. Kredsløbet kan ses på figur 23. Figur 23 – diagram af kredsløbet for baglys Side 40 af 74 PRJ1 SW1 Stykliste til baglys: STYKLISTE Stk. 6 stk. 2 stk. Symbol på diagram LED1-6 R4 og R5 1 stk. R6 1 stk. 1 stk. 1 stk. Q2 V3_spændingsregulator Arduino_ben_7 Komponent Rød LED C503B-RBN-CW0Z0AA1 44 ohm modstand (tætteste på 45 ohm på lager) 680 ohm modstand (tætteste på 716,6 ohm på lager) BD139 transistor Spændingsregulator Arduino ATMega2560 ben 7 Side 41 af 74 PRJ1 SW1 5.5 Strømforsyning Udarbejdet og skrevet af: Kim Til bilen anvendes to strømforsyninger, en 9,6 V batteri, 2500 mAh og en 7,2 V, 3300 mAh. 7,2 V batteriet anvendes til motoren og bliver reguleret af motoren. Til Batteriet med 9,6 V skal det nedreguleres ved hjælp af en spændingsregulator (LM7805), det reguleres ned til 5 V og forsyner fejltælleren, bag- og forlys, refleksionsprintene, SOMO-II samt motorstyringsprintet. Figur 24 – diagram over spændingsregulatoren Figur 25 - fysiske opstilling på veroboard af figur 24 Side 42 af 74 PRJ1 SW1 6. Softwaredesign Skrevet af: Lasse Her vil softwaren til de forskellige komponenter blive beskrevet i sådan en detaljeret grad, at det er muligt at skrive den nødvendige software ud fra det. Vi har valgt at skrive alt vores software i C++, da man i det, i modsætning til almindelig C, har mulighed for at lave klasser, som er gode til at give overblik over hvilke dele af softwaren der hører til hvad, når vi til sidst skal skrive vores main-rutine. 6.1 Class Motor Skrevet og udarbejdet af: Lasse Klassen motor skal indeholde to hovedfunktioner. Den ene skal styre hastigheden på bilen, og den anden skal styre bilens retning. 6.1.1 setSpeed() Vi starter med funktionen setSpeed(), som styrer hastigheden på bilen. Dens UML-diagram ses på figur XX. Funktionen skal tage et input (int). Først skal den sørge for at inputtet altid ligger mellem 0 og 100, så alle værdier udenfor dette interval sættes til det maksimale i intervallet. Dernæst skal funktionen skrive et tal til OCR3A-registeret, som sætter motorens duty-cycle i %, svarende til inputtet i %. Grunden til at funktionen skal skrive til OCR3A-registeret, er at vi benytter os af arduinoens timer 3 i fast PWM, 10-bit mode, til at danne et PWM-signal på pin 5. Når en timer er i fast PWM-mode, fungerer den som det ses på figur XX1. Der skrives en værdi til OCRn-registeret, som er mellem 0 og registerets TOP-værdi. I dette tilfælde er TOP-værdien lig 0x03FF = 1023, som det ses nederst på figur XX2. Timeren tæller så op med en hastighed der er afhængig af CPU-frekvensen og prescalerværdien. Frekvensen for arduinoens CPU er 16MHz, og Figur 26 - UML-diagram for funktionen setSpeed() i klassen Motor. Figur 27 - Forklaring på fast PWM-signal Figur 28 - Udsnit af tabel over hvordan 16-bit timers sættes i PWM-mode 1 2 Henning Hargaard, “Mega2560 Timers”, side 20 Henning Hargaard, “Mega2560 Timers”, side 23 Side 43 af 74 PRJ1 SW1 prescalerværdien er valgt til 64. Dette giver ifølge formlen 𝑓= 𝑓𝑐𝑝𝑢 𝑁 ∗ (1 + 𝑇𝑂𝑃) En frekvens på: 𝑓= 16𝑀𝐻𝑧 = 244𝐻𝑧 64 ∗ (1 + 1023) Hver gang timeren så passerer den værdi der står i OCR3A på sin vej fra 0 til 1023, vi den udsende 5V ud på pin 5, indtil den resetter tilbage til 0, og tæller op forfra. Med dette kan vi altså styre motorens duty cycle. For at få et input i % over til en dutycycle i procent, skal der en mindre omregning til. Dette gøres af to omgange. Først tages inputtet og ganges med 10, hvilket giver os værdier mellem 0 og 1000. Men da vores TOP-værdi er 1023, skal der en smule mere til. Derfor tager vi inputtet og deler det med 4, og lægger det til. Det giver et interval for TOP-værdierne på 0 til 1025. Dette er tæt nok på til at det kan godtages, men der skal dog lige laves en begrænsning der gør at TOP aldrig kan antage en værdi over 1023. 6.1.2 setDirection() Denne funktion skal styre hvilken retning strømmen skal gå gennem motoren, ved at styre om der skal gå strøm gennem spolen, som blev beskrevet i afsnit 5.1 i hardwaredesign. Dette opnås ved at outputte en spænding på enten 0V eller 5V på arduinoens ben 23. Det ses i bilag 3, at ben 23 har udgangen PA1. Når der påsættes en spænding på 5V på benet, vil spolens magnetfelt skifte switchen i relæet, og strømmen vil ændre retning gennem motoren. På den måde skifter bilen køreretning. 6.2 Class Lyd Figur 29 - UML-diagram for funktionen setDirection() i klassen motor Udarbejdet og skrevet af: Altaf Klassen lyd indeholder fire hovedfunktioner: 1. 2. 3. 4. InitLyd(); startLyd(); reflexLyd(); slutLyd(); OBS! I alle funktioner er kommandoen sendKommandoTilSomo(); kaldt. Denne funktion sender blot kommandoen til SOMO-2’en, hvorfra den aflæses og udføres. Side 44 af 74 PRJ1 SW1 6.2.1 InitLyd() Denne funktion har til formål at initiere UART-driveren til BAUD-rate 9600 med 8bit, at hente og initiere lyden fra SD-kortet og at reset SOMO-2’en til POWER-ON-STATE. Altså har initLyd-kommandoen fået implementeret disse tre funktioner, hvilket er i stedet for at skabe og skrive kommandoerne hver for sig og kalde dem, da dette skaber uoverskuelighed i selve programmet. Funktionen med beskrivelser/forklaringer på koden: void initLyd() { initUART(9600, 8); //Initierer UART-driveren med BAUD-rate: 9600 og bit: 8. const char aCommand5[8] = { 0x7E,0x09,0x00,0x00,0x02,0xFF,0xF5,0xEF }; //Initierer lyden fra SD-kort og IKKE USB. sendKommandoTilSomo(aCommand5); const char aCommand6[8] = { 0x7E,0x0C,0x00,0x00,0x00,0xFF,0xF4,0xEF }; //RESET SOMO-2 til POWER-ON-STATE sendKommandoTilSomo(aCommand6); } 6.2.2 startLyd() Denne funktion kalder kommandoen for afspilningen af en startlyd ved starten af kørebanen. Mere specifikt er dette en kode der fortæller SOMO-2’en, at den skal afspille første lyd fra SD-kortet, og at lydfilen skal aflæses udenfor en mappe, da der ingen mappe er. Lydfilerne er indsat i SD-kortet. Beskrivelser på kommandoen kan ses nedenfor. Funktionen med beskrivelser/forklaringer på koden: void startLyd() { //Denne array opretter en command for startlyd, som den sender til SOMO-2. const char aCommand1[8] = { 0x7E,0x03,0x00,0x00,0x01,0xFF,0xFC,0xEF }; //Vi har 0x00 for ingen mappe, og 01 for track 1. sendKommandoTilSomo(aCommand1); } 6.2.3 reflexLyd() Denne funktion kalder kommandoen for afspilning af en reflekslyd når bilen passerer en refleks på kørebanen. Beskrivelser på kommandoen kan ses nedenfor. Funktionen med beskrivelser/forklaringer på koden: void reflexLyd() { //Denne array opretter en command for reflex lyd, som den sender til SOMO-2. const char aCommand2[8] = { 0x7E,0x03,0x00,0x00,0x02,0xFF,0xFB,0xEF }; //Vi har 0x00 for ingen mappe, og 02 for track 2. sendKommandoTilSomo(aCommand2); } Side 45 af 74 PRJ1 SW1 6.2.4 slutLyd() Denne funktion kalder kommandoen for afspilning af en slutlyd, når bilen er bragt til standsning for enden af kørebanen. Beskrivelser på kommandoen kan ses nedenfor. Funktionen med beskrivelser/forklaringer på koden: void slutLyd() { //Denne array opretter en command for slutlyd, som den sender til SOMO-2. const char aCommand3[8] = { 0x7E,0x03,0x00,0x00,0x03,0xFF,0xFA,0xEF }; //Vi har 0x00 for ingen mappe, og 03 for track 3. sendKommandoTilSomo(aCommand3); } 6.3 Class Lys Udarbejdet af: Louise og August Klassen Light indeholder 7 funktioner, der tilsammen tillader os at styre lysene på bilen. 6.3.1 initLight() Den første funktion initLight() skal initialisere timer 4, og initialisere ben 3 og 4 på Port H som udgange. Timer 4 bliver brugt i PWM, Phase Correct, 8 bit mode til at danne et PWM-signal på pin 6 og 7. Figur 30 - Forklaring af ikke-fast PWM-signal Side 46 af 74 PRJ1 SW1 På figur 30 kan det ses hvordan en timer i ikke-fast PWM-mode fungerer. OCRn er den værdi vi skal skrive til timeren, for at bestemme vores duty-cycle. For den valgte initialisering af timer 4, toggles udgangssignalet på OCn til at være low når OCRn = tælleregisteret under optælling, og high når OCRn = tælleregisteret under nedtælling. Frekvensen hvormed timeren tæller op, er afhængig af CPU-frekvensen, prescalerværdien og TOP. Frekvensen for arduinoens CPU er 16MHz, prescalerværdien er valgt som værende 256, og værdien for TOP i den valgte mode er 0x00FF = 255. Værdien af TOP kan findes i figur 31. Figur 31 - Udsnit af tabel over hvordan 16-bit timers sættes i PWM-mode Dette giver ifølge formlen: 𝑓= 𝑓𝑐𝑝𝑢 𝑁 ∗ 2 ∗ (𝑇𝑂𝑃 + 1) En frekvens på: 𝑓= 16𝑀𝐻𝑧 = 122𝐻𝑧 256 ∗ 2 ∗ (255 + 1) 122Hz er en acceptabel frekvens, da det eneste krav til frekvensen for PWM-signalet er at man ikke skal kunne se lysene blinke. 6.3.2 PWM-styrings funktioner Skrevet og udarbejdet af: August og Louise Ved at udskrive specifikke værdier til registrene OCR4A og OCR4B, kan vi hermed styre duty-cyclen for PWM-signalet til vores lys. Til dette bruges funktionerne: void frontLighOn(); void frontLightOff(); void backLightOn(); Side 47 af 74 PRJ1 SW1 void backLightOff(); void brakeLightOn(); void brakeLightOff(); Ingen af disse funktioner har nogen parametre eller returværdi, det eneste de gør, er at udskrive den ønskede værdi til det ønskede register. Funktionerne der styrer duty-cyclen for signalet til forlyset vil udskrive en værdi til registeret OCR4A, da forlysene kører på A-systemet af timer 4. Modsat udskriver funktionerne der styrer baglyset en værdi til registeret OCR4B, da baglysene kører på Bsystemet af timer 4. I sektion 5.3 og 5.4 beregnedes den forventede duty-cycle for både forlysene og baglysene. For forlys og bremse/bak-lys fandtes duty-cyclen til 95%, og for normalt baglys fandtes den til 32%. Værdien der skal udskrives til OCR4A/OCR4B, kan udledes ved følgende formel: 𝑑𝑢𝑡𝑦𝑐𝑦𝑐𝑙𝑒 = 𝑂𝐶𝑅𝑛 𝑇𝑂𝑃 OCRn ved dutycycle 95%: 𝑂𝐶𝑅𝑛 = 255 ∗ 0.95 = 242,25 OCRn ved dutycycle 32%: 𝑂𝐶𝑅𝑛 = 255 ∗ 0.32 = 81,6 I tabellen nedenfor, kan det ses hvad de enkelte funktioner udskriver til hvilke registre. Det bemærkes at frontLightOff() og backLightOff() begge sætter dutycyclen til 0%, hvorimod brakeLightOff() sætter dutycyclen til 32%, det samme som backLightOn(). Dette skyldes at baglyset ikke skal slukke når bilen stopper med at bremse/bakke, men derimod skal fortsætte med normalt baglys. Funktion frontLightOn() frontLightOff() backLightOn() backLightOff() brakeLightOn() brakeLightOff() OCR4A 242,25 0 OCR4B 81,6 0 242,25 81,6 Side 48 af 74 PRJ1 SW1 6.4 Class Reflex Skrevet og udarbejdet af: Lasse Klassen reflex skal indeholde funktioner og interrupts, som holder styr på hvorhenne på banen bilen er, og dermed hvad den skal gøre hvornår. 6.4.1 Interrupts Det centrale i denne klasse er, at vi skal tælle op hver gang der forekommer signal fra refleksbrikkerne. Til dette benytter vi os af interrupts, som vi kan måle på arduinoens pin 2 og 3. De sættes derfor til indgange i initieringen, samtidig med at vi definerer interruptet til at gå i gang på rising edge. Når der så forekommer et interrupt, har vi defineret en bool, som afgør om der skal tælles op, eller den allerede er opfanget på den anden refleksbrik. På denne måde undgår vi både at de begge tæller op samtidig, samt at vores tællevariabel kommer til at stige med 2 hver gang vi passerer en enkelt refleksbrik. Pseudokoden for vores interrupts ser således ud: - - Hvis der ikke er opfanget et interrupt for nylig o Interrupts ikke tilladt o Inkrementer tællevariabel Vent 200 ms Interrupts tilladt igen For at følge med i hvor mange der er talt, benytter vi os af LED-driveren som tidligere er lavet i MSYS som LAB-øvelse. Her kan vi få LED’erne på arduinoen til at vise hvad vores tællevariabel står på, og dermed teste vores program. Side 49 af 74 PRJ1 SW1 6.5 SW-design af main-rutine Skrevet og udarbejdet af: Lasse Main-rutinen skal fungere sådan, at hver gang en refleksbrik opfanges, skal der køres forskellige funktioner til de forskellige dele på bilen. Derfor er det oplagt at benytte os af switch-cases, så vi på den måde kan holde styr på hvorhenne på banen bilen befinder sig, og dermed hvilke funktioner der skal køres. Derudover er alle switch-cases, samt getCount(), lagt ind i et while(1)-loop, med en break i slutningen af hver enkelt case. Dette gør at programmet hele tiden kigger efter om en refleksbrik er passeret, og kører så tilsvarende case. Breakkommandoen i slutningen af hver case sikrer os, at hver case kun bliver kørt gennem en enkelt gang. Derudover har vi også benyttet os af LED-driveren som er blevet omtalt tidligere, til at få arduinoens LED’er til at tælle op i binær, så vi kan følge med i hvilken case der kører på hvilke tidspunkter. En skitsering af banen ses på figur 32, hvor hver enkelt røde streg svarer til en refleksbrik, og pilene til bilens retning og casenr. Bilen starter i case 0, som er før banens start, som sættes i gang af brugeren, hvor den derefter kører ind på banen og følger de enkelte cases når den tilsvarende refleksbrik passeres. Derudover skal der også oprettes et objekt til hver hardwaredel, til at benytte funktionerne på, da der er opdelt i klasser. Dette er også med til at give overblik over hvilke funktioner der hører til hvilken hardware. Figur 32 - Illustration over hvornår de forskellige cases træder i kraft ved bilens gennemkørsel af banen Side 50 af 74 PRJ1 SW1 7. Hardwareimplementering og modultest Skrevet af: Lasse Tidligere i afsnittet ”Hardwaredesign” har vi beskrevet designet for de forskellige komponenters hardware. Ud fra dette vil vi nu realisere kredsløbene, og teste at de virker som ventet, inden de sættes på bilen. 7.1 HW-implementering og test af motor Skrevet af: Lasse Udarbejdet af: Lasse, med hjælp fra Kim I afsnit 5.1 blev designet af motorens hardware beskrevet. Ud fra figur XX som blev udarbejdet der, er kredsløbet blevet realiseret på veroboard. Veroboardet ses på figur XX. Figur 33 - Veroboard med motorstyrings hardware Inden printet placeres på bilen, bliver det testet i isolation ved brug af analog discovery. Først testede vi H-broen, om den kunne skifte over når man påsatte en spænding på H-bro switch pinen. Her kunne man høre hver gang den skiftede over, så vi kunne godtage dens funktionalitet. Derefter placerede vi printet på bilen og forbandt det til motoren, da vi skulle teste om den kunne få motoren til at køre, og om hjulene skiftede retning når der blev påsat en spænding på spolen. Her kunne vi igen godtage, at hjulene drejede rundt som de skulle, og når vi påsatte en spænding på spolen, skiftede hjulene retning. Her fandt vi også ud af, at der skulle bruges en frekvens på omkring 250 Hz, for at få bilen til at køre uden at hjulene ”hakkede” frem og tilbage. Dette kommer vi tilbage til senere i softwaren til motorstyringen. Side 51 af 74 PRJ1 SW1 7.2 HW-implementering og test af lys Udarbejdet og skrevet af: August og Louise Ud fra multisim diagrammerne figur 19 og figur 23 i afsnit 5.3 og 5.4, er der blevet udarbejdet følgende kredsløb på veroboard. Veroboardene ses på figur 34 og 35. Figur 34 - Veroboard for forlys Figur 35 - Veroboard for baglys For at teste om forlysene og baglysene fungerer som forventet, måles middelstrømmen over LED’erne. Analog Discovery bruges som både spændingsforsyning, og funktionsgenerator der udsender et PWM-signal. Ifølge kravsspecifikationen skal forlysene have en middelstrøm på 60mA +/- 6mA gennem hvert sæt af forlygter. For at finde middelstrømmen, måles spændingsfaldet over formodstandene R1 og R2 for lygterne. Under testen findes at der ved en duty-cycle på 70% for PWM-signalet måles en spænding på 1,44V over resistorne R1 og R2. Ved ohms lov findes det at 1,44𝑉 strømstyrken igennem R1 så er: 𝐼𝑅1 = 24𝑜ℎ𝑚 = 60𝑚𝐴. For at teste baglysene bruges samme fremgangsmåde som ved forlysene. Der måles spændingsfald over R3 og R4, og Analog Discovery bruges som forsyningsspænding og funktionsgenerator. Når baglysene skal fungere som bremselys/baklys, skal der løbe en middelstrøm på 60mA +/- 6mA gennem hvert sæt af baglygter. Under testen findes at der ved en duty-cycle på 90% for PWMsignalet måles en spænding på 2,75V over resistorne R4 og R5. 2,75 Ohms lov: 𝐼𝑅4 = 44𝑜ℎ𝑚 = 62,5𝑚𝐴 Side 52 af 74 PRJ1 SW1 Baglysene testes også i situationen hvor de bare fungere som baglys, hvor der skal løbe en middelstrøm på 20mA +/- 2 mA gennem hvert sæt af baglygter. Under testen findes at der ved en duty-cycle på 30% for PWM-signalet måles en spænding på 0,91V over resistorene R4 og R5. 0,91 Ohms lov: 𝐼𝑅4 = 44𝑜ℎ𝑚 = 20,682𝑚𝐴 7.3 HW-implementering og test af lyd Udarbejdet og skrevet af: Altaf Ud fra multiSIM-diagrammet i afsnit 5.2, er der blevet bygget følgende på veroboard: SOMO-2 SPKSPK+ TX RX VCC GND 𝟏𝒌𝛀 Figur xx - Ovenfor kan det ses, at selve lydmodulet er opbygget på et veroboard. Til SOMO-2’en benyttes to sokler, således SOMO-2’en kan genbruges. Den polyfoniske højtaler er fastbundet til veroboardet med kobbertråd, og på den måde koblet til SOMO-2’ens SPK+ og SPK-. Derudover er der anvendt 6 pins til hhv. GND, VCC, RX, TX, SPK+ og SPK- - dog skal det bemærkes at den sjette pin ikke benyttes, hvilket er uddybet tidligere i afsnit 5.2. Med disse pins kan vi dermed forbinde SOMO-2’en til vores Arduino på følgende måde: 1. VCC til 5V-porten på Arduino. 2. GND til en af GND-portene på Arduino. 3. RX-benet til TDX0-porten på Arduino. Og vores SOMO-2 til højtaleren på følgende måde: 1. SPK+ til den første port på højtaleren. 2. SPK- til den anden port på højtaleren. 7.4 HW-implementering og test af refleksbrik Skrevet af: Lasse Selve refleksbrikkerne er lavet og testet i sammenhæng med værkstedspraktikken, så dette skal ikke beskrives her. Men en kort forklaring på deres funktionalitet er, at refleksbrikken udsender et lys gennem en rød LED, og ved siden af LED’en sidder en fotodiode, som lader strøm løbe gennem sig når den opfanger lys. Når en refleksbrik så passeres på banen, vil lyset fra LED’en blive reflekteret ind i lysdioden, som så lader strømmen løbe gennem sig. Strømmen går så ud til en pin, som vi kan forbinde til arduinoen, og dermed måle hver gang en refleks passeres på banen. Side 53 af 74 PRJ1 SW1 8. Softwareimplementering og modultest Skrevet af: Lasse Tidligere i afsnit 6 omhandlende softwaredesignet, har vi fundet frem til de forskellige funktioner som skal implementeres i de forskellige klasser. Ud fra dette skal de forskellige drivers nu skrives, samt dertilhørende testprogrammer. 8.1 SW-implementering og test af motordriver Skrevet og udarbejdet af: Lasse Ud fra SW-designet til motoren, beskrevet tidligere i afsnit 6.1, har vi skrevet koden til motordriveren. Dertil har vi også skrevet et testprogram, som benytter både setSpeed() med forskellige parametre for at teste bilens hastigheder, samt setDirection() til at køre frem og tilbage. Pseudokoden for testprogrammet ser således ud: - initiering af motoren - implementering af motorobjekt (bruges til at anvende funktionerne på, da vi arbejder i klasser) - uendeligt while-loop - kør frem - sæt hastighed til 40% - sæt hastighed til 70% - sæt hastighed til 40% - stop (sæt hastighed til 0%) - kør bagud - sæt hastighed til 40% - sæt hastighed til 70% - sæt hastighed til 40% - stop (sæt hastighed til 0%) Ved test af dette testprogram kunne vi se, at bilen kørte som forventet, og dermed kan vi konkludere at vi har en fungerende driver for motorstyringen. 8.2 SW-implementering og test af lysdriver Udarbejdet og skrevet af: Louise og August Ud fra SW-designet for lysene i afsnit 6.3, har vi skrevet koden til lysdriveren. For at teste at driveren fungerer som de skal, er der skrevet et testprogram som benytter alle funktionerne i driveren: initLight(), frontLightOn(), frontLightOff(), backLightOn(),backLightOff(), brakeLightOn() og brakeLightOff(). I både driveren og testprogrammet, anvendes de målte dutycycles fra modultest af hardware 7.2. Side 54 af 74 PRJ1 SW1 Pseudokoden for testprogrammet ser således ud: - Initiering af lysene - Oprettelse af lysobjekt - Uendeligt while-loop o Tænd for forlys o Tænd for baglys o 1 sekund delay o Tænd bremselys o 1 sekund delay o Sluk bremselys (som tænder det normale baglys) o 1 sekund delay o Sluk for forlys o Sluk for baglys o 1 sekund delay Ved test af programmet, kunne det ses at lysene skiftede tilstand når vi forventede de skulle, og vi kan dermed konkludere at lysdriveren fungerer som forventet. 8.3 SW-implementering og test af lyddriver Udarbejdet og skrevet af: Altaf Vores SOMO-2 har i sit datablad, beskrevne og angivet kommandoer som vi kan kalde, og dermed afspille lyd og skrue op og ned for lydvolumen. Disse kommandoer er alle skrevet i HEX-decimaltal. Derudover er der i vores softwareimplementering en række andre funktioner, som alle er skrevet i Csprog. Sammen med kommandoerne for SOMO-2’en og funktionerne i vores lydSystem.c, har vi lavet en class ”lyd” i C++, hvormed vi kan få SOMO-2’en til at afspille vores lyde - class’en er beskrevet nærmere i afsnit 6.2. Vi vil nu opskrive pseudokoden for vores testprogram: Side 55 af 74 PRJ1 SW1 1. 2. initLyd(); initUART(Sæt BAUD-rate til 9600, 8bit). Initiér og hent lyd fra SD-kort. Send kommandoen til SOMO-2. Reset SOMO-2 til POWER-ON-STATE. Send kommandoen til SOMO-2. Delay på 3 sekunder. setMaxLyd(); Set volumen til max (30). 3. startLyd(); - Spil track 1 fra SD-kort (INGEN MAPPE I SD-KORT). Send kommandoen til SOMO-2. - Delay på 5 sekunder. 4. reflexLyd(); - Spil track 2 fra SD-kort (INGEN MAPPE I SD-KORT). Send kommandoen til SOMO-2. Delay på 5 sekunder. 5. slutLyd(); Spil track 3 fra SD-kort (INGEN MAPPE I SD-KORT). Send kommandoen til SOMO-2. Delay på 5 sekunder. Figur xx - Opstilling af lydmodul og test. Opstillingen på figur XX består af selve lydmodulet og vores ArduinoMega2560. Testen fungerer på den måde, at vores Arduino er forbundet til en PC - både for strøm men også for selve download af vores testmain.c fra PC’en. Vi kan derefter forbinde VCC og GND fra SOMO-2 til 5V og GND til Arduino’en, RX fra fra SOMO-2 til TDX0 til Arduino og til sidst SPK- og SPK+ fra SOMO-2 til højtaleren. Testen beviste at vores softwareimplementering kunne få SOMO-2 til at udføre vores kommandoer i testmain.c og dermed afspille de ønskede lyde, og yderligere sætte lyden til max og lave delays. Side 56 af 74 PRJ1 SW1 8.4 SW-implementering og test af refleksbriksensor-driver Skrevet og udarbejdet af: Lasse Som beskrevet tidligere i afsnit 6.5 omhandlende softwaredesignet for refleksbrikkerne, har vi skrevet koden til en refleksbrikdriver. For at teste driveren, har vi også skrevet et testprogram til den. Det er et forholdsvis simpelt program, som viser på arduinoens LED’er hvor mange gange en refleksbrik er blevet opfanget. Til dette benyttes LED-driveren som er skrevet tidligere i LAB-øvelserne i MSYS. Driveren testes så ved både at tælle op ved at bevæge en refleks hen over refleksbrikken, og se at den tæller en op. Derefter testes der at den også kun tæller en op når der bevæges en refleks hen over begge refleksbrikker samtidig. Ved begge tests kunne vi konkludere, at den kun talte op en enkelt gang, og dermed kan vi konkludere, at vi har en fungerende refleksbrikdriver. 8.5 SW-implementering og test af main-rutine Skrevet og udarbejdet af: Lasse Ud fra SW-designet omhandlende main-rutinen beskrevet i afsnit 6.6, har vi skrevet selve main programmet, med alle driverne fra tidligere inkluderet. For at teste main-rutinen, har vi benyttet os af både LED-driveren og refleksbrikdriveren, som begge er omtalt tidligere i afsnit 8.4. Denne gang tester vi ved at tænde specifikke LED’er ved hver switch case, så vi kan se at den skifter mellem de enkelte cases korrekt. Ved udførelse af denne test, kunne vi konkludere at de korrekte LED’er tændte på de korrekte tidspunkter, og derfor kan vi så begynde på integrationstest af de forskellige elementer, som skal med på bilen. Side 57 af 74 PRJ1 SW1 9. Integrationstest Skrevet af: Lasse Vi skal nu begynde at ”samle” bilen, ved få de enkelte dele til at køre sammen en ad gangen. Dette gøres ved, at vi forbinder delene til bilen, og inkluderer dens software inde i main-rutinen, som tidligere er testet med refleksbrikkerne. Så kan det testes ved at køre banen igennem, og rette værdier til hvis dette viser sig at være nødvendigt. Målet med integrationstesten er at vi til sidst står med en færdig bil der kører banen korrekt, så den kan gennemføre accepttesten fra tidligere. 9.1 Integrationstest af bilens motor Skrevet af: Lasse Testet af: Lasse og Kim Den første del der integreres på bilen, er bilens motor. Det gør det nemlig muligt at teste bilen på banen, og se om de andre dele opfører sig korrekt alt efter bilens placering på banen. Testen udføres ved at sættes motorens hardware på bilen, forbinde de nødvendige forbindelser, og inkludere motordriveren inde i main-rutinen. Så sætter vi bilens hastighed i de forskellige cases som vi tror vil få bilen til at gennemføre banen, og tester den. Ved at gøre dette igen og igen, finder vi frem til nogle værdier for bilens hastighed, som får den til at gennemføre banen med så få fejl som muligt. Når dette er gjort, er vi klar til at integrere et nyt element af hardwaren på bilen. 9.2 Integrationstest af bilens lys Skrevet af: August Testet af: Louise, August, Altaf og Lasse Den anden del der integreres, er bilens lysmodul. Lyset sættes først isoleret på bilen, uden nogen af de andre moduler. Testen udføres ved at inkludere lysdriveren i main-rutinen. Både forlys og baglys bliver koblet til spændingsregulatoren, og forlysene til pin 7 på arduinoen for PWM-signalet, og baglysene til pin 6. Lysstyrken i lygterne sættes til de ønskede værdier i de forskellige cases, og en refleksbrik holdes foran reflektionsprintet for at simulere at bilen kører gennem banen. Testen går som forventet, og både forlys og baglys fungerer som de skal. Nu inkluderes også motordriveren i main-rutinen, og bilen kører igennem banen. Ved gennemkørsel af banen, ses det at både forlys og baglys ændrer tilstand på de rigtige tidspunkter, og vi kan dermed konkludere at de to moduler fungerer sammen som forventet. 9.3 Integrationstest af bilens lyd Skrevet af: Altaf Testet af: Louise, August, Altaf og Lasse Den sidste del der integreres på bilen, er vores lydmodul. Dette gør det muligt at se/høre, om lydmodulet er funktionsdygtig med initiering af startlyd når bilen skal starte, reflexlyd når bilen passerer en reflex og afslutningsvis slutlyd når bilen stopper. Denne test udføres ved først at påsætte lydmodulet på bilen, og forbinde VCC og GND til en fælles VCC- og GND-central på bilen. Derefter forbindes RX fra SOMO-2’en til TDX0 på én fælles Arduino (den Arduino som kører main-rutinen). Når SOMO-2’en er forbundet til bilen korrekt, implementerer vi herefter softwaren for lyden i vores main-rutine. Vi kan derefter teste bilens lyd på kørebanen. Side 58 af 74 PRJ1 SW1 Under denne integrationstest finder vi ud af, at når lyden er integreret i bilen, forhindrer vores SOMO-2 bilens kørsel i sådan en grad, at bilen ikke er funktionsdygtig. Yderligere ødelægger denne integration også SOMO-2’en, hvis den er forbundet til bilens kredsløb i længere tid. 10. Accepttest Skrevet af: Lasse Da vi ikke kunne få bilen til at gennemføre banen korrekt mens lyden var påsat og integreret i main, har vi valgt at gennemføre accepttesten mens bilen kun er påført motoren og lyset. Kravene til lyden er så bagefter testet uden for bilen, for at tjekke om lydens hardware og software fungerer for sig selv. 10.1 Test af funktionelle krav Accepttesten er gennemgået i fællesskab Use case 1: Use case 1: ”Kør banen” Test Forventet resultat Opnået resultat Godkendt / kommentar 1. Brugeren tænder for bilen og placerer den, så den kører forlæns ind på banen ved at passere startlinjen. Visuel test: Bilen stopper mellem refleksbrikkerne 6 og 7. Bilen stopper oftest mellem refleksbrikkerne 6 og 7. Godkendt. En gang i mellem forekommer der støjinterferens, der får bilen til at bakke en gang for tidligt. Testet uden lyd. Visuel test: Bilen bakker og standser mellem refleksbrikkerne 5 og 4. Bilen bakker og stopper oftest mellem refleksbrikkerne 5 og 4. Godkendt. En gang i mellem forekommer der støjinterferens, der får bilen til at stoppe og køre frem for tidligt. Denne use case beskriver, hvordan banen skal gennemkøres. Punkt 1 + punkt 2 Punkt 3 2. Når bilen har passeret refleksbrik nummer 6, bringes bilen til standsning, inden refleksbrik nummer 7 nås. 3. Bilen bakker, indtil refleksbrik nr. 5 er passeret, og bringes til standsning inden refleksbrik nr. 4 nås. Side 59 af 74 PRJ1 Punkt 4 og 5 SW1 4. Bilen kører forlæns, indtil refleksbrik nummer 7 nås. 5. Bilens bringes til standsning i måleområdet, der er defineret som området mellem banens slut-ende og en meter efter banens slut-ende. Visuel test: Bilen starter og kører frem til refleksbrik nr. 7, og stopper inden for det definerede måleområdet. Bilen kører frem og stopper oftest inden for det definerede målområde. Hvis støj har haft effekt på bilens kørsel, vil der forekomme følgefejl her. Test Forventet resultat Opnået resultat 2.1. Når bilen tændes for at køre ind på banen, afspilles en specifik ”startlyd” eller ”startmelodi”. 2.2. Hver gang en refleksbrik passeres, afspilles en specifik ”refleksbriklyd”. ”Høretest”: Startlyden afspilles når bilen startes. 2.3. Når refleksbrik nummer 7 ”Høretest”: Bilen afspiller slutlyden når den Testet uden lyd. Godkendt. En gang i mellem forekommer der støjinterferens, der får bilen til at bakke en gang for tidligt. Testet uden lyd. Use case 2: Use case 2: ”Afspil lyd” Godkendt/kommentar Denne use case beskriver styring af en i systemet indbygget lydgiver. Initieres af: Use case 1 ”Kør banen”. Punkt 1 Punkt 2 Punkt 3 ”Høretest”: Refleksbriklyden kan høres hver gang en refleksbrik passeres. SOMO-2’en er ikke i stand til at spille nogen lyd, når den Side 60 af 74 PRJ1 SW1 passeres, afspilles en specifik ”slutlyd” eller ”slutmelodi”. passerer mållinjen tilkobles bilens samlede hardware. Det skal også bemærkes, at den brænder på, hvis den er sat til i for lang tid. Use case 3: Use case 3: ”Styr forlys” Denne use case beskriver styringen af bilens indbyggede forlys. Forlyset kan være slukket eller tændt. Initieres af: Use case 1 ”Kør banen”. Punkt 1: Punkt 2: Test Forventet resultat Opnået resultat Godkendt/kommentar Forlyset skal være tændt, når bilens motor påtrykkes en spænding, for at bringe den til at køre. Ellers skal forlyset være slukket. Måletest: Forlyset lyser med en strøm på 60 mA +/- 6 mA. Den lyser kun når motoren er tændt på bilen. Den målte strøm er inden for det definerede område, og forlyset lyser kun når bilen kører. Godkendt Testet uden lyd Forlyset skal lyse i en kold hvid farve ud af LED’en: LTW-2S3D8 Visuel test: Forlyset lyser med hvidt lys. Forlyset lyser med hvidt lys Godkendt Testet uden lyd Side 61 af 74 PRJ1 SW1 Use case 4: Use case 4: Test ”Styr baglys” Denne use case beskriver styringen af bilens indbyggede baglys. Baglyset kan være slukket, lyse med mellemstyrke (”almindeligt baglys”) eller lyse med kraftig styrke (”bremselys”). Initieres af: Use case 1. ”Kør banen”. Punkt 1: 4.1 Baglyset skal lyse med mellemstyrke (”almindeligt baglys”), når bilens motor påtrykkes en spænding, for at bringe den til at køre. Ellers skal baglyset være slukket. Punkt 2: 4.2 Baglyset skal lyse med kraftig styrke (”bremselys”), mens spændingens til bilens motor mindskes. Bremselyset skal herefter forblive tændt i 0,5 sekund +/- 0,1 sekund. Forventet resultat Opnået resultat Godkendt/komm entar Måle og visuel test: Baglyset lyser med en middelstrøm på 20 mA +/- 2mA gennem hvert sæt af baglys, kun når motoren påtrykker en spænding for at bringe den til at køre Måle og visuel test: Baglyset lyder med en middelstrøm på 60 mA +/- 6mA gennem hvert sæt af baglys, kun når bilen bremser eller bakker. Den målte strøm er inden for det definerede område, og baglyset lyser kun når bilen kører. Godkendt Testet uden lyd. Den målte strøm er inden for det definerede område, og baglyset lyser kun når bilen bremser eller bakker. Godkendt Testet uden lyd. Side 62 af 74 PRJ1 SW1 10.2 Test af ikke-funktionelle krav 1. Generelle krav Krav- Krav nr. 1.1 Bilen skal på en enkelt opladning af dennes batterier kunne gennemføre mindst 5 gennemkørsler af banen. 1.2 På bilens højre og venstre side skal placeres detektorer, der kan registrere en R80 refleksbrik i afstanden 2 cm til 25 cm. 1.3 Bilen monteret med al udstyr må maksimalt veje 5,2 kg. 1.4 Bilens maksimale højde skal være 41 cm. 1.5 Bilens maksimale bredde skal være højst 46cm med ekstraudstyr. Test Resultat Godkendt/kommentar Visuel test: Bilen tændes og kører banen korrekt 5 gange i træk på en opladning Bilen tændes og kører banen. Hvis refleksprintet opfanger reflekssensorerne og giver et ”returlys” er kravet godkendt Bilen vejes, godkendes hvis vægten er under 5.2 kg. Bilen har kørt banen korrekt fem gange i træk Godkendt LED’erne der indikerer modtaget returlys lyser når bilen passerer en refleksbrik Godkendt Det findes ved afvejning af bilen, at den vejer mindre end 5,2 kg Det findes ved måling, at bilens højeste punkt, er lavere end 41 cm fra gulvet. Godkendt Det findes ved måling, at bilens bredde fra yderste punkt i venstre side, til yderste punkt i højre side, er under 46 cm. Godkendt Bilens højde måles med et målebånd med 0.1 cm’s præcision fra gulvet til bilens højeste punkt. Godkendt hvis højden < 41 cm. Bilens bredde måles med et målebånd med 0.1 cm’s præcision fra yderste punkt i venstre side, til yderste punkt i højre side. Godkendt hvis bredden < 46 cm. Godkendt Side 63 af 74 PRJ1 SW1 2. Bilens forlys Krav nr. 2.1 Krav Forlys implementeres med 2 hvide LED-sæt, der monteres med et sæt i henholdsvis højre og venstre side, foran på bilen. 2.2 Når forlyset er tændt, skal strømmen gennem hvert LED-sæt være 60 mA +/- 6mA. Test Visuel test: Sidder der en hvid LED i både højre og venstre side foran på bilen, som er synlige Måletest: Der tilsættes en strøm til forlyset LED’er hvor vi måles med et multimeter, at strømmen er inden for det godkendte område. Resultat Forlysene opfylder kravene Godkendt/kommentar Godkendt Den målte strøm for forlyset er inden for det definerede område. Godkendt Test Visuel test: Sidder der på en LED og højre og venstre side bag på bilen, som er synlige Resultat Baglysene sidder korrekt Godkendt/kommentar Godkendt Måletest: Når bilen deaccelererer for at køre baglæns, altså har en negativ acceleration, måles strømmen gennem LED’erne med et multimeter. Strømmen er målt til at ligge inden for det definerede område når bremselyset er tændt. Godkendt 3. Bilens bag- og bremselys Krav nr. 3.1 3.2 Krav Baglyset implementeres med 2 røde LEDsæt, der monteres med et sæt i henholdsvis højre og venstre side bag på bilen. Ved ”bremselys” skal middelstrømmen gennem hvert LED-sæt være 60 mA +/- 6 mA. Side 64 af 74 PRJ1 3.3 SW1 Strømmen skal måles til 60 mA +/- 6 mA Ved ”almindeligt Måletest: Når bilen er baglys” skal tændt, måles middelstrømmen strømmen over gennem hvert LED’erne med et LED-sæt være 20 multimeter. Strømmen mA +/- 2 mA. skal måles til 20 mA +/2 mA. Strømmen er målt til at ligge inden for det definerede område ved almindeligt bremselys Godkendt 4. Bilens lyd Krav nr. 4.1 4.2 4.3 4.4 Krav Startlyden/melodien skal være den lyd der afspilles i Mario Kart når man i spillet gør klar og der tælles ned fra 32-1-go. Refleksbrikslyden skal være den lyd der afspilles i spillet Mario Kart når man kører ind i en item box. Slutlyden skal være den lyd der afspilles i spillet Mario kart når man passerer mållinjen i spillet. Lyden skal komme ud af en polyfonisk højtaler på bilen. Test Resultat Høretest: Den spiller den Er korrekte lyd startmelodien den korrekte lyd Godkendt/kommentar Delvis godkendt Testet i isolation, uden for bil Høretest: Den spiller den Er korrekte lyd refleksbriklyden den korrekte lyd Delvis godkendt Testet i isolation, uden for bil Høretest: Er slutlyden den korrekte lyd Den spiller den korrekte lyd Delvis godkendt Testet i isolation, uden for bil Kommer lyden ud af en polyfonisk højtaler Ja Side 65 af 74 PRJ1 SW1 11. Konklusion 11.1 Konklusion for hardwaredelen Vi kan konkludere på hardwaredelen at vi har udviklet individuelle hardwaremoduler til motoren, forlyset, baglyset, strømforsyning og lyd, der fungerer som det er specificeret i kravspecifikationen. Vi har også testet disse moduler med Analog Discovery 2, hvor vi har konkluderet at de fungerede korrekt. Under integrationen af de forskellige moduler fandt vi dog ud af, at ved integration af lyd-modulet, stoppede bilen med at køre korrekt, og fungerede slet ikke. Dette har sandsynligvis været grundet støj fra motoren, som også var grund til problemer med kørslen tidligere. Grundet tidsnød var det ikke muligt at lægge den nødvendige tid det ville kræve at løse problemet, så vi har været nødsaget til at gennemføre accepttesten mens lyden ikke har været forbundet til bilen. 11.2 Konklusion for softwaredelen Vi kan konkludere på softwaredelen at vi har lavet fire forskellige drivere i c++, til at styre hhv. motoren, lyden, lyset, og refleksbrikkerne. Disse er blevet testet i diverse testprogrammer, hvor vi har kunnet konkludere at de hver især er velfungerende. Ved samling af disse i en main-rutine kan vi konkludere at driverne for motoren, lyset og refleksbrikkerne kan fungere sammen, mens lyddriveren giver problemer ved integrationen ind i main-rutinen. Vi har altså kunnet få bilen til at køre som det er specificeret i vores kravspecifikation, dog uden at den laver noget lyd. 11.3 Konklusion for projektet Vi kan konkludere at vi i dette projekt har designet både hardware og software efter kravsspecifikationen, og bygget hardwaren ud fra hardwaredesignet, samt skrevet driverne ud fra softwaredesignet. Disse er så blevet testet, og derefter implementeret på bilen, som har gennemført banen korrekt, dog uden at afspille lyd. Side 66 af 74 PRJ1 SW1 12. Individuelle konklusioner Hver enkelt individuelle konklusion er skrevet af personen selv. 12.1 Individuel konklusion: Altaf Rezai Personligt synes jeg, at dette projekt i starten lød lidt fjernt ift. slutproduktet, og at jeg var en smule forvirret over hvor vi skulle starte og slutte, da dette er det første store projekt jeg har været en del af. Dog forsvandt forvirringen da vi hver især fik vores fokuspunkter på hardware og softwaredelen, og især dette forløb har lært mig, at et projekt i denne størrelse bliver udarbejdet og skabt af en gruppe, og ikke kun af enkeltmanden. Læringskurven for projektet og hele semesteret generelt, har også været stejl, men dette har også presset os individuelt til at tage ved lære rimelig hurtigt, og dermed har vi lært en masse af dette projekt. Jeg kan med klarhed sige, at dette er en god forudsætning for de kommende projekter og ikke mindst semestre. Jeg synes personligt at gruppearbejdet i starten var lidt varierende, men at det mod enden har været rimelig fast, og at vi har alle vidst hvad vi skulle i gang med. Ift. vores insight profiler, har projektet også vist mig, hvordan større projekter kan påvirke min profil. Jeg er normalt meget rød, men har lært at være mere blå og grøn, hvilket jeg ikke er vandt til. Altså synes jeg samlet set, at dette projekt har været lærerigt og dermed også en god start på denne uddannelse, da den skaber en positiv forventning om de kommende semestre. 12.2 Individuel konklusion: Louise Andersen I starten, virkede dette projekt for mig lidt fjernt. Jeg havde svært ved at forholde mig til, hvordan vi skulle komme fra A til B. Det hele var stadig meget nyt og jeg følte ikke, at jeg havde nok viden om de forskellige ting, hvilket gjorde det ret uoverskueligt. Det blev klart bedre da vi dykkede ned i de forskellige ting, men jeg synes først, at jeg rigtig fandt min plads, da vi fik uddelegeret opgaverne og derved hver især havde vores del, at holde styr på. Personligt, synes jeg ikke, at vi kom særligt godt fra start mht. samarbejdet i gruppen. Kommunikationen har været svær. Vi har alle haft nogle forskellige behov og forskellige ønsker til tidspunkter at mødes, som vi måske kunne have været bedre til at imødekomme. Samarbejdet blev bedre, da vi fik uddelegeret opgaver og vi ’kun’ skulle forholde os til ’vores’ del af opgaven. Det blev mere overskueligt og målet var knap så fjernt. Der er dog stadig helt klart plads til forbedringer på den front og det er bestemt noget jeg har taget ved lære af. Men jeg synes, at vi som gruppe, er kommet i mål med et godt resultat. Generelt er jeg bedst til at sidde med tingene på egen hånd. Jeg bliver hurtigt forstyrret, hvis der er mange mennesker omkring mig. Jeg har derfor tendens til at lukke mig selv lidt inde og måske glemme at spørge om hjælp hvis nødvendigt. Dette passer også ret godt overens med min insightsprofil, som siger, at jeg er en stille og observerende person. Projektet har lært mig rigtig meget både på det personlige, men også det, at skulle samarbejde som en gruppe. Der er helt klart plads til forbedringer fra min side, som jeg vil ta med mig videre, i de næste forløb. Side 67 af 74 PRJ1 SW1 12.3 Individuel konklusion: Kim Van Le Projektet virkede lidt uoverskueligt fra starten af semesteret, da jeg ikke havde et overblik over, hvordan vi som gruppe kom fra start til slut. Det hjalp lidt med oplæggene og de diverse vejledende møder, men det var svært at se den røde tråd i hele forløbet, og vide hvad der skulle laves, siden vi blev gradvist informeret om hvad der skulle gøres. Det føltes til tider, at der var noget at lave og andre gange følte man sig bagud. Det hjalp på det, da vi uddelegerede opgaver og blev inddelt i grupper til motor, lys og lyd, da der var et bedre overblik og vidste hvad man skulle gå i gang med. I forhold til indsights-profilerne var det meget fint i starten at gå over dem, men de var ikke meget relevante for vores gruppe undervejs, da vi sjældent har været fuldtallige under møder/gruppearbejde, det har været med til at skabe besvær med samarbejdet og kommunikationen i gruppen. Indsights har dog givet mig selvrefleksion over min del af samarbejdet i projektet. Projektet har givet erfaring med samarbejde og hvordan arbejdsprocessen udvikler sig fra start til slutproduktet. 12.4 Individuel konklusion: Lasse Borring Petersen I starten virkede projektet med overvældende, men både oplæggene i starten af semesteret samt vejledermøderne var med til at gøre det hele mere håndgribeligt. Da vi gik i gang med IBD, BDD og softwaredesignet, var det hele stadigvæk meget fjernt, og jeg følte dengang at vi manglede viden omkring hvordan det hele skulle laves, og det var tit nødvendigt at gå tilbage og rette i det, i stedet for at man kunne bruge det som man egentligt skulle, ved at lave ting ud fra det. Da vi så inddelte os i undergrupper til hhv. motor, lys og lyd, blev det også mere håndgribeligt, i og med at man ikke længere behøvede at bekymre sig specielt meget om de andre ting. Personligt havde jeg ansvaret for motoren, så det var rart bare at kunne sidde og dykke ned i det, uden at skulle tænke på at man også skulle nå at lave alle de andre elementer der skulle med på bilen. Selve gruppearbejdet var i vores gruppe svært at få til at hænge sammen. I bagklogskabens lys skulle vi have gjort det mere klart i vores samarbejdsaftale hvad vores ambitioner var som gruppe, og lavet ordentlige og klare konsekvenser for ikke at møde op til gruppemøder og aftaler, som der også skulle ydes en indsats for at få overholdt. Jeg synes at mit eget personlige udbytte har været stort, men det hører nok sammen med at jeg endte med at tage en masse initiativ for mig selv, og bare få tingene gjort. Det passer også ret godt overens med min insights-profil, som sagde at jeg er en person som har det bedst med at sidde selv og fordybe mig i ting, hvilket jeg også gjorde klart overfor gruppen i starten af forløbet. Alt i alt vil jeg sige at projektet som helhed er forløbet nogenlunde, men der er helt klart plads til forbedring, som jeg vil tage med videre til kommende projekter. 12.5 Individuel konklusion: August Lind Hansen Projektforløbet har været en længere historie, som desværre ikke fulgte en lineær udfordringskurve. Det føltes modsat som en stejl mur Side 68 af 74 PRJ1 SW1 13. Bilagsoversigt Bilag 1. Konkurrencen ”Pokaljagten” er en dyst, hvor en elektrisk bil skal gennemføre en bane med forhindringer på kortest mulig tid. Bilen er under konkurrencen udstyret med en accelerationssensor (et pendul), der kan registrere accelerationer over en fast grænse. Overskridelse af denne grænse udløser strafpoint. Forhindringerne er udformet som ramper, bilen skal passere. Det vanskelige ved gennemkørslen er at tilpasse bilens acceleration til banens forskellige dele. Det er kun bilens fart og bevægelsesretning, der kan reguleres. Banen har bander, der sørger for bilens retning, og banderne er forsynet med refleksbrikker til positionsbestemmelse. De 7 par refleksbrikker er placeret parvist overfor hinanden på hver sin side af banen i positionerne: 1) 0,5 m fra banens start-ende 2) 0,5 m før bakken 3) På toppen af bakken 4) 0,5 m efter bakken 5) 1,5 m efter bakken 6) 2,5 m efter bakken 7) 0,5 m før banens slut-ende Figur 8. Banen med refleksbrikker Følgende regler gælder for gennemkørslen af banen: Point gives ud fra forskellige kriterier: • Point er lig med gennemførselstiden i sekunder. • Det dobbelte af fejltællerens visning tillægges som strafpoint. • Der tillægges strafpoint, hvis bilens samlede vægt (inklusiv udstyr og fejltæller) er over 5,2 kg. Der tillægges 1 strafpoint for hver påbegyndt 100 gram over 5,2 kg. • Bilen diskvalificeres, hvis dens kørsel ikke overholder kravspecifikationens use case 1. • Bilen diskvalificeres, hvis den ikke standser i målområdet. Banen er udstyret med lysbarrierer ved banens start og ved banens mål. Side 69 af 74 PRJ1 SW1 15 Gennemførselstiden måles fra lysbarrieren ved start til lysbarrieren ved slut. Efter mål skal bilen holde stille i målområdet. Hvis bilen kører længere end målområdet, diskvalificeres kørslen. Det samlede pointtal udregnes ved: Samlet point = Gennemførselstid i sekunder + strafpoint Laveste antal point vinder. Side 70 af 74 PRJ1 SW1 Bilag 2. Fysiske mål for karosseriet Side 71 af 74 PRJ1 SW1 Bilag 3. Arduinoens bendiagram Side 72 af 74 PRJ1 SW1 Bilag 4: Arbejdsfordeling Grøn = Primær aktør på området, har lavet det meste af delen. Gul = Sekundær aktør på området, har været med til delen i mindre grad. Rød = Har ikke været med til delen. Blå = Givet på forhånd el. lavet andetsteds. Emne (nr.) 1. 2. 2.1 2.2 2.3 3. 4.1.1 4.1.2 4.1.3 4.2 4.2.1 4.2.2 5. 5.1 5.2 5.3 5.4 5.5 6. 6.1 6.1.1 6.1.2 6.2 6.3 6.3.1 6.3.2 6.4 6.4.1 6.5 7. 7.1 7.2 7.3 7.4 Beskrivelse Lasse Problemformulering Kravspecifikation Aktør-kontekst diagram Funktionelle krav Ikke funktionelle krav Accepttestspecifikation BDD-diagram HW-arkitektur IBD-diagram HW-arkitektur Signalbeskrivelse HW-arkitektur Softwarearkitektur Moduldiagram Modulbeskrivelse Hardwaredesign Motorstyring Lyd Forlys Baglys Strømforsyning Softwaredesign Class motor setSpeed() setDirection() Class Lyd Class Lys InitLight() PWM-styrings funktioner Class Reflex Interrupts SW-design af main-rutine Hardwareimplementering og modultest HW-implementering og test af motor HW-implementering og test af lys HW-implementering og test af lyd HW-implementering og test af refleksbrik Kim Altaf Louise August Side 73 af 74 PRJ1 8. 8.1 8.2 8.3 8.4 8.5 9. 9.1 9.2 9.3 10. 11. 12.1 12.2 12.3 12.4 12.5 SW1 Softwareimplementering og modultest SW-implementering og test af motordriver SW-implementering og test af lysdriver SW-implementering og test af lyddriver SW-implementering og test af refleksbriksensor-driver SW-implementering og test af mainrutine Integrationstest Integrationstest af bilens motor Integrationstest af bilens lys Integrationstest af bilens lyd Accepttest Konklusion Individuel konklusion: Altaf Individuel konklusion: Louise Individuel konklusion: Kim Individuel konklusion: Lasse Individuel konklusion: August Side 74 af 74