Cykelsimulator. Esbjerg Institute of Technology

Relaterede dokumenter
Strømforsyning +/- 12V serieregulator og 5V Switch mode

Lyskryds. Thomas Olsson Søren Guldbrand Pedersen. Og der blev lys!

Switchmode Powersupply. Lasse Kaae 2009 Juni

Dansk Mink Papir. Teknisk brugermanual

Elektronikken bag medicinsk måleudstyr

Hjertets elektriske potentialer og målingen af disse

Temperaturmåler. Klaus Jørgensen. Itet. 1a. Klaus Jørgensen & Ole Rud. Odense Tekniskskole. Allegade 79 Odense C /

Det er nødvendigt for brugeren at læse, forstå og følge vejledningens instruktioner.

Indholdsfortegnelse :

Lodning. Intro leaded. Tommy Sørensen

DC-Motor Controller. Brugermanual

AGV Kursus August 1999

Der er derfor, for at alle kan sende, kun tilladt, at sende intermitterende. Altså korte pakker. ( Dette skal dog verificeres!!)

Projekt - RoboNet Del Journal.

Drejeskive fra Märklin/Fleischmann

Analog Øvelser. Version. A.1 Afladning af kondensator. Opbyg følgende kredsløb: U TL = 70 % L TL = 50 %

Opgavesæt udviklet til kursus Grundlæggende elektronik på mobile maskiner 2. Udviklet i 2015

Arduino kursus lektion 3:

1.0 Møllens hovedtræk Regler... 3

NMT - /40, 60, 80 NMT ER - /40, 60, 80 EGHN SMART - /60

DCC digital dekoder til magnetiske produkter

TG 8. Indhold: TG8 - Kredsløbsbeskrivelse Gruppemedlemmer: Kim Andersen, Kasper Jensen & Thyge Mikkelsen Dato: Modtaget af: Søren Knudsen

Massefylden af tør luft ved normalt atmosfærisk tryk ved havets overade ved 15 C bruges som standard i vindkraftindustrien og er lig med 1, 225 kg

BRUGSANVISNING KARMA

Vejledning til varmevekslerstyring SILVER C RX, RECOnomic str. 100/120, RECOsorptic str

ysikrapport: Maila Walmod, 1.3 HTX, Rosklide I gruppe med Morten Hedetoft, Kasper Merrild og Theis Hansen Afleveringsdato: 28/2/08

Her skal vi se lidt på de kræfter, der påvirker en pil når den affyres og rammer sit mål.

SVINGNING. 2 x 5,3 kw AC

Fasedrejning. Fasedrejning i en kondensator og betragtninger vedrørende RC-led.

SunFlux Varenr.: 03104

KVA Vind kw Husstandsvindmølle

Preben Holm - Copyright 2002

Projekt. HF-forstærker.

Servicemappe. C.Reinhardt as

Formålet med dette forsøg er at lave en karakteristik af et 4,5 V batteri og undersøge dets effektforhold.

Laboratorie Strømforsyning

Installationsmanual SuperSail Marine Alarm Marine Alarm Wireless

Projekt. Analog Effektforstærker.

Side 1. Installationsvejledning for. systemet. Version 1 December 2004

KVA Vind kw Husstandsvindmølle

8. Jævn- og vekselstrømsmotorer

Journal JTAG: Udarbejde af: Benjamin Grydehøj I samarbejde med PDA Projektgruppen. Elektronikteknologafdelingen på Erhvervsakademi Fyn.

Analogregnemaskinen. Datahistorisk Forening 30/8 2007

Manual til Dæk Nimalift.dk Manual, installations- og monteringsvejledning

El-lære. Ejendomsservice

Undervisningsbeskrivelse

Koncepter til overvindelse af barrierer for køb og installation af VE-anlæg task 2. Skitsering af VE-løsninger og kombinationer

Transienter og RC-kredsløb

SPIDER Quick guide. DATO: August 2017 FORHANDLER: WASYS A/S. Langebjergvænget Roskilde

Når strømstyrken ikke er for stor, kan batteriet holde spændingsforskellen konstant på 12 V.

Togstyring. Kian Soleiman Casper Lindholt Andersen Rune Lauritzen Jesper Dalsgaard Mikkel Krautz DE4-1-F09

Projekt - Roboventure Del journal. Power.

LASTSPIL 37 kw AC KRØLL CRANES A/S. INF. REF dk SIDE 1/9

Ombygning af PC strømforsyninger

Vejledning til Tidtagningssystem til ridebanespring. Sønderborg. Knap for addering af 6 sekunder ved total nedrivning af forhindring.

Automatisering Af Hverdagen

SPEED-Commander Frekvensomformer. Program Nr. 05 Ver. 5.17a. Fortløbende en-vejs positionering

Vejledning til Tidtagningssystem til ridebanespring. Sønderborg. Manuel Signal ( Radiosignal ) knap på pult ( Stopursfunktion )

Mekanik Legestue I - Gaussriffel og bil på trillebane

Betjeningsvejledning Seba VM-880 Stophanesøger. El.nr

Opgavesæt om Gudenaacentralen

C Model til konsekvensberegninger

Dansk Mini Racing Union. Banereglement Slot Racing & Scaleracing. DMRU 2016 v.1-1 -

Montage og brugsanvisning

TILSLUTNINGSANVISNING

PR 2000 Proximity-læser Art. Nr.: Installationsmanual

Funktions-data Fabriksindstilling Variabel Indstilling

Brugervejledning Fun2Go

TILLÆG TIL INSTRUKTIONSBOG

Teknologi & kommunikation

Kollektor. Teknisk skole Ringsted Fysikrapport Af Kenneth René Larsen Afleveret d.26. maj Emitter

1. Hovedramme 2. Bag stabilisator 3. For stabilisator 4. Cykelstyrsstang 5. Cykelstyr 6. Computer 7. Sædestang 8. Sæde 9. Pedaler 10.


Undervisningsmateriale til AMU mål Traktor/påhængsredsk: Test og justering af bremser

Undervisningsbeskrivelse for design & produktion - el

OSIRIS KW VINDMØLLE SEPEEG

Manual. ACO In-Line analog fugtmåler MMS. Moisture Measuring Sensors (MMS) Installation og kalibrering af:

SPACEGUARD SERIES SG 14

Brugervejledning.

KATSPIL 7.5 kw AC KRØLL CRANES A/S. INF. REF dk SIDE 1/7

LISA 2 System til faringsovervågning

Digital Drejeskive Decoder til 7286 / 7686

Hold 6 Tirsdag. Kristian Krøier, Jacob Christiansen & Thomas Duerlund Jensen Fag: ELA Lærer: Jan Petersen (JPe) Dato for aflevering: 29.

Anpartsselskabet BG Teknik Århus Grenåvej 148 DK-8240 Risskov Tel Fax

J-fet. Kompendium om J-FET

Af: Valle Thorø Fil.: Oscilloscopet Side 1 af 10

EDR Frederikssund afdeling Almen elektronik kursus. Afsnit 9-9B-10. EDR Frederikssund Afdelings Almen elektronik kursus. Joakim Soya OZ1DUG Formand

Dokumentation af programmering i Python 2.75

SizeWare. Bruger Manual. JVL Industri Elektronik A/S. Skive. Tandrem. Spindel. JVL Industri Elektronik A/S - Bruger Manual - SizeWare LB GB

Denne montagevejledning er gældende for 12 volt anlæg med MPPT regulator.

Fremtidens bilteknologier

Indholdsfortegnelse:

Brugervejledning for Senge- og dørvagt PIR2003

24 DC til DC omformer

Betjeningsmanual. Gælder for følgende modeller: Revisionsnr 12 1/7

Metal Detektor. HF Valgfag. Rapport.

Hvis der skal stilles på omskifterkontakterne efter installationen, skal fartpilotens betjeningsarm og bilens tænding begge stilles i Off stilling.

L P. Komfort / Alarm system Installationsvejledning. Tekniske data, symbol forklaringer

Transkript:

Cykelsimulator Esbjerg Institute of Technology Titel: Cykelsimulator Tema: Kombinerede analoge og digitale systemer Periode: P4, forår 2010 Gruppe: DE4-1-10 Vejleder: Bo Rohde Pedersen

Tiitelblad Titel: Cykelsimulator Tema: Kombinerede analoge og digitale systemer Afleveringsdato: 27/05-2010, kl. 12.00 Synopsis: Dette projekt omhandler en motionscykel, som ombygges til en cykelsimulator. Den er bygget op omkring en microcontroller og en computer. Computeren afvikler java-koden, som giver et grafisk interface. Til styring af modstanden på cykel er der påmonteret en DC-motor. Til motorstyringen er der anvendt fire transistorer og for at måle farten er der påmonteret en Hall-effekt sensor. Der er desuden blevet bygget en driver- og et delaykredsløb. Rapporten er opdelt i fire dele: Problemanalyse, Hardwareimplementering, Softwareimplementering og Perspektivering. Ud fra arbejdet med cykelsimulatoren, kan det konkluderes at hovedparten af kravene er opfyldt. Vejleder: Bo Rohde Pedersen Semester: 4. semester Gruppe: DE4-1-10 Gruppe medlemmer: Lasse Hansen Patrick Stolc Simon Pedersen Lasse Hansen Patrick Stolc Simon Pedersen i

1 Forord Denne rapport er udarbejdet af gruppen DE4-1-10 på Esbjerg Institute of Technology i forbindelse med P4-projektperioden på 4. semester. Gruppen har valgt at kigge på følgende problemstilling: Hvordan er det muligt at opbygge en cykelsimulator, således træningen bliver mere spændende?. Dette har været basis for hele rapporten. Projektet er bygget op af hardware- og software-enheder, der i samspil med hinanden, er fundamentet for cykelsimulatoren. Der er sat fokus på objektorienteret programmering og analog kredsløb. Der vil i rapporten, både vises eksempler på anvendelse af software og hardware. Sproget er let-forståeligt og dette medvirker at læseren ikke behøver have kendskab til emnet på forhånd. Rapporten er baseret på viden og erfaringer, som gruppen har tilegnet sig gennem SE- og PE-kurser. Kildehenvisninger angives som [X], og kan findes som et opslag sidst i rapporten. Med rapporten medfølger en CD-ROM, hvor der er inkluderet følgende: Datablade for anvendte komponenter Kildekoden til softwaren Billeder af produktet Rapporten i pdf-udgave Sidst i rapporten er hele kildekoden vedlagt i Appendix E. Vi vil gerne takke følgende personer, som har vejledet os med projektet: Vores hovedvejleder Bo Rohde Pedersen for vejledning og givet os forståelse af hardwaren, Henry Enevoldsen for hjælp til forståelse af hardware, David L. Hicks for hjælp vedrørende OO-programmering og softwarestukturen og Dil Muhammad Akbar Hussain for hjælp til databasedesign. Lasse, Patrick og Simon 27. maj, 2010 ii

Indholdsfortegnelse 1 Forord ii I Problemanalyse 1 2 Problemformulering 1 3 Kravspecifikation 1 3.1 Fremgangsmåde............................... 2 3.1.1 Motor- og bremsestyring...................... 2 3.1.2 Regulering.............................. 2 3.1.3 Timer og datalog.......................... 2 3.1.4 Grafisk simulering.......................... 2 4 Design af system 3 5 Afgrænsning 3 II Hardware-implementering 4 6 Motorer 4 6.1 Børstet DC-motor.............................. 4 6.2 Stepmotor.................................. 5 6.3 Servomotor................................. 5 6.4 Moment................................... 6 6.5 Valg af motor................................ 7 7 H-bro introduktion 8 8 Dioder 9 8.1 Halvleder-diode............................... 9 8.2 Schottkydiode................................ 10 9 Transistor 11 9.1 Opbygning.................................. 11 9.2 Bipolar Junction Transistors (BJT).................... 11 9.3 Metal Oxide Semiconductor Field-Effect Transistor........... 14 9.4 Valg af transistor.............................. 17 9.5 Heat sink.................................. 17 10 Bootstrap 18 10.1 Bootstrap kredsløb............................. 18 10.2 Test af bootstrap.............................. 20 iii

11 Delay 21 11.1 Kort om operationsforstærkere....................... 21 11.2 Operationsforstærker som komparator................... 22 11.2.1 Beregning af delay......................... 23 11.3 Spændingsregulering............................ 24 12 Omdrejningstæller 25 12.1 Encoder................................... 25 12.2 Hall-effekt-sensor.............................. 25 12.3 Valg af omdrejningsmåler.......................... 25 13 Samlet kredsløb 26 14 Delkonklusion 27 III Software-implementering 28 15 Opbygning 28 15.1 Grafisk brugergrænseflade......................... 28 15.2 Database................................... 29 15.3 Seriel kommunikation............................ 29 15.4 Backend................................... 30 15.4.1 Timer................................ 30 15.4.2 Hardwaresimulering......................... 30 15.4.3 Modstandsstyring.......................... 31 16 Konstruktion 31 16.1 Grafisk interface............................... 31 16.1.1 Hovedvinduet............................ 31 16.1.2 Metoder............................... 32 16.1.3 JDialog............................... 33 16.1.4 Grafisk afbildning.......................... 34 16.2 Database................................... 36 16.2.1 Forbindelse til databasen...................... 36 16.2.2 Database operationer........................ 37 16.3 Seriel kommunikation............................ 38 16.3.1 Klassen Comm........................... 38 16.3.2 Klassen SerialReader........................ 39 16.3.3 Klassen SerialWriter........................ 39 16.4 Backend................................... 40 16.4.1 Datatimer.............................. 40 16.4.2 Rutedata.............................. 42 16.4.3 Modstandsstyring.......................... 43 16.4.4 Hardwaresimulering......................... 44 iv

17 Delkonklusion 44 IV Perspektivering 45 18 Konklusion 45 V Appendix 46 A Bremser 46 B Delay 47 C Samlet kredsløb 48 D Modstands- og PWM-beregninger 49 E Kildekode 50 E.1 SimulatorView.java............................. 50 E.2 RouteData.java............................... 58 E.3 Resistance.java............................... 59 E.4 dbhandler.java............................... 59 E.5 Comm.java................................. 62 Litteraturliste 64

Del I Problemanalyse 2 Problemformulering Emnet er valgt på baggrund af udleverede projektoplæg. Dog er dette blevet ændret i forhold til projektforslaget, for at dække vores egne interesseområder i problemet. Den endelige problemformulering er: Hvordan er det muligt at opbygge en cykelsimulator, således træningen bliver mere spændende? Målet med projektet er at opbygge en cykelsimulator, for at forbedre oplevelsen ved at træne på en motionscykel. Hovedtemaet i dette semester er Kombinerede analog og digitale systemer, hvor der skal sættes fokus på analog kredsløb og objektorienteret programmering. I løbet af projektet vil vi både opbygge kredsløb til regulering af motor- og bremsestyring, samt opbygge et grafisk interface. 3 Kravspecifikation På baggrund af problemformuleringen er der blevet opstillet krav til cykelsimulatorens funktioner, samt tekniske specifikationer for henholdsvis hardware og software. Krav til hardware På cyklen monteres en bremse, som skal kunne ændre modstanden på hjulet. Der monteres ligeledes en motor, til simulering af acceleration og deceleration. Hjulets omdrejninger måles. Krav til software Software til styring og regulering af bremse og motor. Opsamling af data og grafisk repræsentation af disse. 1

3.1 Fremgangsmåde Til løsningen af den overordnede problemstilling, vil denne blive inddelt i mindre problemer, også kaldt Divide and Conquer. 3.1.1 Motor- og bremsestyring Ved benyttelse af motor- og bremsestyring skal der kunne simuleres forskellige forhold fra den udendørs kørsel, som ikke findes på en motionscykel. Man kan benytte en motor til at simulere stigningsprocenter, mens en bremse kan simulere vejens underlag. Vindmodstanden er derimod mere indviklet at beskrive, da vindmodstand kommer i vindstød og derfor ikke kan opfattes som en jævn modstand på cyklen. I første omgang vil der derfor fokuseres på at simulere stigningsprocenter og underlag. 3.1.2 Regulering Når motor- og bremsestyringen til simulatoren er konstrueret, skal det gøres muligt, at regulere modstanden i forhold til eksempelvis en stigning på den bane der køres. Det skal her være muligt at bestemme de forskellige indstillinger, i forhold til terrænet, gennem software på en computer, hvorefter motoren og bremsen reguleres efter dette. 3.1.3 Timer og datalog I dette trin skal det gøres muligt at bruge timere til at opmåle tiden/afstanden der er tilbagelagt på cyklen. Det skal muliggøres at lagre disse oplysninger således der kan sammenlignes tider for en bestemt kørt afstand. 3.1.4 Grafisk simulering Når oplysninger fra timere er blevet lagret, er det muligt at lave en grafisk afbildning af det kørte forløb. Dette vil kunne gøre oplevelsen for en motionist mere spændende. Formålet med dette trin er at gøre simuleringen så realistisk som mulig, ud fra det opbyggede kredsløb og programmering, der er opnået forinden dette trin. 2

4 Design af system Udfra vores kravspecifikation, er det samlede systemdesign af vores produkt blevet opstillet. Figur 1 viser et blokdiagram over vores produkt. Figur 1: Blokdiagram over vores system. Hardware og software bygges op omkring en mikroprocessor af typen MSP430F149. Både bremse og motor bliver koblet til MSP en, som kommunikerer videre til computeren, der viser det grafiske interface. Interfacet er styret af vores omdrejningssensor og gearingen. 5 Afgrænsning I problemanalysen er der blevet undersøgt hvordan cykelsimulatoren skal styres. Det grafiske interface bliver styret på en computer, mens hardwaren styres af MSP430F149, som kommunikerer hardwaredataerne videre til computeren. Samtidig skal computeren kunne kommunikere med MSP en for at styre belastningen på cyklen. Motionscyklen har en indbygget magnetmodstand, som vil blive benyttet. Denne er konstant og vil derfor blive betragtet, som underlagets friktion med hjulet. Til simuleringen bliver der derfor antaget at underlaget er homogent. Til simulering af hældningsgraden af cykelruten, vil en motor blive benyttet. Der er undersøgt alternativer til motoren i form af en elektromagnetisk bremse, men da denne kun kan simulere en positiv stigning, er der set bort fra denne. I bilag A kan læses om elektromagnetiske bremser. Til gear-styringen vil der blive benyttet en regulering i motorstyringen via softwaren. 3

Del II Hardware-implementering I de følgende afsnit vil komponenterne til de forskellige kredsløbene blive gennemgået. Der vil blive kigget på forskellige løsningsforslag til de forskellige komponenter, samt virkemåden af dem. 6 Motorer Til at simulere kørsel op og ned af bakke skal en motor benyttes, som har mulighed for at dreje begge veje og køre med variabel hastighed. 6.1 Børstet DC-motor [1][2] En børstet DC-motor består af fire elementer: En stator, en rotor, børster og en kommutator. Statoren er en fastmonteret magnet, som sidder udenom rotoren. Rotoren består af en jernkerne, hvor der er viklet en leder omkring, for at danne en elektromagnet. På rotoren sidder også kommutatoren, som er en elektriskledende ring, hvor forsyningen gennem børsterne er koblet til. En illustration af dette ses på figur 2. Figur 2: Illustration af en børstet DC-motor. Når der kobles forsyningsspænding på børsterne vil rotoren blive magnetisk og stille sig efter statoren. Når rotoren er næsten helt tiltrukket og tæt på stilstand, vil kommutatoren få polariteten til at skifte og statoren vil frastøde rotoren. Derefter vil rotatoren blive tiltrukket af den anden side af statoren. Inden rotatoren er i stilstand vil kommutatoren igen ændre polariteten. Denne rotation vil fortsætte, så længe der er forsyning tilkoblet. Fordelene ved en børstet DC-motor er at den er billig og nem at styre, da man kan 4

sende DC og PWM-signaler direkte ind i den. Ulemperne er at børsterne slider på kommutatoren, hvilket giver den en relativ kort levetid. 6.2 Stepmotor [3] Der findes tre typer af stepmotor: variable-reluctance, permanent magnet og hybrid. Kun variable-reluctance gennemgåes her, da princippet i alle motorer er det samme. Figur 3: Illustration af en variable-reluctance step motor. En variable-reluctance stepmotor består af en stator med elektromagneter siddende i par hele vejen rundt. Inderst sidder rotoren, som er en takket jernkerne. Ved at tænde og slukke elektromagneterne på skift vil rotoren stille sig efter dem, og akslen vil rotere. Fordelene ved en stepmotor er at den har en høj præcision, og man derved har stor kontrol over hvilken position motoren står i. Derudover har motoren fuld drejningsmoment, når den står stille og lang levetid, da statoren og rotatoren ikke slider på hinanden. Ulemperne er at den kræver et kontrolkredsløb, og ikke kan styres direkte med et PWM-signal. 6.3 Servomotor [4][5][6] En servomotor er i bund og grund en DC-motor med indbygget styring og gearing. Figur 4: Blokdiagram over en servomotor. 5

Der sendes en kontrolpuls til servomotoren hvert 20. ms. Denne puls konverteres til en spænding og sendes til en fejlkorrektions-operationsforstærker. Denne operationsforstærker sammenligner dette signal med positionen på akslen og stiller sit output efter dette. Afhængig af om dette signal er positivt eller negativt drejer motoren i forskellige retninger. Fordelene ved en servomotor er at man har stor kontrol over motorens position, og at den selv retter sig, hvis der er fejl. Ulemperne er at den kræver et kontrolkredsløb, ikke kan styres med PWM og ikke kan dreje 360. 6.4 Moment [7][8][9] For at beregne hvor kraftig motoren skal være, er det nødvendigt at beregne hvor stor en kraft vi træder i pedalerne. Den kraft kan bruges til at udregne hvor meget energi der dannes på hjulet. Newtons anden lov siger følgende: Hvis SI-enhederne indsættes fås: F = m a N = kg m s 2 Tyngdeaccelerationen i Danmark ca. 9,82 m s 2. Denne information bruges til at finde ud af hvor mange Newton der går pr. kilo: N kg = 9, 82 Radiussen fra pedalen til centrum af hjulet hvorpå pedalen er monteret, er blevet målt til 17,5 cm. Vi finder derved hvor mange joule der bliver forbrændt per rotation på hjulet. Vi ved nemlig at: Dette kan ses hvis SI-enhederne indsættes: Energi = m v 2 Energi = F l Joule = kg m2 m Joule = kg s 2 s m = N m 2 Vi antager at man maksimalt træder med 100 kg i pedalerne: Energi/omgang = 982N (0, 175m 2) π = 343, 7πNm Nu antages der at den maksimale kadence er 150 omgange per minut: 343, 7πNm 150 = 859, 25πW 2700W 60s Dette er den mængde W der maksimalt bliver dannet af brugeren. I beregningerne er der ikke taget højde for friktion, luftmodstand og tab ved remmen mellem de to hjul. 6

Den maksimale effekt der bliver dannet, vil derfor være mindre i praksis. I de beregninger vi har foretaget, har vi taget det tilfælde hvor vi træder med 100 kg i pedalerne og kører med en kadence på 150 omgange per minut. Det vil dog ikke være muligt for et menneske at kører med den denne kraft og kadence på samme tid, da de begge er maksimale ydertilfælde. Figur 5 viser dette: Figur 5: Graf over kilo-belastningen i forhold til kadencen. Det røde punkt illustrerer hvad vores beregninger er baseret på, mens den blå linje viser hvad der er fysisk muligt. Figur 5 viser sammenhængen mellem kraften og kadencen. Det ses her at det ikke er muligt at køre med den maksimale kraft og kadence på samme tid. Gennemsnitsbrugeren vil benytte et mellemområde, hvor hverken kadencen eller kraften er ekstremt høj. Vi kan derved konkludere at en motor på 2700 W vil være overdimensioneret. Omkring 1 kw vil være en mere realistisk effekt, som en person i god form kan træde under en kort spurt. Når motoren vælges skal den kunne holde til en person der træder med 1 kw. Hvis motoren selv danner 1 kw, vil hjulet stå helt stille, i det tilfælde hvor hjulet kører modsat af personen på cyklen. Det vil derfor ikke være nødvendigt at have en motor på 1 kw. Derfor vil en motor på 700-800 W være rigeligt. 6.5 Valg af motor [10] Vi har valgt en motor af typen F2P10-19. Det er en DC-motor, som yder 120 W, ved en spænding på 24 V og en strøm på 4,8 A. I vores tidligere beregninger, har vi vist at en person maksimalt kan yde 800 W over en kort periode. Udover motoren er der yderligere monteret en magnetmodstand, som kan reguleres. Vi har på baggrund af dette vurderet at motoren er kraftig nok til vores brug. En større motor ville være mere ideel, men en DC-motor på 800 W er dyr at anskaffe, vi har derfor valgt at kombinere en svagere motor med en magnetmodstand for at få den ønskede modstand. 7

Motoren har oprindelig haft til hensigt at blive brugt som pumpe. Dette er grunden til at nogle af dataerne i databladet, eksempelvis viser hvor stor et tryk motoren kan klare og hvor mange liter der kan pumpes per minut. 7 H-bro introduktion Vi har valgt at benytte en H-bro til styring af vores DC-motor. Hensigten med H- broen er at kunne vende strømretningen på motoren, således at motoren kan simulere både op- og nedkørsel. H-broen er en god løsning på dette. H-broen virker ved at fire analoge switches benyttes. Disse er vist på figur 6. Figur 6: En illustration af en H-bro. Switch S1 og S4 er enabled samtidig. Ligeledes er S2 og S3 er enabled når strømretningen ændres. Det er vigtigt at hver switchene kan kontrolleres uafhængigt af hinanden, da det er disse der styrer strømretningen. På figur 7 er det vist at henholdsvis S1 og S4 er enabled, når motoren kører den ene retning, mens S2 og S3 er enabled når motoren kører i modsat retning. Figur 7: En illustration af H-broens virkning, alt efter hvilke switches der er enabled. Hvis H-broen virker efter hensigten vil motoren kunne komme ind i flere states, alt efter hvilke switches er enabled. Vi har lavet en sandhedstabel der viser dette: 8

S1 S2 S3 S4 Resultat 1 0 0 1 Motoren kører højre 0 1 1 0 Motoren kører venstre 0 0 0 0 Motoren kører i friløb 1 0 1 0 Motoren bremser 0 1 0 1 Motoren bremser Det ses på sandhedstabellen at man også kan benytte H-broen til at få motoren til at køre i friløb eller lave fuld motoropbremsning. I vores tilfælde vil det kun være skiftet i polaritet og friløb, der benyttes. Til de switches der benyttes i H-broen, skal vi forsøge at minimere det tab af spænding og strøm der er i selve switchen. Derfor vil det være optimalt at benytte transistorkredse til dette. Der er en uddybende beskrivelse af dette i vores transistorafsnit. Til vores H-bro kredsløb, har vi valgt at benytte os af både bootstrap IC er og delaykredsløb. Grunden til disse er valgt og hvordan de virker, er detaljeret beskrevet i de kommende afsnit. 8 Dioder [11] I dette afsnit beskrives dioder, og hvad fordelen er ved at bruge en diode i et kredsløb. Der ses på to forskellige dioder. En ganske almindelig halvleder-diode og en schottkeydiode, da det er disse dioder som anvendes i projektet. 8.1 Halvleder-diode En diode (ensretter) er et elektrisk komponent, som kun tillader strømmen at løbe i en retning, og derved blokerer strømmen fra den modsatte retning. Dioder bruges hovedsageligt til beskyttelse af et elektrisk kredsløb. På figur 8 ses en halvleder-diode, som er den mest anvendte diode. Figur 8: En halvleder-diode. En halvleder-diode er fremstillet af silicon, som giver den ledende funktion i dioden. Den positive side af dioden er anoden og den negative del er katoden. Hvis en strøm løber igennem anoden vil strømmen passerer videre til resten af kredsløbet, men hvis strømmen i stedet løber igennem katoden, vil dioden automatisk blokerer for strømmen. Dioden leder først når spændingen over dioden er højere end threshold-værdien: 0,7 V. Figur 9 viser en graf over hvordan strømmen løber, når spændingen varierer. 9

Figur 9: Graf der viser hvordan en halvleder-diode, lader en strøm passere, når spændingen er over threshold-værdien. Det ses også at dioden kan lede i negativ retning, hvis dioden har en stor negativ spænding stående over sig. Figur 9 viser også at hvis der står en tilstrækkelig stor negativ spænding over dioden, vil dioden lede strømmen i modsatte retning. Andre dioder som f.eks. zenerdioder benytter denne egenskab, men da dette ikke er hensigten med en halvleder-diode, skal dette undgås. 8.2 Schottkydiode En schottkydiode fungerer som en almindelig diode, men har et par fordele. Fordelene ved en schottkydiode er, at dens treshold-værdi er lavere end en almindelig diode. Threshold-værdien ligger på 0,3-0,5 V, afhængig af hvilken schottkydiode der benyttes. Derudover er schottkydioden meget hurtigere end en almindelig halvlederdiode. Dette gør at en schottkydiode, kan arbejde med meget høje frekvenser. Ulemperne ved en schottkydiode, er prisen og størrelsen af komponentet. Derudover er der et større strøm-tab i en schottky-diode. Figur 10 viser hvordan et schottky-komponent, ser ud i en kredsløbstegning. Figur 10: En schottkydiode. 10

9 Transistor [12][13][14][15] Til H-broen vil det være mest brugbart at benytte transistore som switches, til at skifte strømretningen. I dette afsnit vil der bliver kigget på forskellige transistor-typer og hvad fordelen er ved de forskellige typer. En transistor er et elektrisk komponent af typen halvleder. Førhen blev radiorør benyttet til det samme, men de er blevet udfaset og bruges kun meget sjældent i dag. I dag bruges BJT s og FET s, dog er BJT også ved at blive udfaset. Transistorer bruges til at forstærke et signal, eller virke som en kontakt. Dette gøres ved at lade en lille strøm styre en stor strøm. 9.1 Opbygning En transistor består af tre dele: Collector, emitter og base, hvis man benytter en BJT, eller source, drain og gate, hvis man benytter en MOSFET. Disse kan ses på figur 11. Figur 11: Illustration af fire transistortyper. 9.2 Bipolar Junction Transistors (BJT) I en NPN BJT er collector- og emitter-kanalerne negativt ladet, mens basen er positivt ladet. Collectoren er indgangen for den styrende strøm, og emitteren er udgangen for strømmen. Basen styrer transistoren og bestemmer om den er tændt eller slukket. Figur 12 viser hvordan strømmen løber i en NPN BJT. Det ses her at emitterstrømmen, er påvirket af to spændingskilder V BE og V CB. Da strømmen der løber ind i transistoren, også skal forlade den igen og det eneste sted strømmen kan løbe hen, er gennem emitter-kanalen, ses det på figur 12 at I E = I C + I B. 11

Figur 12: Illustration af en NPN transistor, som arbejder i tændt tilstand. Figuren viser strømretningen og hvilke spændingskilder, der styrer base- og collector-strømmen i transistoren. Det ses også at base-kanalen spreder elektronerne mellem collector- og emitterkanalerne og derved skaber forbindelse. For at tænde transistoren kræves en base-emitter spænding på minimum 0,7 V. På figur 13 ses en graf, der viser hvor meget strøm der løber gennem transistoren ved en given spænding. Figur 13: Illustration over strøm, der løber gennem transistoren, i forhold til spændingen der står over base-emitter. En PNP transistor fungerer på samme måde som en NPN, pånær at V BE erstattes af V EB, da strømretningen ændres fra at løbe fra collector til emitter, til at løbe fra emitter til collector. Samtidig løber strømmen også ud fra basen, modsat en NPN BJT. PNP en er tændt, når V EB > 0, 7 V ellers er den slukket. En NPN BJT har en strømforstærkning, som opfylder: β = I C IB. Her er β en konstant, 12

som repræsenterer et gain-parameter. Da I C = I B β er β forstærkningen mellem I B og I C. β er meget forskellig fra transistor til transistor. Den er hovedsagelig påvirket af to faktorer; bredden af base-regionen og ladningen i base-regionen i forhold til ladningen i emitter-regionen. For at få en høj β (forstærkning) skal base-bredden være tynd og basens ladning være lille, mens emitter-ladningen skal være stor. Der blev tidligere nævnt at β er en konstant. Dette er dog ikke helt tilfældet, da β blandt andet varierer med I C og temperaturen i transistoren. Dette er illustreret på grafen der er vist figur 14: Figur 14: En graf over I C i forhold til β, når temperaturen er ændrer sig. Det ses også at β varierer i forhold til I C. Hvis en BJT skal bruges en som spændingsforstærker i stedet for en strømforstærker, kan man benytte sig af en transistorkobling kaldet common-emitter (CE). Figur 15 viser en CE-kreds, og en graf over karakteristikken. Figur 15: (a) viser en common-emitter forstærkningskredsløb. (b) er en graf, som viser karakteristikken af (a). 13

Det ses på figur 15 at så længe V BE er mindre end 0,5 V, er V CE høj. Når V BE når active mode, begynder V CE at falde hurtigt. Når transistoren når mætning, falder V CE til en meget lille spænding. Det betyder derfor at når V BE er tændt er V CE slukket og omvendt. R C har to formål i denne kreds; at stabilisere bestemt DC-sat spænding på collectoren og at konvertere i C til en output-spænding: V CE. 9.3 Metal Oxide Semiconductor Field-Effect Transistor [11] En FET (field-effect transistor) består af fire tilslutninger: gate, drain, source og body. Strømmen løber mellem drain og source, mens gatens spænding tænder og slukker for strøm gennemløbet. Body er som regel sat til ground i IC er. Ved løse transistorer sættes body til source. En MOSFET (metal oxide semiconductor field-effect transistor) er en bestemt type FET, som benytter sig af oxide til isolering mellem gate og body. Dette er vist på figur 16: Figur 16: Illustrationen viser hvordan en n-channel MOSFET er opbygget. (a) viser en MOSFET fra en skrå vinkel. (b) viser en MOSFET i et tværsnit. De typiske mål er angivet til: L = 0,1 mm til 3 mm, W = 0,2 mm til 100 mm, og tykkelsen af oxide-laget ligger i området fra 2 nm til 50 nm. Figur 16 viser en n-channel MOSFET. Dette betyder at source og drain-kanalerne er sat til en negativ ladet substrat, mens body-kanalen er sat til positiv ladet substrat. Der findes ligeledes p-channel MOSFET s, hvor ladningen er omvendt. Så snart V GS er over en bestemt spænding, kaldet threshold-spændingen, begynder der at løbe strøm mellem drain og source. Threshold-spænding er forskellig fra transistor til transistor. Karakteristikaen for hvordan en MOSFET tænder ses på figur 17. 14

Figur 17: Figuren viser hvordan en MOSFET tænder, når det gælder at V DS V GS V t. Når V GS > V t begynder der at løbe strøm gennem MOSFET en. Når V DS forøges, sker der en ændring i den inducerede kanal, som får den indre modstand i MOSFET en til at stige. Modellen for en n-channel MOSFET er vist på figur 18. Figur 18: Figuren viser at der ikke løber strøm ind i gaten, mens strømmen der løber gennem source-kanalen er lig strømmen der løber gennem drain-kanalen. Det ses at den inducerede kanal, får en indsnævret form og modstanden stiger, når V DS stiger. Her er det antaget at V GS har en konstant værdi > V t. Som det ses på figur 18 bliver der dannet en forøget indre modstand, når V DS stiger. Når V DS opnår værdien V GS V t er modstanden så stor, at V DS ikke længere har en en indflydelse på strømmen, der løber fra drain til source. Figur 19 viser en graf over sammenhængen mellem V DS og i D : 15

Figur 19: Grafen viser den maksimale værdi i D kan antage, når V DS opnår værdier i forhold til V GS V t. Ved værdier hvor V DS er meget mindre end V GS V t, stiger i D linært. Når V DS nærmer sig værdien for V GS V t bøjer kurven, da modstanden bliver forøget. Når V DS = V GS V t, stiger i D ikke mere. En p-channel MOSFET virker på samme måde som en n-channel, pånær at V GS, V DS og V t er negative. p-channel MOSFET en er slukket så længe spændingen V GS er høj. Dette skyldes at p-channel MOSFET en i sit aktive område opfylder: V SD = V t V GS. Dvs. når en spænding højere end threshold-spændingen er sat til V GS, kan der ikke løbe nogen strøm mellem source og drain. Strømgennemløbet bliver derfor tændt når V GS < V t. Figur 20 viser en n-channel ved siden af en p-channel. Det ses her at NMOS en er placeret direkte i p-substrat mens NMOS en er fabrikeret i et speciallavet n-substrat også kaldet n well. Figur 20: Tværsnit over både en n- og p-channel MOSFET. 16

Der er nogle væsentlige fordele ved at bruge n-channel fremfor p-channel MOSFET s. N-channel en kan bygges fysisk mindre og kan derfor arbejde hurtigere. Desuden er den indre modstand i en p-channel større og der er derfor et større tab i MOSFET en. Den eneste fordel ved at benytte p-channel s er den nødvendige gate-spænding. Ved en n-channel gælder det at V GS > V DS + V t før transistoren tændes. Derfor er det nødvendigt enten at bruge ekstern strømforsyning eller en driverkreds, til at få en høj nok spænding på gate-kanalen. Ved en p-channel er dette ikke nødvendigt, da transistorens threshold-værdi er negativ. 9.4 Valg af transistor [16][10][17] De transistorer vi skal bruge, skal benyttes som en ren switch. Til dette er en MOS- FET ideel. En MOSFET har en meget lille indre modstand, hvis der sammenlignes med en BJT. Hvis der skulle benyttes BJT-transistorer med common-emitter opstilling, ville det enten være nødvendigt at invertere signalet eller benytte to BJT til hver switch. Dette undgås ved at benytte MOSFET s. N-channel MOSFET s er mere brugbare end en p-channel s i vores tilfælde, da vi helst vil have så lille en indre modstand som mulig. Vi er dog nødsaget til bruge en driverkreds til at styre spændingen til MOSFET ernes gate-kanaler. Da vi havde fået udleveret en DC-motor, så størrelsen af transistorerne blev valgt på baggrund af denne. Motorens højeste effekt, spænding og strøm blev fundet i datablade og en transistor, som opfyldte disse krav blev valgt. Der blev desuden sørget for at transistoren ikke bliver belastet mere end 75-80 %, for ikke at brænde systemet af. På baggrund af disse overvejelser, er der valgt fire power MOSFET s af typen: IR- FZ44V. IRFZ44V F2P10-19 Spænding 60 V 24 V Strøm 55 A 4,8 A (8 A krævet.) Strømforbrug 3300 W 115,2 W 9.5 Heat sink [18][16][10][11] Motoren trækker 115 watt ved fuld belastning og MOSFETsene kan afsætte: P Dmax = T Jmax T A θ JA = 175 C 50 C 62 C W = 2, 02W Dette er langt under hvad motoren kræver og en heat sink er nødvendig, for ikke at brænde MOSFET erne af. Da fire MOSFET s med en jævn fordelt belastning benyttes 17

kan følgende formel bruges til beregning af heat sinken: 1 R thgmavg = 1 R thg + R thm + 1 R thg + R thm +... R thk = v i v u R thgmavg P Indsætter man værdierne for IRFZ44V MOSFET s giver det: C 2, 22 W = 1 1, 3 C + 0, 5 C W W 1 + 1, 3 C + 0, 5 + C W W R thgmavg = 1 2, 22 C W C 1 1, 3 C + 0, 5 C W W C = 0, 45 W 1 + 1, 3 C + 0, 5 C W W 175 C 50 C 0, 45 50W W = 2, 05 C W Udfra denne værdi kan en heat sink med passende egenskaber og en passende størrelse vælges. 10 Bootstrap I H-broen bliver der benyttet fire n-channel MOSFET s. For at tænde disse skal gatesource spændingen være 5 V højere end drain-source spændingen. På lowside er det ikke et problem at opnå denne spænding, da source er forbundet til ground. Men på highside vil source spændingen stige til V CC, hvilket betyder at gaten på highside skal være V CC + 5 V. For at løse dette benyttes en driverkreds, som benytter sig af bootstrapprincippet. 10.1 Bootstrap kredsløb På figur 21 ses en halv-bro, samt en tilkoblet driverkreds. Figur 21: Kredsløbsdiagram over en halv-bro, samt driverkredsen - HIP2100. 18

En driver består af en highside-controller, lowside-controller, en kondensator og en Schottkydiode. Når Lowside MOSFET ens gate er tændt, oplades kondensatoren. Denne kondensator bruges til at holde spændingen på Highside MOSFET ens gate høj, når denne skal tændes. På figur 22 ses den del af driveren, der er brugt, når lowside MOSFET en på den ene halvbro er tændt. Den sorte ramme, illustrerer hvad der er indbygget i selve IC en, mens resten findes udenfor kredsen. Det ses at så længe lowside MOSFET en er tændt, bliver kondensatoren opladet til Vdd minus spændingsfaldet over dioden. Figur 22: Strømvejsdiagram - lowside on. Figur 23: Strømvejsdiagram - highside on. På figur 23 ses tidsrummet, hvor Lowside MOSFET en er disabled og Highside MOS- FET en er enabled. I denne periode vil kondensatoren have en spænding på V DD minus spændingsfaldet over dioden, stående over sig. Highside MOSFET ens gate vil have en spænding på 24 V + V DD V stående. Dette betyder at gaten tænder MOS- FET en, da spændingen som sagt skulle være V CC + 5 V. Så længe kondensatoren holder en spænding på 5 V, vil MOSFET en være tændt. Her udnyttes at en MOS- FET er spændingsstyret og ikke strømstyret, som en BJT-transistor. Dette betyder at kondensatoren vil aflade meget langsomt, da strømtabet er meget lille. Dog vil kondensatoren ikke kunne holde highside-mosfet en tændt hele tiden, da der er et lille tab. Det betyder at man ikke kan have highside tændt konstant, men er nød til at skifte til lowside for at lade kondensatoren op igen. Af denne grund kører vi 19

Cykelsimulator 27. maj, 2010 med en duty cycle på maksimalt 98 % og 2 % hvor strømretningen gennem motoren er vendt. Et problem der kan opstå, er at dioden er for langsom og kondensatoren derfor ikke modtager den ønskede strøm hurtig nok. Derfor bliver der benyttet en Schottkydiode i driveren, da denne er hurtigere end en almindelig diode. Hvis dioden giver problemer er det svært af afhjælpe, da den er indbygget i HIP2100 en. Man kan dog montere en hurtigere undenom kredsen, som vil kunne minimere problemet. Lange ledninger kan også give problemer, da lange ledninger opfører sig som spoler. I en spole kan spændingen ikke ændre sig momentant, hvilket er nødvendigt for at bruge en høj PWM i kredsløbet. Derfor skal komponenterne være placeret tæt, så ledningerne bliver så korte, som muligt. 10.2 Test af bootstrap For at undersøge om bootstrappen virker optimalt, er der blevet testet om bootstrapkondensatoren, kan følge med til vores PWM-frekvens. Til undersøgelse af kredsløbet, er der blevet benyttet en tonegenerator, der simulerer et PWM-signal på 8 volt, med en duty cycle på 50 %. Tonegeneratoren er koblet til Highside driverens enable-pin og til en inverter, som sætter det inverterede signal til Lowside driverens enable. Dette betyder at at 50 % af tiden oplader kondensatoren og 50 % af tiden aflader den. Derudover er der brugt en fast forsyning på 12 V, som er koblet til H-broen og bootstrap-forsyningen. For at teste om kondensatoren kan følge med frekvensen, er to oscilloskop-kanaler blevet brugt. De er koblet til hver deres side af kondensatoren og til ground. Figur 24 viser et billede, der blev taget af oscilloskop-displayet under forsøgene. Her ses de to kanaler og spændingsdifferencen mellem dem. Figur 24: Billede af oscilloskop-displayet. Ch1 er sat til ground og kondensator, mens ch2 er sat til den anden side af kondensatoren og til ground. Det nederste signal, er differencen mellem ch1 og ch2. 20

Differencen mellem ch1 og ch2 (ch1-ch2), viser at kondensatoren når at lade op, inden den skal bruges til highside-mosfet en. Det ses dog at kredsløbet ikke skal bruge en meget højere frekvens, før kondensatoren ikke kan følge med. Udfra denne test af bootstrap-kondensatoren, kan det konkluderes at der maksimal må benyttes en frekvens på 20 khz til kredsløbet. 11 Delay I en H-broskobling er det vigtigt man ikke tænder begge MOSFET s i samme halvbro på en gang, da det foresager en kortslutning af systemet og man risikere at brænde dem af. Derfor skal der indbygges en forsinkelse. Laver man et RC-led kommer der en forsinkelse, dog vil begge flankerne blive flyttet, så problemet bliver ikke løst. Derfor skal forskydelsen på den første flanke være større end på sidste flanke. 11.1 Kort om operationsforstærkere [19][20] En operationsforstærker (opamp) er en spændingsforstærker, som bruges til at forstærke forskellen mellem to inputs. Ideelt set forstærker opamp en forskellen mellem inputsene flere millioner gange, men er i praksis begrænset af forsyningsspændingen. Figur 25: Komponenttegning for en operationsforstærker. Pin 1 er det inverterede input, pin 2 er det ikke-inverterede input, pin 3 er outputtet, V CC er positiv forsyning og -V EE er negativ forsyning. På figur 25 ses en opamp med de fem nødvendige pins. Outputtet fra en opamp er proportionel med forskellen mellem de to inputs. Ideelt set vil denne forskel blive forstærket flere millioner gange, men i praksis er outputtet begrænset af den positive og negative forsyningsspænding, så følgende gælder: V EE output V CC. Så længe outputtet har en værdi mellem de to forsyningsspændinger, er opamp en i det lineære område. Kommer outputtet op eller ned på V CC og -V EE er opampen i mætning. Opamp en kan bruges til at udføre forskellige matematiske funktioner på signaler, som 21

addition, subtraktion, division, multiplikation, differentiation og integration. Ved at ændre på opstillingen og komponenternes placering kan opamp ens funktion ændres. 11.2 Operationsforstærker som komparator [21][22] En komparator er en enhed, som sammenligner to inputspændinger og stiller outputtet efter det. Der findes deciderede komparator IC er, men vi benytter en opamp til det. Figur 26: Kredsløbsdiagram over delaykredsen. På figur 26 ses det samlede kredsløbsdiagram for delaykredsen. På opampens inverterede input sættes den ønskede triggerspænding. Så længe det ikke-inverterede input har en lavere spænding end det inverterede input vil opampen ikke forstærke signalet og være slukket. Så snart det ikke-inverterede input kommer over det inverterede input vil opampen tænde, og have fuldt signal på outputtet. I denne kobling tændes eller slukkes opampen helt. 22

Figur 27: Simuleringsresultater fra PSpice. Grøn viser PWM-signalet, rød viser op- og afladningen af kondensatoren, gul viser triggerspændingen på minus-porten på opampen, blå viser outputtet fra opampen. En stor udgave af grafen kan ses i appendix B. På figur 27 ses simuleringsresultaterne fra PSpice, og på figur 26 ses de forskellige målepunkter. Ved at ændre på modstandene i spændingsdeleren kan man flytte triggerniveuet op og ned. Lægger man niveauet på 2,5 V vil man få en jævn forsinkelse på begge flanker. Er niveauet lavere vil sidste flanke blive mere forsinket end første, og er niveauet højere vil første flanke blive mest forsinket. I vores opstilling har vi sat trigger niveauet til 4,64 V, da der ønskes at flytte første flanke. På opampens ikke-inverterede input har vi et RC-led. Ved at ændre på modstandens og kondensatorens størrelse kan man bestemme hvor hurtigt kondensatoren lades op. Ved at ændre spændingen på disse to inputs kan man justere forsinkelsen. 11.2.1 Beregning af delay [23] Da der skal være forskel på forsinkelsen på flankerne skal op- og afladningstiden af kondensatoren beregnes. Dette kan gøres ud fra følgende formel: x(t) = x( ) + [x(0+) x( )]e t RC x( ) er den spænding, som det indkomne PWM-signal har. x(0+) er spændingen over kondensatoren. Værdierne for henholdsvis op- og afladningen indsættes, og følgende udtryk fås: x(t) = 5V + [0V 5V ]e x(t) = 0V + [5V 0V ]e t 30Ω 10nF t 30Ω 10nF Så beregnes det hvor lang tid det tager for systemet at blive ladet op til triggerspændingen, og hvor lang tid det tager af aflade til triggerspændingen igen. Ud fra 23

disse to værdier kan man beregne forskellen på flankerne. Opladning fra 0 V til en triggerspænding på 4,645 V tager 483 ns, og afladning fra 5 V til triggerspændingen tager 67 ns. Det vil sige at det tager 416 ns længere tid at lade op til triggerspændingen, end det tager at aflade. Dette burde være nok til at forhindre en kortslutning i MOSFET erne. 11.3 Spændingsregulering Til det samlede kredsløb er det nødvendigt med forskellige spændinger til forskellige komponenter. Motoren skal bruge 24 V og bootstrappen, delayet og Hall-sensoren skal bruge 12 V forsyning. Derudover skal delayet bruge en referencespænding på 4,7 V. Til forsyningsspændingerne skal der bruges en spændingsregulatorer, da der også løber strøm på de pins. Til referencespændingen kan man benytte en spændingsdeler, da opampen kun måler på det input. Til beregning af referencespændingen benyttes spændingsdelerformlen: Vi sætter R 2 til at være 36 Ω: 4, 7V = 24V R 2 V out = V in R 1 + R 2 36Ω R 1 + 36Ω R 1 = 147, 83Ω 150Ω Vi bruger en modstand på 150 Ω. Der bliver derfor en lille afvigelse fra de ideelle beregninger. Det giver en spænding på: 24V Opstillingen er vist på figur 28: 36Ω = 4, 645V 150Ω + 36Ω Figur 28: Tegning over spændingsdeler-kredsen. 24

12 Omdrejningstæller [24][25] For at kunne beregne hastigheden på vores cykel, så er vi nødt til at måle omdrejningerne på hjulet. Til at måle omdrejningshastigheden har vi to forskellige muligheder at vælge mellem: En encoder og en Hall-effekt-sensor. 12.1 Encoder I en encoder har man en lyssensor, en lysdiode og en hulskive. Hulskiven er placeret mellem lyssensoren og lysdioden. Hvis lyssensoren modtager et lyssignal fra lysdioden, så sendes der et højt signal videre. Er hulskiven mellem lyssensoren og lysdioden udsendes et lavt signal. Hvis antallet af huller i hulskiven er kendt, bruges skiftende fra højt til lav. Disse tælles, og man kan deraf beregne omdrejningshastigheden på hjulet. Encodere er gode til at registrere høje hastigheder, men der lan opstå problemer ved lave hastigheder. Ved meget lave hastigheder kan der opstå meget støj i overgangfasen i skiftene, og derfor kan der forekomme fejlmålinger. Derudover er encodere følsomme overfor støj og skidt, som kan sætte sig på lysdioden og lyssensoren. 12.2 Hall-effekt-sensor En Hall-effekt-sensor fungerer i princippet på samme måde som en encoder, bare med et magnetfelt i stedet for en lysstråle. En Hall-effekt-sensor består af tre dele: en sensor, en magnet og en metalplade. Når sensoren har forbindelse med magneten udsendes et højt signal, og når metalpladen er mellem sensoren og magneten udsendes et lavt signal. Derved kan omdrejningshastigheden beregnes, på samme måde som ved en encoder. Hall-effekt-sensor har ikke problemer med at registere høje eller lave hastigheder. Dog kan det være nødvendigt at fjerne støj fra signalet. En ulempe er dog at Hall-effektsensor som regel er dyrere end encodere. 12.3 Valg af omdrejningsmåler Til vores cykel har vi valgt at benytte en Hall-effekt-sensor. Da vores hjul er meget massiv, er det meget lettere at montere en magnet, end at skabe et hul gennem hele hjulet til encoderen. En Hall-effekt-sensor ville i forvejen være en bedre løsning, da den ikke er nær så modtagelig overfor skidt, som encoderen. Da vi har en schmitt-trigger indbygget i MSP en, forventes der ikke at opstå problemer med støj. 25

13 Samlet kredsløb Gennem de foregående afsnit er de forskellige dele af hardwaren blevet beskrevet og afgrænset til ét løsningsforslag. Følgende komponenter er blevet valgt: Fire MOSFET s (IRFZ44V), to halvbro-driverkredse (HIP2100), to delaykredsløb, som hver består af et RC-led og en opamp (TL082), én spændingsregulator, én Hall-effekt-sensor (A3240) samt én MSP430F149 med tilhørende buffer og serielt interface. Det samlede kredsløb er vist på figur 29 nedenfor. Figur 29: Kredsløbsdiagram over alle vores komponenter. En stor udgave af kredsløbet kan ses i appendix C. 26

14 Delkonklusion I hardware-implementeringen er teorien bag komponenterne blevet beskrevet, samt valg af den optimale løsning. På baggrund af vores motorudregninger, er en motor valgt. Den optimale løsning til styringen af denne motor er en h-brokobling, styret af fire transistorer. Forskellige typer af transistorer er blevet undersøgt, og til en motor af denne type og størrelse, er n-channel MOSFET s det bedste valg. For at drive halvbroen benyttes en driverkreds. Denne gør at man kan tænde highside MOSFET en ved hjælp af en kondensator. For at undgå kortslutning i hver halvbro benyttes ét delay-kredsløb til hver halvbro. Denne kreds forskyder inputsignalet, så de to transistorer i samme halvbro ikke er tændt på samme tid. En MSP benyttes som PWM-generator og mellemled mellem computer og hardware. Hall-effekt-sensoren er koblet direkte til MSP en udenom motorkredsen. De enkelte kredsløb er blevet opbygget og testet hver for sig. Disse tests viser at kredsene virker efter hensigten. Dog er det samlede kredsløb ikke blevet opbygget. Det forventes dog at den virker, eftersom alle delkredsløb virker. 27

Del III Software-implementering Softwaren til cykelsimulatoren har en lang række opgaver, og er derfor opdelt i flere dele. Softwaren har til opgave at kommunikerer mellem cykel og computer, samt at have et grafisk interface, som brugeren kan interagere med. Softwaren, som omfatter den grafiske brugerflade og beregninger til eksempelvis justering af cyklens modstand, er lavet i programmeringssproget Java. Der er ydermere blevet lavet software til en mikroprocessor af typen: MSP430F149, som bruges til at indhente input fra en Hall-effekt sensor, kommunikation med en computer og generere et PWM-signal til motorerne. Denne software er lavet i programmeringssproget C. 15 Opbygning I dette afsnit vil der blive beskrevet hvilke overvejelser der har været omkring opbygningen af softwaren. Der vil blive redegjort for den overordnede struktur af softwaren, samt hvilke af Javas funktionaliteter, der kan benyttes for at konstruerer softwaren på den mest hensigtsmæssige måde. 15.1 Grafisk brugergrænseflade Den grafiske brugergrænseflade skal, som tidligere nævnt, tilbyde brugeren en simpel måde at benytte og styre cykelsimulatoren på. Yderligere skal grænsefladen grafiske illustrere den strækning, som brugeren cykler, samt formidle data omkring selve kørslen. Figur 30: Screenshot af brugergrænsefladen, efter en bane er blevet indlæst. 28

Figur 30 viser den grafiske brugergrænseflade, som indeholder en grafisk afbildning af den valgte rute, samt oplysninger om cyklisten. Til selve konstruktionen af det grafiske interface, findes der i Java en API (Application Programming Interface) ved navn Swing. Denne API er blevet udarbejdet specifikt til konstruktion af grafiske brugergrænseflader. Swing indeholder således en lang række komponenter, eksempelvis vinduer, knapper og inputfelter. Der findes et fåtal af alternativer til Swing, som også inkluderer enkelte WYSIWYG (What You See Is What You Get) editors. Disse er dog blevet fravalgt, da de kan være begrænsende for den bagvedliggende programmering i softwaren. 15.2 Database Eftersom ideen bag cykelsimulatoren har været, at det for brugeren skal være muligt at vælge baner med forskellig sværhedsgrad, er det derfor nødvendigt at lagre disse et sted. Til dette vil en database være den mest hensigtsmæssige løsning. Databasen har også andre muligheder til anvendelse ved cykelsimulatoren. For at gøre cykling på cykelsimulatoren mere konkurrencepræget, kunne der med fordel laves en liste over tider; en highscoreliste. Hertil kunne en database også benyttes. id coursename Climb length rid 1 Mount 5 300 1 2 Mount 3 200 1 3 Mount -1 100 1 4 Mount 4 200 1 Tabellen ovenover viser hvordan databasen, som indeholder oplysninger om ruterne er opbygget. Denne opbygning gør, at en rute kan opdeles i et antal sektioner, som beskrives med en længde og stigning. Disse oplysninger knytter sig således til et rute ID (rid), samt et beskrivende navn til banen (coursename). Til kommunikation mellem databasen og softwaren, er der i Java indbygget en API ved navn Java Database Connectivity (JDBC), som kan benyttes til at oprette forbindelse til en database og læse/skrive informationer. Denne API skal således benyttes ved indlæsning af ruter, samt den grafiske afbildning af disse. Den skal yderligere bruges når en bruger har afsluttet ruten, og tiden skal gemmes. 15.3 Seriel kommunikation Eftersom det er valgt, at MSP en skal håndtere styring af motoren, samt aflæse signalskiftene fra Hall-effekt sensoren, skal de forskellige oplysninger viderekommunikeres til og fra computeren. Til dette benyttes seriel kommunikation. Der skal således i softwaren opbygges et modul, som modtager oplysninger fra cyklen, gennem MSP en, om cyklens omdrejninger. Disse oplysninger kan dernæst behandles, således at den kørte afstand er kendt. Det er vigtig at kende den kørte afstand, da dette afgør hvilken modstand motoren skal yde på cyklisten. Denne modstand transmitteres dernæst til MSP en, som ændrer PWM-signalet til motoren. 29

Til den serielle kommunikation skal der benyttes et Java Library, RXTX, som muliggør både parallel og seriel kommunikation i Java. Dette library skal benyttes således, at der oprettes forbindelse til den ønskede COM-port, med de dertil ønskede indstillinger. Yderligere skal det muliggøres at sende og modtage data, til og fra MSP en. 15.4 Backend Denne del af softwaren er den, som brugeren ikke kan se. Backenden kommer til at håndterer eksempelvis beregninger af den modstand, som motoren skal yde. Der vil herunder blive beskrevet hvilke vigtige dele denne backend skal indeholde. 15.4.1 Timer Der skal i softwaren bruges en timer, som skal kontrollere afsendelsen af data til MSP en, samt den tid brugeren har kørt. Udfra denne tid kan brugerens hastighed eksempelvis beregnes. Timeren vil blive brugt, som en løkke, hvor en række data sendes. Der foretages beregninger, en gang for et hvert fastsat tidsinterval. Herunder er der listet hvilke opgaver timeren skal håndterer. 1. Visning af kørt tid. 2. Beregning af hastighed. 3. Løbende opdatering af kørt afstand. 4. Fastsættelse af modstandsniveau ud fra kørt afstand, samt rutens sektionsdata. Den timer-klasse i Java, som skal benyttes, er en thread, der eksekveres sideløbende med hovedprogrammet. Den sekventielle eksekvering af de ønskede data-transmissioner, samt beregning får derfor ingen indflydelse på hovedprogrammet. 15.4.2 Hardwaresimulering Da der sideløbende med udviklingen af softwaren, skal foretages test af denne, er det nødvendigt at have en mulighed for at simulere de input, som skal transmitteres fra cyklen. Måden hvorpå denne hardwaresimulering skal opbygges, er meget lig timerens opbygning. Der skal således laves en selvstændig timerklasse, som simulerer signalskiftene fra Hall-effekt sensoren. Hardwaresimuleringen vil gøre det muligt at observere sammenhængen mellem brugerinput og den grafiske brugergrænseflade i softwaren. Ydermere vil fejlfinding og optimering af sammenhængen mellem det grafiske interface og backenden, blive nemmere udfra denne simulering. Den eneste begrænsende faktor af hardwaresimulering vha. en timer, er det tidsinterval mellem hver eksekvering. Dette begrænser softwaren på den måde, at den simulerede cyklist vil cykle med en konstant hastighed, hvilket ikke er realistisk, men dog tilstrækkeligt til de test der skal foretages af softwaren. 30

15.4.3 Modstandsstyring Beregningen af den modstand motoren skal yde på cyklisten, er en vigtig del af backenden. Ruterne er således opbygget af flere sektioner. Disse sektioner beskrives ved en længde og en stigning. På baggrund af disse informationer, skal der fastsættes et modstandsniveau til hver sektion. Der bør til dette formål konstrueres en klasse, hvor modstandsniveauet for hver sektion udregnes, og dernæst returneres til softwarens timer, efter den ønskede bane er indlæst. Selve beregningen resulterer i hvor stor en effekt, der skal trædes, for at overkomme både tyngdeaccelerationen og sektionens stigningssprocent. Denne effekt skal efterfølgende omregnes til et brugbart PWM-signal til motoren. 16 Konstruktion I dette afsnit vil der blive beskrevet hvordan softwaren er opbygget. Der vil i teksten fremgå hvilke metoder og redskaber der er benyttet. I teksten vil der blive knyttet diagrammer og uddrag af software-koden. 16.1 Grafisk interface Konstruktionen af den grafiske brugegrænseflade vil blive beskrevet ud fra de enkelte elementer, som det er opbygget af. 16.1.1 Hovedvinduet Hovedvinduet er det vindue, som indeholder alle de grafiske elementer. Vinduet bliver konstrueret i klassen SimulatorView, som nedarver (inherits) egenskaber og metoder fra Frame-klassen. Det betyder at vi derfor ikke er nødsaget til at kopiere hele Frameklassens kode til vores kode, men frit kan benytte dens egenskaber og metoder. Figur 31: Metoder og egenskaber for klassen SimulatorView fremgår af denne figur. 31

Figur 31 viser de egenskaber og metoder, som klasse SimulatorView indeholder. Det kan også ses på figuren at, der bliver i klassen defineret en række variabler. Disse variabler bliver brugt i klassen, men også i andre dele af softwaren. 16.1.2 Metoder Klassen SimulatorView er den overordnede klasse i softwaren. Derfor indeholder denne metoden main, da dette er påkrævet af Java. I softwaren varetager main metoden i dette tilfælde konstruktionen og visningen af hovedvinduet. Alle hovedvinduets egenskaber bliver fastsat i metoden creategui. Blandt de forskellige egenskaber kan nævnes eksempelvis vinduets størrelse og menuen. Dertil bliver også de actionlisteners, som er tilknyttet de forskellige menupunkter, konstrueret. En actionlistener er et interface, som modtager såkaldte action events. Disse action events kan eksempelvis være valg af et menupunkt, eller tryk på en knap. Til konstruktion og visning af såkaldte ikke-menu komponenter benyttes metoden addcomponentstopane. En vigtig regel ved design af brugergrænseflader er at alle disse ikke-menu komponenter skal indsættes i vinduets content pane. I softwaren omfatter disse komponenter opdeling af vinduet, i to JPanels, der kan betragtes som afgrænsede flader, hvori der kan indsættes indhold. Disse JPanels indeholder henholdsvis en start/stop-knap og den grafiske afbildning af cykelruten. Figur 32: Hovedvinduets inddeling i JPanels ses her. Figur 32 viser hvordan hovedvinduet er inddelt i to JPanels. P1 indeholder således en start/stop-knap, og p2 indeholder den grafiske afbildning af cykelruten. 32

16.1.3 JDialog JDialog-klassen er, som mange af de andre brugte klasser en del af Swing API en. Denne bruges til at lave dialogvinduer. Disse dialogvinduer åbnes i selve hovedvinduet og er ofte forbundet til en knap eller et menupunkt. I stedet for at ændre i hovedvinduet og dets indhold, åbnes disse dialogvinduer, der kan indeholde de samme ikke-menu komponenter, som hovedvinduet. I softwaren bliver disse dialogvinduer brugt ved tryk på menupunkter, når der kræves et input fra brugeren. Figur 33: Screenshot af JDialogvindue til åbning af en ny rute. Figur 33 viser dialogvinduet for åbning af en rute. Ruterne bliver hentet fra databasen, og derefter indsat i en liste. Herunder er en liste over hvilke dialogvinduer, som findes i softwaren. 1. openroutedialog - Dette dialogvindue lister ruterne fra databasen, og gør det muligt for brugeren at åbne den ønskede rute. 2. showhighscoredialog - Dette dialogvindue viser en highscoreliste med navn og tid, for den valgte rute. 3. savehighscore - Dette dialogvindue vises ved afslutning af en cyklet rute, hvor det beder om ens navn, så dette kan gemmes i highscore databasen. Den primære årsag til brugen af disse vinduer er den øgede brugervenlighed, samt at der undgås at skulle ændre i selve hovedvinduet. 33

16.1.4 Grafisk afbildning Den grafiske afbildning af en given rute bliver tegnet i klassen DrawRoute. Denne klasse nedarver egenskaber og metoder fra JPanel klassen. Selve den klasse som benyttes til den grafiske afbildning er Javas Graphics klassen. Klassen muliggør det at tegne geometriske former og tekst på allerede eksisterende komponenter i et vindue. Figur 34: DrawRoute-klassens metoder og egenskaber fremgår af denne figur. Figur 34 viser strukturen, det vil sige egenskaber og metoder, for klassen DrawRoute. Eftersom klassens formål er at blive kaldt i SimulatorView, er det nødvendigt at denne er af typen public. Public indikerer blot at klassen, og dens public metoder, er tilgængelige fra hvilket som helst objekt. Ruteafbildning Det er tidligere nævnt at en rute er opdelt i sektioner, og beskrevet ved en længde og stigning. For at afbilde ruten er det derfor nødvendigt med to sæt XY-koordinater for hver sektion. Disse koordinater bestemmes i klassen RouteData, se afsnit 16.4.2. Når disse informationer er tilgængelige i softwaren, tegnes linjerne i p2, som er et JPanel i hovedvinduet. Metoden der håndterer selve tegningen af linjerne er paint- Component. Nedenfor ses det udsnit af koden, som tegner linjerne. 1 for ( int i = 0 ; i < rcoord. l e n g t h ; i ++){ 2 g2. draw (new Line2D. Double ( 3 rcoord [ i ] [ 0 ] [ 0 ] [ 0 ], 4 rcoord [ i ] [ i + 1 ] [ 0 ] [ 0 ], 5 rcoord [ i ] [ i +1][ i + 1 ] [ 0 ], 6 rcoord [ i ] [ i +1][ i +1][ i +1]) ) ; 7 } Kodeuddraget viser den for-løkke, som ud fra dataene i arrayet rcoord tegner ruten. For hver sektion af ruten, som tegnes, oprettes et objekt af typen Line2D.Double. Objektet får medsendt de to XY-koordinatsæt for linjen. 34

Cyklistafbildning Eftersom det skal være muligt for brugeren at følge sin position på ruten, er det nødvendigt med en grafisk afbildning af dette. Måden hvorpå dette gøres, er ved at tegne en lodret linje, som illustrerer hvor på ruten brugeren befinder sig. Figur 35: Brugerens position på ruten illustreres ved den blå linje. Figur 35 viser brugerens position på en rute i cykelsimulatoren. Måden hvorpå linjen tegnes, er at positionen i x-retningen ændres ud fra den kørte afstand. Herunder er et kodeuddrag, som viser dette. 1 g2. s e t P a i n t (new GradientPaint ( 0, 0, Color. blue, 1 0 0, 1 0 0, Color. blue ) ) ; 2 g2. f i l l (new Rectangle2D. Double ( hcdistance, 3 0, 2, 3 9 0 ) ) ; I kodeuddraget ses koden for den linje som illustrerer brugerens position på ruten. Her benyttes variablen hcdistance, som er den længde brugeren har cyklet. Denne afstand rykker linjen mod højre ud fra den kørte længde. 35

16.2 Database For at skabe forbindelse og kommunikerer med databasen benyttes der, som tidligere nævnt, en API ved navn JDBC. Klassen i softwaren, som håndterer alt databaserelateret hedder dbhandler. Figur 36: dbhandler-klassens metoder og egenskaber fremgår af denne figur. Figur 36 viser de metoder, som klassen dbhandler indeholder. Alle metoder i klassen er relateret til en form for database operation. Den database som benyttes i softwaren, er en Microsoft Access database. JDBC understøtter en lang række databaser, og grunden til valget af Microsoft Access til dette formål, har været databasens grafiske struktur, samt lette betjening. 16.2.1 Forbindelse til databasen Før der kan udføres database operationer, skal der først og fremmest oprettes en forbindelse til databasen. Metoden getconnection returnerer således et Connection objekt, hvis oprettelsen til databasen udføres. Nedenfor ses koden, som opretter forbindelse til databasen. 1 public Connection getconnection ( ) { 2 Connection conn = null ; 3 try { 4 C l a s s. forname ( " sun. jdbc. odbc. JdbcOdbcDriver " ) ; 5 S t r i n g f i l e n a m e = " c : / s i m u l a t o r /db/ t e s t d b. mdb" ; 6 S t r i n g database = " jdbc : odbc : Driver={M i c r o s o f t Access Driver (. mdb) } ;DBQ =" ; 7 database+= f i l e n a m e. trim ( ) ; 8 conn = DriverManager. getconnection ( database, "", "" ) ; 9 } catch ( Exception e ) { 10 System. out. p r i n t l n ( " Error : " + e ) ; 11 } 12 return conn ; 13 } I kodeuddraget bestemmes de forskellige indstillinger for forbindelsen til databasen, og hvis der ikke opstår fejl, returneres et connection objekt. Metoden er opbygget omkring et try/catch statement. Dette statement fungerer således, 36

at koden mellem try s klammer forsøges udført. Statementet catch sørger derimod for, at hvis der opstår en fejl eller undtagelse, at man har mulighed for at håndterer denne. 16.2.2 Database operationer Database operationer omfatter alt, som enten indsætter, opdaterer, sletter eller henter informationer fra databasen. Disse operationer bruges i softwaren til eksempelvis at hente informationer om en given rute, for derefter at bruge disse til at afbilde ruten. Herunder er vist en trinvis fremgangmåde, for at udfører database operationer i Java. 1. Oprettelse af forbindelse til databasen. 2. Oprette og derefter eksekverer et ønsket SQL statement. 3. Hvis der hentes informationer fra databasen, kan disse dernæst behandles. 4. Der lukkes for det SQL statement der er oprettet, samt forbindelsen til databasen. Nedenstående er der vist et kodeeksempel, som benytter netop denne fremgangsmåde, til at udføre en databaseoperation. 1 public void s a v e H i g h s c o r e ( int routeid, int time, S t r i n g ridername ) { 2 Connection dbconn ; 3 4 dbhandler msconn = new dbhandler ( ) ; 5 dbconn = msconn. getconnection ( ) ; 6 7 try { 8 Statement s = dbconn. c r e a t e S t a t e m e n t ( ) ; 9 s. executeupdate ( "INSERT INTO h i g h s c o r e ( [ time ], ridername, r I d ) VALUES( "+ time +", "+ ridername +", "+ r o u t e I d +" ) " ) ; 10 s. c l o s e ( ) ; 11 dbconn. c l o s e ( ) ; 12 } catch ( Exception e ) { 13 System. out. p r i n t l n ( " Error : "+e ) ; 14 } 15 } I kodeuddraget kan det ses, hvordan der oprettes forbindelse til databasen, og dernæst gemmes data ud fra variabler i metoden. Denne del af koden gemmer brugerens tid, på en af ruterne, i highscorelisten. 37

16.3 Seriel kommunikation Modulet til den serielle kommunikation er opbygget af tre klasser. Disse klasser har hver en opgave i softwaren. API RXTX benyttes ved den serielle kommunikation. Figur 37: Her ses de tre klasser, som håndterer den serielle kommunikation. Figur 37 viser tredelingen af de opgaver, som modulet til seriel kommunikation skal håndterer. Klassen Comm opretter forbindelse til den ønskede COM-port. SerialWriter tager sig af al skrivning til denne COM-port, mens SerialReader læser de inputs, som kommer fra MSP en. 16.3.1 Klassen Comm Denne klasse indeholder metoden Connect. Det er denne metode, som åbner forbindelsen til den ønskede COM-port, med de dertil ønskede indstillinger, såsom baudrate og databits. Udover at åbne en forbindelse opretter den klasse også to objekter, SerialWriter og SerialReader. Disse objekter bliver dog kun oprettet hvis der skabes forbindelse til COM-porten. 1 S e r i a l P o r t s e r i a l P o r t = ( S e r i a l P o r t ) commport ; 2 s e r i a l P o r t. s e t S e r i a l P o r t P a r a m s ( baudrate, 3 S e r i a l P o r t.databits_8, 4 S e r i a l P o r t. STOPBITS_1, 5 S e r i a l P o r t.parity_none) ; 6 7 InputStream inputstream = s e r i a l P o r t. getinputstream ( ) ; 8 OutputStream outputstream = s e r i a l P o r t. getoutputstream ( ) ; 9 10 new S e r i a l W r i t e r ( outputstream ) ; 11 s e r i a l P o r t. addeventlistener (new S e r i a l R e a d e r ( inputstream ) ) ; 12 s e r i a l P o r t. notifyondataavailable ( true ) ; Det ovenstående kodeuddrag viser hvordan indstillinger for den serielle kommunikation bliver fastsat. Det er vigtigt at disse indstillinger er de samme, som indstillingerne for MSP en, da disse to ellers ikke kan kommunikere. 38

Da tiden mellem signalskiftene på Hall-effekt sensoren er variabel alt efter hvor hurtigt brugeren træder i pedalerne, kan der ikke benyttes en timer til at modtage data fra MSP en. Dertil bliver en eventlistener oprettet. Dette muliggør at der kan læses data fra MSP en, når disse er til stede. 16.3.2 Klassen SerialReader Denne klasse nedarver egenskaber og metoder fra SerialPortEventListener klassen. Dette gør at det ikke er nødvendigt at eksempelvis benytte sig af en timer, for at indhente oplysninger fra COM-porten efter et fastsat tidsinterval. I softwaren er klassen selv opmærksom på hvornår der er data, som kan læses fra COM-porten, og henter dem når de er tilgængelige. 1 public void s e r i a l E v e n t ( S e r i a l P o r t E v e n t arg0 ) { 2 int data ; 3 try { 4 int l e n = 0 ; 5 while ( ( data = inputstream. read ( ) ) > 1){ 6 i f ( data == \n ) { 7 break ; 8 } 9 b u f f e r [ l e n ++] = ( byte ) data ; 10 } 11 // Encoderhits++ 12 } catch ( Exception e ) { 13 System. out. p r i n t l n ( " Error : "+e ) ; 14 } 15 } I ovenstående kodeuddrag kan den metode, som håndterer de såkaldte serialevents, ses. Det er denne del af koden, som eksekveres, hvis der er tilgængelige data på COM-porten. I softwaren har denne del af koden til opgave at modtage signalskiftene fra Hall-effekt sensoren, som beskriver en omdrejning på cyklens hjul. Ved et sådan signalskift forøger softwaren blot antallet af encoderhits med én. 16.3.3 Klassen SerialWriter I modulet til den serielle kommunikation håndterer denne klasse skrivning til MSP en. De data, som skal skrives til MSP en, omfatter hvilken modstand motoren skal yde på brugeren. 1 public void writedata ( int data ) { 2 try { 3 outputstream. w r i t e ( data ) ; 4 } catch ( Exception e ) { 5 System. out. p r i n t l n ( " Error : "+e ) ; 6 } 7 } I kodeuddraget ses metoden writedata, som er den metode der skriver de ønskede data til MSP en. Modsat serialevent metoden i SerialReader klassen, eksekveres denne for et fastsat tidsinterval. Metoden bliver således kaldt i datatimeren. 39

16.4 Backend Backenden i softwaren indeholder alle de bagvedliggende elementer, som brugeren af softwaren ikke ser. Disse elementer kan eksempelvis forsyne den grafiske brugergrænseflade med informationer, som derefter vises i hovedvinduet. 16.4.1 Datatimer I afsnit 15.4.1 er der beskrevet hvilke opgaver softwarens timer skal håndtere. Disse opgaver skal gentages for et fastsat tidsinterval. Til konstruktion af denne timer er der lavet en klasse ved navn DataTimer. Denne klasse implementerer ActionListener interfacet. Dette interface er abstrakt, og derfor ikke frit tilgængeligt i Java, medmindre man i en klasse implementere det. Figur 38: Er strukturen for klassen DataTimer. Den overstående figur 38 illustrerer DataTimer klassens struktur, det vil sige egenskaber og metoder. Datatimeren er indstillet således at dens kode eksekveres hvert sekund. Dette tidsinterval er dog variabelt, og kan ændres i variablen delay. Timerens actionevent Metoden actionperformed er den metode, som eksekveres så længe timeren er aktiv. De opgaver metoden skal udføre omfatter følgende. 1. Registrere tiden. 2. Kalde den metode, som tegner brugerens position på ruten. 3. Eksekvere den algoritme, som ud fra brugerens position på ruten, sender informationer om den modstand motoren skal yde. Eftersom det fastsatte tidsinterval er bestemt til at være et sekund, løses den første opgave blot ved at forøge variablen timeelapsed med én, for hver eksekvering af actionperformed metoden. Den næste opgave timeren skal udføre, kræver at metoden addcomponentstopane, fra 40

SimulatorView, kaldes. Det er denne metode, som håndterer tilføjelsen af de grafiske elementer til det JPanel, p2, der findes i hovedvinduet. Figur 39: Et blokdiagram over algoritmen. Algoritmen der ud fra brugerens position på ruten bestemmer modstanden, er opbygget omkring følgende dele. 1. Sektions iterator. 2. Sektions længde. 3. Rutens længde. Sektions iteratoren beskriver hvilken sektion af ruten af cykles. Denne forøges med én, hver gang en sektion er passeret. Iteratoren benyttes yderligere til at hente oplysninger fra et array, om sektionens længde, samt modstanden på denne sektion. I det tilfælde hvor brugeren har cyklet en hel rute, sammenlignes den kørte afstand med rutens længde. Når disse er lig hinanden vil timeren stoppe og brugeren kan skrive sig ind på highscorelisten. 41

16.4.2 Rutedata Da det er bestemt at en rute er opbygget af et antal sektioner med dertilhørende længde og stigning, er det for at muliggøre afbildning af disse nødvendigt at omregne disse informationer til to sæt XY-koordinater. Klassen RouteData indeholder en række metoder, som håndterer databasens informationer om ruterne, og behandler disse, så de bliver brugbare til eksempelvis afbildning af ruten. Figur 40: RouteData-klassens metoder og egenskaber fremgår af denne figur. På figur 40 ses hvilke metoder klassen RouteData indeholder. Disse metoder omregner eller på anden måde behandler informationerne fra databasen. Skalering Eftersom området hvor ruten skal indtegnes er begrænset, er det nødvendig at have en skaleringsfaktor til de grafiske elementer. Denne skaleringsfaktor gør at alle de grafiske elementer holder sig indenfor det bestemte område. 1 public double getvertresizeconst ( double routelength ) { 2 double r e s i z e C o n s t ; 3 4 r e s i z e C o n s t = (460/ routelength ) ; 5 6 return r e s i z e C o n s t ; 7 } Ud fra kodeuddraget kan det ses hvordan den vandrette skaleringsfaktor bestemmes. Måden hvorpå denne udregnes, er ved at dividere bredden af området hvori der tegnes med den samlede længde af ruten. Denne værdi returneres, og bruges når linjekoordinaterne for ruten skal udregnes. Linjekoordinater Metoden getlinecoordinates beregner de to sæt XY-koordinater, som er nødvendige for at tegne ruten. De data der beregnes ud fra, er de rå data som hentes fra databasen. 1 x1 = l i n e C o o r d i n a t e s [ i 1][ i ] [ i ] [ 0 ] ; 2 y1 = l i n e C o o r d i n a t e s [ i 1][ i ] [ i ] [ i ] ; 3 4 x2 = x1 + ( rawdata [ 0 ] [ i +1] r e s i z e C o n s t ) ; 5 y2 = y1 ( ( rawdata [ 0 ] [ i +1] rawdata [ i ] [ 0 ] ) /100) horrsconst ; 6 7 l i n e C o o r d i n a t e s [ i ] [ 0 ] [ 0 ] [ 0 ] = x1 ; 8 l i n e C o o r d i n a t e s [ i ] [ i + 1 ] [ 0 ] [ 0 ] = y1 ; 9 l i n e C o o r d i n a t e s [ i ] [ i +1][ i + 1 ] [ 0 ] = x2 ; 10 l i n e C o o r d i n a t e s [ i ] [ i +1][ i +1][ i +1] = y2 ; 42