27.09.2013 Views

Optisk dataoverførsel til en microcontroller - Danmarks Tekniske ...

Optisk dataoverførsel til en microcontroller - Danmarks Tekniske ...

Optisk dataoverførsel til en microcontroller - Danmarks Tekniske ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

“<strong>Optisk</strong> <strong>dataoverførsel</strong> <strong>til</strong> <strong>en</strong> <strong>microcontroller</strong>” Eksam<strong>en</strong>sprojekt, Diplom-IT<br />

I samarbejde med og IMM-B.Eng-2007-76<br />

<strong>Danmarks</strong> <strong>Tekniske</strong> Universitet. 2008-03-14<br />

<strong>Optisk</strong> <strong>dataoverførsel</strong> <strong>til</strong> <strong>en</strong> <strong>microcontroller</strong><br />

Optical Data Transmission to a Micro Controller<br />

STUDERENDE Hasse Bylov Høll (s051155)<br />

VEJLEDER (EKSTERN) Bjarne Mads<strong>en</strong>, Prevas A/S<br />

VEJLEDER Edward Alexandru Todirica, DTU


Forord<br />

Projektet omhandler optisk overførsel af data fra almindelige desktop-computere <strong>til</strong><br />

<strong>microcontroller</strong>e. Vha. <strong>en</strong> Java-applet vil data blive præs<strong>en</strong>teret på <strong>en</strong> almindelig<br />

computerskærm, hvorfra de opsamles af <strong>en</strong> fotos<strong>en</strong>sor forbundet <strong>til</strong> <strong>microcontroller</strong><strong>en</strong>.<br />

Rapport<strong>en</strong> vil give <strong>en</strong> overordnet analyse af problems<strong>til</strong>ling<strong>en</strong> og belyse overvejelser i<br />

forbindelse med udvikling<strong>en</strong> af d<strong>en</strong> bagvedligg<strong>en</strong>de teknik. Der gives et overblik over<br />

arkitektur<strong>en</strong> samt nogle af de problematikker, der gør sig gæld<strong>en</strong>de vedrør<strong>en</strong>de fysiske<br />

forhold. Derudfra vil der blive foretaget <strong>en</strong> vurdering af systemets robusthed ved fejlbetj<strong>en</strong>ing.<br />

Opgav<strong>en</strong> består af to dele, hvor første del bl.a. beskæftiger sig med overførselsprotokol, data-<br />

modtagelse samt dekodnings-process<strong>en</strong> på <strong>microcontroller</strong><strong>en</strong>. And<strong>en</strong> del vil omhandle<br />

udvikling<strong>en</strong> af <strong>en</strong> Java-applet med fokus på <strong>en</strong>kodning og transmittering af data.<br />

Yderligere vil der blive udviklet <strong>en</strong> prototype <strong>til</strong> demonstration af hardwar<strong>en</strong>.


Indhold<br />

Forord.............................................................................................................................................................................................3<br />

1 Indledning....................................................................................................................................................................................6<br />

2 Forundersøgelse......................................................................................................................................................................8<br />

2.1 Baggrund..................................................................................................................................................................................8<br />

2.2 Samm<strong>en</strong>hæng.......................................................................................................................................................................8<br />

2.3 Formål........................................................................................................................................................................................9<br />

2.4 Interess<strong>en</strong>ter............................................................................................................................................................................9<br />

2.5 Kravspecifikation.................................................................................................................................................................10<br />

2.6 Afgrænsning..........................................................................................................................................................................11<br />

2.7 Løsningsmuligheder.............................................................................................................................................................11<br />

2.8 Tidsplan...................................................................................................................................................................................12<br />

2.9 Risikomom<strong>en</strong>ter...................................................................................................................................................................12<br />

3 Overblik.....................................................................................................................................................................................13<br />

3.1 Udviklingsmiljøet....................................................................................................................................................................13<br />

3.1.1 Webnet-modul.............................................................................................................................................................13<br />

3.1.2 Microchip MPLAB ICD2..........................................................................................................................................14<br />

3.1.3 Hardware-prototype................................................................................................................................................15<br />

3.1.4 Forsøgsops<strong>til</strong>ling.........................................................................................................................................................16<br />

3.2 Opgav<strong>en</strong>.................................................................................................................................................................................17<br />

4 Test-applikation......................................................................................................................................................................18<br />

4.1 Analyse....................................................................................................................................................................................18<br />

4.1.1 Skærmteknologier.....................................................................................................................................................19<br />

4.1.2 Lysforhold....................................................................................................................................................................20<br />

4.2 Design......................................................................................................................................................................................21<br />

4.2.1 Programstruktur.........................................................................................................................................................21<br />

4.2.2 Klassediagram...........................................................................................................................................................21<br />

4.2.3 Dataoverførsel............................................................................................................................................................21<br />

4.2.4 G<strong>en</strong>tegning.................................................................................................................................................................22<br />

4.3 Implem<strong>en</strong>tering.....................................................................................................................................................................23<br />

4.3.1 Filer..................................................................................................................................................................................23<br />

4.3.2 Data-panel..................................................................................................................................................................23<br />

4.3.3 Test-applikation.........................................................................................................................................................24<br />

4.3.4 Hjemmeside................................................................................................................................................................26<br />

4.3.5 Placering......................................................................................................................................................................26<br />

4.3.6 Systemafvikling.........................................................................................................................................................27<br />

4.4 Test..........................................................................................................................................................................................27<br />

5 Modtager.................................................................................................................................................................................30<br />

5.1 Analyse....................................................................................................................................................................................30<br />

5.1.1 Systemanv<strong>en</strong>delse....................................................................................................................................................31<br />

5.1.2 Dataoverførsel............................................................................................................................................................32<br />

5.1.2.1 Analog og digital signalbehandling...........................................................................................................32<br />

5.1.2.2 Kodning..............................................................................................................................................................35<br />

5.1.2.3 Visualisering......................................................................................................................................................36


5.2 Design.....................................................................................................................................................................................37<br />

5.2.1 Aflæsning af signal..................................................................................................................................................37<br />

5.2.2 Overførselsprotokol.................................................................................................................................................38<br />

5.2.3 Tilstandsmaskine......................................................................................................................................................39<br />

5.2.4 Kommandoer............................................................................................................................................................40<br />

5.3 Implem<strong>en</strong>tering.....................................................................................................................................................................40<br />

5.3.1 Filer..................................................................................................................................................................................40<br />

5.3.2 Opsætning..................................................................................................................................................................41<br />

5.3.3 Interrupts.......................................................................................................................................................................41<br />

5.3.4 Opbygning...................................................................................................................................................................41<br />

5.3.5 Datamodtagelse........................................................................................................................................................41<br />

5.3.5.1 Tjeksum..............................................................................................................................................................42<br />

5.3.5.2 Lagring...............................................................................................................................................................42<br />

5.4 Test..........................................................................................................................................................................................42<br />

6 S<strong>en</strong>der......................................................................................................................................................................................48<br />

6.1 Analyse...................................................................................................................................................................................48<br />

6.2 Design.....................................................................................................................................................................................49<br />

6.3 Implem<strong>en</strong>tering.....................................................................................................................................................................50<br />

6.3.1 Filer..................................................................................................................................................................................50<br />

6.3.2 Data-panel (version 2)...........................................................................................................................................50<br />

6.3.3 Dynamisk hjemmeside..........................................................................................................................................52<br />

6.3.4 Systemafvikling.........................................................................................................................................................52<br />

6.4 Test..........................................................................................................................................................................................52<br />

7 Udvidelser................................................................................................................................................................................56<br />

8 Konklusion...............................................................................................................................................................................58<br />

8.1 Systemet................................................................................................................................................................................58<br />

8.2 Process<strong>en</strong>.............................................................................................................................................................................59<br />

Bilag A - Tidsplan....................................................................................................................................................................60<br />

Bilag B - Logbog.....................................................................................................................................................................62<br />

B.1 Oversigt.................................................................................................................................................................................62<br />

B.2 Detaljer..................................................................................................................................................................................63<br />

Bilag C - <strong>Tekniske</strong> begreber...............................................................................................................................................65<br />

Bilag D - Kildekode...............................................................................................................................................................67<br />

D.1 Test-applikation..................................................................................................................................................................67<br />

D.1.1 TestApplication.java..............................................................................................................................................67<br />

D.1.2 DataPanel.java (version 1).................................................................................................................................70<br />

D.1.3 index.html..................................................................................................................................................................73<br />

D.1.4 template.css............................................................................................................................................................74<br />

D.2 Modtager.............................................................................................................................................................................74<br />

D.2.1 main.c........................................................................................................................................................................74<br />

D.2.2 picu<strong>til</strong>.h......................................................................................................................................................................79<br />

D.2.3 picu<strong>til</strong>.c......................................................................................................................................................................80<br />

D.2.4 Init.h............................................................................................................................................................................80<br />

D.2.4 init.c............................................................................................................................................................................80<br />

D.2.5 isr.c.............................................................................................................................................................................81<br />

D.3 S<strong>en</strong>der..................................................................................................................................................................................83<br />

D.3.1 Transmitter.java.....................................................................................................................................................83<br />

8.2.1 D.3.2 DataPanel.java (version 2)......................................................................................................................88<br />

D.3.3 index.php.................................................................................................................................................................92<br />

D.3.4 template.css (replikeret).....................................................................................................................................93


1 Indledning<br />

Der er, specielt i USA, <strong>en</strong> kæmpe industri ind<strong>en</strong> for gave- og lykønskningskort, som de<br />

pågæld<strong>en</strong>de produc<strong>en</strong>ter forsøger at skabe opmærksomhed omkring ved at gøre dem så<br />

specielle som muligt. Her i Danmark er gavekort typisk almindelige check-lign<strong>en</strong>de papirlapper,<br />

dekorative kort, og d<strong>en</strong> mere luksuriøse slags kommer <strong>en</strong>t<strong>en</strong> i klodsede indpakninger eller som<br />

plastikkort i s<strong>til</strong> med personlige kreditkort. Lykønskningskort fås også med elektronik, der bl.a.<br />

kan frembringe metallisk kling<strong>en</strong>de lyde, som de fleste vel nok er stødt på ved lejligheder som<br />

fødselsdage og jul – m<strong>en</strong> over there (i USA) er der <strong>en</strong> hel industri, hvad sådan noget angår.<br />

Man kan eksempelvis få plastikkort med blink<strong>en</strong>de juletræer og tal<strong>en</strong>de tegneseriefigure – blot<br />

for at nævne nogle få. Firmaet Cardlab har i samarbejde med Prevas udviklet et såkaldt<br />

wavecard 1 (altså et kort man ryster eller vinker med), der vha. blot syv lysdioder viser <strong>en</strong> tekst<br />

frit i luft<strong>en</strong> – og så er kortet <strong>en</strong>dda kun på størrelse med et almindeligt kreditkort, hvor de<br />

amerikanske oftest er ret tykke (ca. 3-4 mm). Wavecards er, i modsætning <strong>til</strong> de tykke kort,<br />

lige så fleksible som plastikkort, og de kan derfor opbevares samm<strong>en</strong> med <strong>en</strong>s stadigt<br />

voks<strong>en</strong>de samling.<br />

Går man skridtet videre og gør wavecards mere personlige, så bruger<strong>en</strong> selv kan bestemme<br />

hvilk<strong>en</strong> tekst, der frit skal svæve i luft<strong>en</strong>, vil produktet kunne anv<strong>en</strong>des i flere samm<strong>en</strong>hænge<br />

og dermed være mere interessant for kund<strong>en</strong>. Det vil være sjovere for bruger<strong>en</strong>, hvis<br />

produktet gøres mere gadget-agtig, så det skaber omtale, og v<strong>en</strong>ner og bek<strong>en</strong>dte inspireres <strong>til</strong><br />

at få fingre i et wavecard. Det kan eksempelvis opnås, ved at man selv nemt og hurtigt kan<br />

omprogrammere kortet med personlige hilsner eller tekster <strong>til</strong> forskellige lejligheder.<br />

Mulighederne er mange – eksempelvis foreslår Cardlab på deres hjemmeside, at man <strong>til</strong><br />

koncerter vil kunne mindske risiko<strong>en</strong> for ildspåsættelse ved at bruge kort<strong>en</strong>e i stedet for<br />

lightere <strong>til</strong> at udtrykke sig med.<br />

Det vil dog være forholdsvist ressourcekræv<strong>en</strong>de og besværligt at installere<br />

programmeringsudstyr hos hver <strong>en</strong>kelt bruger eller forhandler af kort<strong>en</strong>e. D<strong>en</strong> ideelle løsning vil<br />

være at overføre tekster med udstyr, som er <strong>til</strong>gængelig for alle og <strong>en</strong>hver – nemlig vha. <strong>en</strong><br />

helt almindelig computer med skærm.<br />

Opgav<strong>en</strong> udføres i samarbejde med Prevas A/S, der er blandt de før<strong>en</strong>de i nord<strong>en</strong> ind<strong>en</strong> for<br />

embedded (indlejret) systemudvikling. Rapport<strong>en</strong> udgør d<strong>en</strong> skriftlige del af det afslutt<strong>en</strong>de<br />

eksam<strong>en</strong>sprojekt for IT-diploming<strong>en</strong>iører ved <strong>Danmarks</strong> <strong>Tekniske</strong> Universitet (DTU). Dette<br />

dokum<strong>en</strong>t belyser problems<strong>til</strong>linger og overvejelser, der ligger <strong>til</strong> grund for udvikling<strong>en</strong> af d<strong>en</strong><br />

bagvedligg<strong>en</strong>de teknik for overførsel af forholdsvis små datamængder fra <strong>en</strong> computerskærm.<br />

1 Wavecard: http://www.cardlab.com/Wavecard.htm<br />

6 Indledning


Der vil blive givet <strong>en</strong> analyse af d<strong>en</strong> anv<strong>en</strong>dte metode <strong>til</strong> optisk <strong>dataoverførsel</strong> <strong>til</strong> <strong>en</strong><br />

<strong>microcontroller</strong> med <strong>en</strong> skærm som interface, og derudfra vil der blive foretaget <strong>en</strong> vurdering<br />

af systemets robusthed ved fejlbetj<strong>en</strong>ing. Ligeledes skabes et overblik over nogle af de<br />

problematikker, der gør sig gæld<strong>en</strong>de vedrør<strong>en</strong>de fysiske forhold for d<strong>en</strong>ne form for<br />

kommunikation.<br />

Rapport<strong>en</strong> afspejler projektets arbejdsproces, hvor hver delkompon<strong>en</strong>t udvikles hver for sig. En<br />

forundersøgelse beskriver projektets kontekst og ops<strong>til</strong>ler <strong>en</strong> kravspecifikation for funktionelle<br />

og fysiske krav <strong>til</strong> d<strong>en</strong> samlede løsning, hvorefter overvejelser ang. systemets anv<strong>en</strong>delse<br />

belyses. I et afsnit for sig skabes der overblik over forsøgsops<strong>til</strong>ling<strong>en</strong> og arbejdsopgaverne. Jf.<br />

forordet vil opgav<strong>en</strong> være delt i to. Der er dog i virkelighed<strong>en</strong> tale om tre – hhv. <strong>en</strong> test-<br />

applikations-del samt <strong>en</strong> modtager- og <strong>en</strong> s<strong>en</strong>der-del. Hver del er struktureret i fire<br />

udviklingsfaser: En analyse afgrænser løsning<strong>en</strong>, og der træffes overordnede beslutninger for<br />

funktionalitet<strong>en</strong>. Løsning<strong>en</strong> konkretiseres og detaljer fastlægges i designfas<strong>en</strong>. Dokum<strong>en</strong>tation<br />

for implem<strong>en</strong>tering<strong>en</strong> består af fremhævede tekniske detaljer i forbindelse med selve<br />

udvikling<strong>en</strong>, der kræver yderligere komm<strong>en</strong>tarer. I hvert testafsnit undersøges, hvorvidt d<strong>en</strong><br />

implem<strong>en</strong>terede løsning<strong>en</strong> lever op <strong>til</strong> de s<strong>til</strong>lede krav. Sidst i rapport<strong>en</strong> undersøges<br />

mulighederne for fremtidige udvidelser, og der konkluderes på baggrund af de opnåede<br />

testresultater. Rapport<strong>en</strong>s bilag indeholder <strong>en</strong> tidsplan for projektet, <strong>en</strong> logbog over<br />

arbejdsprocess<strong>en</strong>s faktiske forløb, <strong>en</strong> mindre ordbog over tekniske betegnelser og d<strong>en</strong><br />

samlede kildekode. På d<strong>en</strong> vedlagte DVD findes nærvær<strong>en</strong>de rapport inklusiv bilag samt<br />

kildekod<strong>en</strong>. Alle h<strong>en</strong>visninger forekommer som fodnoter i rapport<strong>en</strong>.<br />

Outputtet fra skærm<strong>en</strong> (s<strong>en</strong>der<strong>en</strong>) laves som <strong>en</strong> Java-applet vha. Eclipse 2 samt d<strong>en</strong> s<strong>en</strong>este<br />

Java-compiler fra SUN Microsystems. Microcontroller<strong>en</strong>s firmware (modtager<strong>en</strong>) er<br />

implem<strong>en</strong>teret i ANSI C i udviklingsmiljøet MPLAB 3 fra Microchip samm<strong>en</strong> med d<strong>en</strong> officielle<br />

PIC-compiller, PICC fra Hi-Tech Software. Dokum<strong>en</strong>tation<strong>en</strong> udarbejdes i Op<strong>en</strong>Office.org, og<br />

illustrationer behandles i programmerne Dia, Inkscape og The GIMP.<br />

2 Eclipse Platform: http://www.eclipse.org/<br />

3 MPLAB Integrated Developm<strong>en</strong>t Environm<strong>en</strong>t: http://www.microchip.com<br />

Indledning 7


2 Forundersøgelse<br />

Følg<strong>en</strong>de afsnit vil forsøge at skabe overblik over projektet og placere det i d<strong>en</strong> rette kontekst.<br />

Der gives <strong>en</strong> beskrivelse af baggrund<strong>en</strong> for projektet og samm<strong>en</strong>hæng<strong>en</strong> med andre<br />

projekter, hvorudfra formålet beskrives. Derudover indkredses projektets interess<strong>en</strong>ter – altså<br />

de involverede parter – og målgrupp<strong>en</strong> fastlægges. Krav <strong>til</strong> systemet konkretiseres og<br />

afgrænses, og der kigges nærmere på forskellige løsningsmuligheder. En foreløbig tidsplan<br />

udarbejdes, og ev<strong>en</strong>tuelle risikomom<strong>en</strong>ter forsøges afklaret.<br />

2.1 Baggrund<br />

Prevas har udviklet et wavecard for Cardlab. Ved første øjekast ligner wavecardet et helt<br />

almindeligt plastikkort, ligesom kreditkort, b<strong>en</strong>zinkort og <strong>til</strong>svar<strong>en</strong>de. Wavecardets elektronik er<br />

opbygget på et yderst tyndt lag film, der udgør dets PCB (printplade), hvorpå der er monteret<br />

et tyndt aflangt batteri, <strong>en</strong> meget lille MCU (<strong>microcontroller</strong>), syv små LEDs (lysdioder) samt <strong>en</strong><br />

piezo. D<strong>en</strong> sidstnævnte består af <strong>en</strong> flad piezo-krystal<br />

monteret på <strong>en</strong> tynd metalplade og anv<strong>en</strong>des typisk<br />

som højttaler i digitalure, alarmsystemer mv. D<strong>en</strong><br />

uds<strong>en</strong>der lyd ved at påvirke krystallet med <strong>en</strong><br />

spænding, hvilket får krystallet, og dermed også<br />

metalplad<strong>en</strong>, <strong>til</strong> at trække sig samm<strong>en</strong> og udvide sig<br />

med høj hastighed. D<strong>en</strong> sætter altså luft<strong>en</strong> i<br />

svingninger, hvilket er opskrift<strong>en</strong> på lydbølger, hvorfor<br />

der fremkommer et lydsignal. I wavecardet fungerer<br />

piezo'<strong>en</strong> dog lige omv<strong>en</strong>dt. D<strong>en</strong> s<strong>en</strong>der<br />

udefrakomm<strong>en</strong>de bevægelser <strong>til</strong> <strong>en</strong> ADC (analog-<strong>til</strong>-digital-converter) på MCU'<strong>en</strong>, der så kan<br />

registrere hurtige bevægelser over nul-punktet (udgangspunktet) på X-aks<strong>en</strong> (set i forhold <strong>til</strong> et<br />

kort der v<strong>en</strong>der på højkant). Microcontroller<strong>en</strong> skal sørge for at tænde og slukke lysdioderne i<br />

forhold <strong>til</strong> kortets position, så d<strong>en</strong> forv<strong>en</strong>tede tekst fremstår rigtigt i luft<strong>en</strong> (se illustration 1 der er<br />

h<strong>en</strong>tet fra Cardlabs website 4 ).<br />

2.2 Samm<strong>en</strong>hæng<br />

I øjeblikket udvikles der på sideløb<strong>en</strong>de plastickort-projekter. Disse er for øjeblikket<br />

hemmeligstemplede, hvorfor der desværre ikke kan refereres <strong>til</strong> dem i d<strong>en</strong>ne rapport.<br />

4 Wavecard på Cardlabs website: http://www.cardlab.com/Wavecard.htm<br />

Illustration 1: Et wavecard rystes i luft<strong>en</strong>.<br />

8 Forundersøgelse


2.3 Formål<br />

Der skal udvikles <strong>en</strong> prototype af wavecardet, der kan programmeres, så <strong>en</strong>hver med<br />

adgang <strong>til</strong> internettet, vil kunne gøre deres wavecards personlige. En forhandler eller bruger<br />

indtaster <strong>en</strong> personlig tekst, som derpå overføres <strong>til</strong> kortet. Betj<strong>en</strong>ing<strong>en</strong> skal være så simpel<br />

som mulig, da man ikke på forhånd kan sige noget om de personer, der i sidste <strong>en</strong>de<br />

anv<strong>en</strong>der produktet. Ligeledes skal der være mulighed for, at <strong>en</strong>hver er i stand <strong>til</strong> at<br />

omprogrammere kort<strong>en</strong>e vha. alm<strong>en</strong>t <strong>til</strong>gængeligt udstyr. Man kan hverk<strong>en</strong> forv<strong>en</strong>te, at<br />

bruger<strong>en</strong> har mere eller mindre avancerede programmerings<strong>en</strong>heder <strong>til</strong> sin rådighed – <strong>en</strong>d<br />

heller at bruger<strong>en</strong> på nog<strong>en</strong> måde er teknisk kyndig.<br />

På længere sigt vil resultatet af projektet kunne b<strong>en</strong>yttes i mere seriøse samm<strong>en</strong>hænge som<br />

eksempelvis <strong>til</strong> <strong>en</strong> videreudvikling af det ov<strong>en</strong>for beskrevne kort <strong>til</strong> aflæsning af fingeraftryk.<br />

2.4 Interess<strong>en</strong>ter<br />

Projektet (se de involverede i figur 2) er led i undertegnedes afslutt<strong>en</strong>de opgave ved DTU med<br />

Edward Todirica som vejleder og Bjarne Mads<strong>en</strong> som ekstern vejleder. Opgav<strong>en</strong> afvikles hos<br />

Prevas, der har udviklet wavecardet for Cardlab med Finn Niels<strong>en</strong> som projektleder. Bo Neis<br />

er studiemedhjælper hos Prevas og arbejder bl.a. med udvikling<strong>en</strong> af hardware-prototyper af<br />

wavecardet. Det er ham, der kommer <strong>til</strong> at udvikle d<strong>en</strong> hardware, der skal modtage signaler<br />

fra skærm<strong>en</strong>.<br />

Forhandlerne af wavecardet og deres kunder<br />

(brugerne) udgør de primære målgrupper for det<br />

program, der skal udvikles <strong>til</strong> at overføre tekster fra<br />

computerskærm<strong>en</strong> <strong>til</strong> wavecardet. Disse to<br />

brugergrupper omfatter uk<strong>en</strong>dte personer, der skal<br />

være i stand <strong>til</strong> at håndtere programmering<strong>en</strong> af<br />

kort<strong>en</strong>e. Derudover udvikles <strong>en</strong> test-applikation <strong>til</strong><br />

brug for nuvær<strong>en</strong>de og fremtidige hard- og<br />

softwareudviklere <strong>til</strong> projekter, hvor der arbejdes<br />

med optisk datatransmission.<br />

Bo Neis udvikler et simpelt stykke hardware, der<br />

skal b<strong>en</strong>yttes <strong>til</strong> at simulere modtager-del<strong>en</strong> ved at<br />

omdanne billedesignaler <strong>til</strong> et elektrisk signal. D<strong>en</strong>ne<br />

prototype består af et hulprint på størrelse med et kreditkort, hvorpå der sidder forskellige<br />

elektriske kompon<strong>en</strong>ter – bl.a. nogle solceller der skal opfange skærm<strong>en</strong>s lyssignaler. Læs<br />

mere om prototyp<strong>en</strong>, udviklingsmiljøet og forsøgsops<strong>til</strong>ling<strong>en</strong> i afsnit 3.<br />

Illustration 2: Projektets omgivelser.<br />

Forundersøgelse 9


2.5 Kravspecifikation<br />

I tabel 1 herunder ops<strong>til</strong>les nogle krav <strong>til</strong> det samlede system jf. opgaveformulering<strong>en</strong>. Hvert af<br />

disse krav har et id<strong>en</strong>tifikationsnummer samt et <strong>til</strong>hør<strong>en</strong>de unikt navn, der udgør <strong>en</strong> titel for<br />

beskrivels<strong>en</strong> af det pågæld<strong>en</strong>de krav. Krav<strong>en</strong>e er prioriterede, så primære krav har værdi<strong>en</strong> 1,<br />

og krav, der bør v<strong>en</strong>te, har værdi<strong>en</strong> 5. De kan kort beskrives på følg<strong>en</strong>de måde:<br />

● 1. prioritet (must have): Fundam<strong>en</strong>tale krav <strong>til</strong> systemet der skal opfyldes.<br />

● 2. prioritet (should have): Vigtige krav der bør opfyldes, hvis det er muligt.<br />

● 3. prioritet (could have): Krav af mindre betydning.<br />

● 4. prioritet (nice to have): Krav der godt kan v<strong>en</strong>te.<br />

● 5. prioritet (would like to have): Forslag <strong>til</strong> s<strong>en</strong>ere versioner.<br />

Desud<strong>en</strong> kan krav<strong>en</strong>e inddeles i forskellige typer, der i dette <strong>til</strong>fælde begrænser sig <strong>til</strong><br />

funktionelle (F) og fysiske (I for ikke-funktionelle) krav.<br />

Det <strong>til</strong>stræbes i d<strong>en</strong>ne opgave, at alle krav med de to højeste prioriteter bliver realiseret.<br />

# Navn Beskrivelse Pri. Type<br />

01 Applikation En Java-applet skal overføre data <strong>til</strong> <strong>en</strong> <strong>microcontroller</strong>. 1 F<br />

02 Medie Data overføres via <strong>en</strong> skærm. 1 I<br />

03 Hjemmeside Applett<strong>en</strong> skal køres fra <strong>en</strong> hjemmeside. 1 F<br />

04 Placering Applett<strong>en</strong> skal vises nederst på hjemmesid<strong>en</strong>. 1 I<br />

05 Multi-transfer Flere områder på applett<strong>en</strong> skal overføre data. 5 F<br />

06 Tekst Applett<strong>en</strong> modtager data via et tekstfelt. 1 F<br />

07 Kodning Data skal kodes. 1 F<br />

08 Modtager Microcontroller<strong>en</strong> skal modtage data via optisk overførsel. 1 F<br />

09 S<strong>en</strong>sor, solo Overførsl<strong>en</strong> sker <strong>til</strong> <strong>en</strong> lysfølsom s<strong>en</strong>sor. 1 I<br />

10 S<strong>en</strong>sor, multi Flere lysfølsomme s<strong>en</strong>sorer skal modtage data individuelt. 5 I<br />

11 Dekodning Modtagne data skal tjekkes for fejl og dekodes. 1 F<br />

12 Visualisering Data skal visualiseres. 1 F<br />

13 Prototype En simpel model skal udgøre <strong>en</strong> prototype for systemet. 1 I<br />

14 Størrelse Prototyp<strong>en</strong> skal være på størrelse med et plastickort/smartcard. 2 I<br />

Tabel 1: De ops<strong>til</strong>lede krav jf. opgavebeskrivels<strong>en</strong>.<br />

10 Forundersøgelse


2.6 Afgrænsning<br />

Metod<strong>en</strong> <strong>til</strong> hvorledes wavecardet sættes i programmerings-<strong>til</strong>stand undersøges, og der skal<br />

foretages <strong>en</strong> vurdering af de forhold, hvorunder kortet fungere optimalt – herunder lysforhold<br />

og skærmtyper. Programmet <strong>til</strong> overførsel af tekster skal kunne b<strong>en</strong>yttes af så mange brugere<br />

som muligt – både hvad angår et intuitivt brugerinterface og kompatibilitet med diverse<br />

browsere. Emner som konvertering mellem analoge og digitale signaler, seriel kommunikation,<br />

kodning samt systemets forskellige <strong>til</strong>stande vil blive berørt i rapport<strong>en</strong>.<br />

Der foretages <strong>en</strong> vurdering af d<strong>en</strong> udleverede prototypes stabilitet, og der kigges nærmere på<br />

mulighed<strong>en</strong> for overførsel af flere bits ad gang<strong>en</strong> vha. gråtoner VS. s/h-signaler.<br />

For yderligere informationer vedrør<strong>en</strong>de afgrænsning<strong>en</strong> h<strong>en</strong>vises <strong>til</strong> rapport<strong>en</strong>s forord.<br />

2.7 Løsningsmuligheder<br />

I forbindelse med opstart<strong>en</strong> af projektet er der blevet talt om at anv<strong>en</strong>de wavecardets<br />

lysdioder <strong>til</strong> at modtage data fra skærm<strong>en</strong>, hvilket ville betyde, at der ikke skulle <strong>til</strong>føjes<br />

yderligere kompon<strong>en</strong>ter <strong>til</strong> selve kortet. Der er dog to væs<strong>en</strong>tlige årsager <strong>til</strong>, at prototyp<strong>en</strong> ikke<br />

er implem<strong>en</strong>teret på d<strong>en</strong>ne måde. For det første skal der arbejdes målrettet på at udvikle et<br />

specielt forstærkerkredsløb <strong>til</strong> at give nogle tydelige signaler – og for det andet vil wavecardet<br />

ikke samtidig kunne kommunikere informationer <strong>til</strong><br />

bruger<strong>en</strong>.<br />

Der blev også talt om at bruge <strong>en</strong> lysfølsom modstand,<br />

m<strong>en</strong> det <strong>en</strong>delige valg faldt på solceller, da de ikke<br />

bruger strøm og fås i udgaver med forskellige fysiske<br />

eg<strong>en</strong>skaber mht. stige-/faldetider, spænding mv.<br />

Desud<strong>en</strong> findes der udgaver, der er så fleksible, at de vil<br />

kunne b<strong>en</strong>yttes <strong>til</strong> plastikkort. Udover solcellerne b<strong>en</strong>yttes<br />

et forstærkerkredsløb og muligvis <strong>en</strong> form for filter <strong>til</strong> at<br />

filtrere forskellige lyskilder fra.<br />

Det er før lykkedes at lave produkter, der kan modtage<br />

data fra <strong>en</strong> skærm. I midt<strong>en</strong> af 1990'erne introducerede<br />

Timex 5 et ur (se illustration der er h<strong>en</strong>tet fra Wikipedia),<br />

som kunne modtage data via skærme med billedrør<br />

ig<strong>en</strong>nem <strong>en</strong> linse placeret over d<strong>en</strong>s display.<br />

5 Timex Datalink: http://<strong>en</strong>.wikipedia.org/wiki/Timex_Datalink<br />

Illustration 3: Timex-uret kan modtage<br />

data fra <strong>en</strong> computerskærm.<br />

Forundersøgelse 11


2.8 Tidsplan<br />

Der er for projektet udarbejdet <strong>en</strong> tidsplan, som illustrerer de <strong>en</strong>kelte delområders<br />

afhængighed. Eksempelvis skal test-applett<strong>en</strong> udvikles før modtager<strong>en</strong>, så d<strong>en</strong>ne kan<br />

kalibreres. Test af s<strong>en</strong>der<strong>en</strong> er afhængig af modtager<strong>en</strong> osv. Tidsplan<strong>en</strong> findes i bilag A<br />

bagerst i rapport<strong>en</strong>.<br />

2.9 Risikomom<strong>en</strong>ter<br />

Projektet rummer nogle usikkerhed, hvilke kan hindre et optimalt projektforløb og komme i<br />

vej<strong>en</strong> for et positivt udfald af det <strong>en</strong>delige system.<br />

● Hardware-prototyp<strong>en</strong> er under stadig udvikling. Der har desværre været nogle<br />

uregelmæssigheder i de signaler d<strong>en</strong> g<strong>en</strong>ererer efter montering<strong>en</strong> af et par simple<br />

kompon<strong>en</strong>ter <strong>til</strong> at filtrere høje frekv<strong>en</strong>ser fra (et såkaldt low-pass filter – læs mere<br />

herom i afsnit 3.1.3). Filtret har nogle lange ledninger, som kan påvirkes af støj, blot <strong>en</strong><br />

person nærmer sig. Bliver der ikke rettet op på dette, vil signalerne kunne have<br />

indvirkning på udviklingsprocess<strong>en</strong> i forbindelse med implem<strong>en</strong>tering og test af<br />

systemet. Der skal med andre ord foretages mere nøjagtige målinger af hardwar<strong>en</strong>s<br />

output.<br />

● Programmerings<strong>en</strong>hed<strong>en</strong> (se afsnit 3.1.1), hvorpå <strong>microcontroller</strong><strong>en</strong> er fastmonteret,<br />

opfører sig <strong>til</strong> tider uheldigt. Man har desværre ikke fuld kontrol over opsætning<strong>en</strong> af<br />

<strong>microcontroller</strong><strong>en</strong>, hvorfor det bør overvejes at skifte <strong>til</strong> <strong>en</strong> and<strong>en</strong> måde at flashe<br />

(programmere) chipp<strong>en</strong> på. D<strong>en</strong> fastmonterede chip er i familie med d<strong>en</strong>, der anv<strong>en</strong>des<br />

på wavecardet, m<strong>en</strong> det er ikke nøjagtigt d<strong>en</strong> samme type. Det bør derfor medtages i<br />

overvejelserne at skifte chip-type og udviklingsmiljø, da dette vil kunne gavne<br />

udviklingsprocess<strong>en</strong> på længere sigt. Der er dog et trade-off forbundet hermed, da<br />

udvikling<strong>en</strong> vil være længere tid om at kunne påbegyndes.<br />

12 Forundersøgelse


3.1 Udviklingsmiljøet<br />

3 Overblik<br />

Her gives et indblik i d<strong>en</strong> hardware, der b<strong>en</strong>yttes <strong>til</strong> udvikling<strong>en</strong> af d<strong>en</strong> optiske <strong>dataoverførsel</strong> <strong>til</strong><br />

wavecardet. Forholdsvist tidligt i udviklingsprocess<strong>en</strong> blev der skiftet udviklingsmiljø. I<br />

begyndels<strong>en</strong> anv<strong>en</strong>dtes et af Prevas' egne produkter kaldet Webnet <strong>til</strong> at kommunikere med<br />

<strong>en</strong> <strong>microcontroller</strong> på et <strong>til</strong>hør<strong>en</strong>de udviklingskort. Dette modul er eg<strong>en</strong>tlig beregnet <strong>til</strong> at<br />

kommunikere med forskellige former for maskiner via et netværk. Tidligere nævntes <strong>en</strong> række<br />

risikomom<strong>en</strong>ter (afsnit 2.9), hvor netop problemer med udviklingsmiljøet blev nævnt. Problemet<br />

skyldtes flere ting – bl.a. overtager Webnet'<strong>en</strong> <strong>en</strong> del af kontroll<strong>en</strong> over <strong>microcontroller</strong><strong>en</strong>, så<br />

der eksempelvis kan være besvær med at styre interrupts og andre ting. Desud<strong>en</strong> er der<br />

ing<strong>en</strong> mulighed for debugging – og sidst m<strong>en</strong> absolut ikke mindst tager det ret lang tid at<br />

reprogrammere chipp<strong>en</strong>. I stedet blev der bes<strong>til</strong>t <strong>en</strong> <strong>microcontroller</strong> af samme type som<br />

wavecarets samt <strong>en</strong> programmerings<strong>en</strong>hed, der virker med Microchips MPLAB IDE – altså et<br />

helt udviklingsmiljø.<br />

3.1.1 Webnet-modul<br />

Det første udviklingsmiljø var ikke noget rigtigt udviklingsmiljø. De anv<strong>en</strong>dte kompon<strong>en</strong>ter ses i<br />

figur 4, som viser et udviklingskort med et såkaldt Webnet-modul monteret i <strong>en</strong> sokkel på dets<br />

underside. Webnett<strong>en</strong> er hjern<strong>en</strong> i systemet og har <strong>en</strong> masse funktionalitet – bl.a. <strong>en</strong><br />

webserver, hvor<strong>til</strong> <strong>en</strong>s programmer uploades efter at være blevet compilet. D<strong>en</strong>ne proces<br />

tager imidlertid rigtig lang tid (fra 30 sekunder og op – alt afhængig af HEX-fil<strong>en</strong>s størrelse) at<br />

udføre gang på gang, og da<br />

der ikke er nog<strong>en</strong> debugger<br />

<strong>til</strong>knyttet, og man på ing<strong>en</strong><br />

måde kan overvåge<br />

systemet, ser det lidt sort ud.<br />

Som vist på oversid<strong>en</strong> af<br />

udviklingskortet (<strong>til</strong> højre i<br />

figur<strong>en</strong>) er der dog <strong>en</strong><br />

terminal-port <strong>til</strong>knyttet; m<strong>en</strong><br />

her skal man selv opsætte<br />

Illustration 4: Det første udviklingsmiljø.<br />

<strong>en</strong> seriel forbindelse i <strong>microcontroller</strong><strong>en</strong> og evt. skrive <strong>til</strong> et terminalprogram, hvilket også lod sig<br />

gøre dog ud<strong>en</strong> at have samme kontrol og indsigt som ved brug af <strong>en</strong> debugger. For at<br />

Overblik 13


komme i kontakt med de <strong>en</strong>kelte b<strong>en</strong> på <strong>microcontroller</strong><strong>en</strong>, blev der lavet et kabel med nogle<br />

stik, som for eksempel ville passe i et breadboard.<br />

Endnu <strong>en</strong> årsag <strong>til</strong> at skifte udviklingsmiljø ligger i det aut<strong>en</strong>tiske – ved at arbejde med netop<br />

d<strong>en</strong> chip-type som wavecardet besidder.<br />

3.1.2 Microchip MPLAB ICD2<br />

Programmerings<strong>en</strong>hed<strong>en</strong> (d<strong>en</strong> runde boks på<br />

illustration 5) er Microchips eg<strong>en</strong> ICD2, der<br />

kan programmere stort set alle PIC-chips på<br />

markedet. D<strong>en</strong> forbindes <strong>til</strong> <strong>en</strong> PC via et<br />

USB-kabel (af typ<strong>en</strong> A-B), hvorfra d<strong>en</strong> også<br />

får strøm <strong>til</strong> at programmere <strong>microcontroller</strong><strong>en</strong><br />

og d<strong>en</strong>s status vises via nogle kontrollamper.<br />

Ønsker man at <strong>til</strong>dele strøm <strong>til</strong> det system,<br />

man udvikler, kan det gøres via <strong>en</strong> ekstern<br />

strømforsyning. Microcontroller<strong>en</strong> forbindes <strong>til</strong><br />

ICD2'<strong>en</strong> via et fladkabel (med RJ25-stik i programmer<strong>en</strong>s <strong>en</strong>de og IDC-stik i chipp<strong>en</strong>s <strong>en</strong>de)<br />

som vist i detaljer på illustration 6. Der b<strong>en</strong>yttes fem b<strong>en</strong> <strong>til</strong> kommunikation mellem PIC-chipp<strong>en</strong><br />

og ICD2'<strong>en</strong>. PIC'<strong>en</strong> kræver <strong>en</strong> høj spænding (12V) på VPP-b<strong>en</strong>et for at programmere d<strong>en</strong>.<br />

Illustration 6: Detaljer for fladkabel.<br />

Illustration 7: Programmerings-interface.<br />

Illustration 5: Microchip ICD2 (In-Circuit Debugger).<br />

Datasignalerne ryger ind og ud via PGD og styres<br />

med et clock-signal via PGC. VDD (i andre<br />

samm<strong>en</strong>hænge også kaldet VCC, V+ eller VS+) er<br />

positivspænding<strong>en</strong>, og VSS er stel (eller ground). Da<br />

der ikke er noget developm<strong>en</strong>t board <strong>til</strong> at forbinde<br />

<strong>en</strong>d<strong>en</strong> af fladkablet med <strong>microcontroller</strong><strong>en</strong>, har<br />

undertegnede selv måtte lave et vha. et så kaldt<br />

breadboard (fumlebræt), hvilket beskrives yderligere<br />

nogle afsnit herunder (se afsnit 3.1.4).<br />

For at kunne <strong>til</strong>slutte <strong>en</strong>d<strong>en</strong> af programmeringkablet<br />

er der blevet lavet et lille print (se illustration 7) med<br />

nogle stik, som skaber de rigtige forbindelser mellem<br />

ICD2-<strong>en</strong>hed<strong>en</strong> og <strong>microcontroller</strong><strong>en</strong> på breadboardet.<br />

D<strong>en</strong> v<strong>en</strong>stre del af figur<strong>en</strong> viser b<strong>en</strong><strong>en</strong>e på<br />

undersid<strong>en</strong> af stikket, der går ned i breadboardet,<br />

hvor de tre pins, der sidder på række, hhv. går<br />

direkte ind på <strong>microcontroller</strong><strong>en</strong>s plus-, data- og clock-b<strong>en</strong>. VPP og Ground føres manuelt rundt<br />

om chipp<strong>en</strong> og går ind på de respektive b<strong>en</strong>. De to plus-b<strong>en</strong> er shunted (parallelkoblet) og<br />

<strong>til</strong>fører samtidig hele systemet <strong>en</strong> positiv spænding – ligesom ground udgør stel for hele<br />

systemet. D<strong>en</strong> højre del af figur<strong>en</strong> viser IDC-stikkets <strong>til</strong>slutning på oversid<strong>en</strong> af det<br />

14 Overblik


hjemmelavede stik.<br />

Ved brug af Webnet'<strong>en</strong> (beskrevet tidligere) var der ikke<br />

<strong>til</strong>knyttet noget IDE (software udviklingsmiljø), for at knytte<br />

<strong>en</strong> avanceret teksteditor samm<strong>en</strong> med compiler og<br />

debugger. Dette er heldigvis <strong>til</strong>fældet med d<strong>en</strong>ne løsning,<br />

hvor Microchip har sørget for, at det hele smelter<br />

samm<strong>en</strong>. Programmet MPLAB IDE (se illustration 8)<br />

integrerer netop disse dele med hinand<strong>en</strong>. Projektfiler<br />

hånteres via <strong>en</strong> velk<strong>en</strong>dt træstruktur og ændres med<br />

editor<strong>en</strong>, der selvfølgelig viser kildekod<strong>en</strong> i farver. D<strong>en</strong><br />

officielle compiler (PICC fra Hi-Tech Software) giver et<br />

hurtigt overblik over ressourceforbruget af programmet<br />

samt ev<strong>en</strong>tuelle syntax-fejl (errors) i kod<strong>en</strong> og advarsler om mulige semantiske misforståelser<br />

(warnings). Der er hurtig adgang <strong>til</strong> at flashe (programmere) <strong>microcontroller</strong><strong>en</strong> og styre<br />

afvikling<strong>en</strong> af programmet, der giver mulighed for debugging og øjebliksbilleder af ønskede<br />

variabler. Ligeledes kan indholdet af EEPROM'<strong>en</strong> vises efter at have stoppet programmet.<br />

3.1.3 Hardware-prototype<br />

Der er udarbejdet <strong>en</strong> prototype (vist i<br />

illustration 9) bestå<strong>en</strong>de af et simpelt<br />

veroboard (hulprint/printplade), hvorpå der er<br />

monteret <strong>en</strong> række serieforbundne solceller og<br />

i første omgang <strong>en</strong> op.amp. (operations-<br />

forstærker/forstærkerkredsløb). S<strong>en</strong>ere er der<br />

<strong>til</strong>føjet et low-pass filter mellem solcellerne og<br />

forstærker<strong>en</strong>.<br />

Forstærker<strong>en</strong> blev implem<strong>en</strong>teret, da der ikke<br />

kunne g<strong>en</strong>ereres nok spænding på udgang<strong>en</strong><br />

af solcellerne <strong>til</strong> at detektere signalerne med<br />

<strong>microcontroller</strong><strong>en</strong>.<br />

Solcellerne kan aktiveres individuelt – og antallet af aktive solceller afgør hvor meget spænding<br />

der leveres på forstærker<strong>en</strong>s udgang. For at give <strong>en</strong> idé om størrelsesforholdet er her et<br />

eksempel på outputtet ved forskellige input fra skærm<strong>en</strong>:<br />

Illustration 8: Microchip MPLAB IDE.<br />

Illustration 9: Hardware-prototyp<strong>en</strong>s bestanddele.<br />

Når farv<strong>en</strong> på skærm<strong>en</strong> er sort, giver det et logisk 0 (ca. 531mV ved 3V forsyning <strong>til</strong> op-amp),<br />

og strøm forbruget for hele kredsløbet er ca. 26 µA. Ved et hvidt signal på skærm<strong>en</strong> får man<br />

et logisk 1 (ca. 2,28V ved 3V forsyning <strong>til</strong> op-amp), og strømforbruget for hele kredsløbet er<br />

ca. 11 µA. Med <strong>en</strong> 5V forsyning <strong>til</strong> op-amp giver <strong>en</strong> sort skærm ligeledes et logisk 0 (ca.<br />

531mV) og et strøm forbrug for hele kredsløbet på 32µA. Hvid skræm giver ig<strong>en</strong> et logisk 1<br />

Overblik 15


(ca. 4 V) og et strømforbrug for hele kredsløbet på 34µV. Ud fra printet går <strong>en</strong> ledning, hvor<br />

d<strong>en</strong> grønne er VCC (positiv-spænding<strong>en</strong>), brun er ground – og <strong>en</strong>delig d<strong>en</strong> hvide der er<br />

outputtet fra op-amp. Der er monteret et stik som passer ned i breadboardet.<br />

Low-pass filtrets knækfrekv<strong>en</strong>s (ωc) er sat <strong>til</strong><br />

30Hz, så alt over d<strong>en</strong>ne frekv<strong>en</strong>s dæmpes<br />

fra. Selve filtret består blot af <strong>en</strong> kond<strong>en</strong>sator<br />

(33nF) i serie med <strong>en</strong> modstand (1M Ω).<br />

Bag på boardet sidder i alt fem solceller i serie<br />

(vist i illustration 10). Disse solceller kan kobles<br />

<strong>til</strong> og fra via jumpers. Ved op-amp'<strong>en</strong> bruges<br />

d<strong>en</strong> <strong>en</strong>e af de to modstande <strong>til</strong> at sætte gain,<br />

- og d<strong>en</strong> er monteret så d<strong>en</strong> kan udskiftes og<br />

hvormed gain ændres. Modstand<strong>en</strong>e ved op-amp, R1 og R2, har hhv. værdierne 15k Ω og<br />

330k Ω,<br />

hvilket giver et gain på 23.<br />

3.1.4 Forsøgsops<strong>til</strong>ling<br />

Figur<strong>en</strong> (illustration 11) viser et hjemmelavet developm<strong>en</strong>t board konstrueret på et så kaldt<br />

breadboard, hvor forbindelserne løber som vist med markeringerne i cirkl<strong>en</strong> – altså på langs<br />

ude i kant<strong>en</strong> og på tværs de andre steder. Ledningerne længst <strong>til</strong> højre forbinder de to<br />

langsider med hinand<strong>en</strong>, hvor VDD<br />

(plus) og VSS (stel) løber.<br />

Microcontroller<strong>en</strong> (angivet som MCU<br />

på billedet) er forbundet via det<br />

hjemmelavede interface med VDD,<br />

PGD og PGC (som omtalt i afsnit<br />

3.1.2). Ligeledes er hele systemet<br />

forsynet med strøm via det<br />

hjemmelavede interface øverst i<br />

billedet. VPP føres rundt om MCU'<strong>en</strong><br />

og ind på samme b<strong>en</strong> som MCLR<br />

(der holdes høj med <strong>en</strong> pull-up modstand), og stel <strong>til</strong>sluttes på b<strong>en</strong>et ved sid<strong>en</strong> af.<br />

Microcontroller<strong>en</strong> kan nuls<strong>til</strong>les ved kortvarigt at trække MCLR lav (altså <strong>til</strong> stel). Det er muligt at<br />

slutte strøm <strong>til</strong> systemet via et batteri, hvis man vil undgå afhængighed af <strong>en</strong> ekstern<br />

strømforsyning (<strong>til</strong>sluttet programmerings<strong>en</strong>hed<strong>en</strong>). En lysdiode indikerer, om der er strøm på.<br />

Det ov<strong>en</strong>for beskrevne er minimum-kravet <strong>til</strong> systemet for at kunne arbejde med PIC'<strong>en</strong>.<br />

Dataoverførsel fra <strong>en</strong> computerskærm gøres muligt via <strong>en</strong> ADC-pin <strong>til</strong>sluttet solcellerne – eller<br />

rettere udgang<strong>en</strong> af forstærkerkredsløbet (beskrevet i afsnit 3.1.3). Desud<strong>en</strong> er der monteret<br />

nogle lysdioder for at kunne simulere wavecardets output. De er trukket høje, hvorfor de er<br />

aktivet lave.<br />

Illustration 10: Prototyp<strong>en</strong> set fra skærm<strong>en</strong>.<br />

Illustration 11: Hjemmelavet developm<strong>en</strong>t board.<br />

16 Overblik


Selve <strong>microcontroller</strong><strong>en</strong> er af typ<strong>en</strong> PIC-16F819 6 , der er spækket med funktionalitet – bl.a. <strong>en</strong><br />

intern oscilator fra 31 kHz <strong>til</strong> 8MHz, 3584 bytes programhukommelse, 256 bytes SRAM, <strong>en</strong><br />

EEPROM på 256 bytes, 16 I/O-porte, <strong>en</strong> 16-bit timer, to 8-bit timere, <strong>en</strong> 10-bit 5-kanals ADC,<br />

16-bit capture og compare, 10-bit puls-bredde-modulator, SPI og I 2 C (slave). Med al d<strong>en</strong><br />

funktionalitet kan man godt tvivle på om Prevas bliver ved med at b<strong>en</strong>ytte netop d<strong>en</strong>ne chip <strong>til</strong><br />

deres wavecards, da det burde være muligt at finde <strong>en</strong> MCU med et par ADC'er (<strong>til</strong> piezo og<br />

solceller) og <strong>en</strong> <strong>en</strong>kelt 8-bit port (<strong>til</strong> LEDs) noget billigere <strong>en</strong>d d<strong>en</strong>ne temmeligt kraftige<br />

<strong>microcontroller</strong>.<br />

3.2 Opgav<strong>en</strong><br />

Overordnet set består d<strong>en</strong> samlede opgave i at udvikle flere programmer, hvilke består af<br />

yderligere delopgaver. Samlet er der tale om tre programmer, som løses hver for sig i deres<br />

egne dele af rapport<strong>en</strong>, hvor der fortages <strong>en</strong> analyse og et design af d<strong>en</strong> givne problems<strong>til</strong>ling<br />

hvorefter programmet implem<strong>en</strong>teres og testes:<br />

● Test-applikation (Java-applet)<br />

○ Analyse<br />

○ Design<br />

○ Implem<strong>en</strong>tering<br />

○ Test<br />

● Modtager (Firmware <strong>til</strong> wavecardets <strong>microcontroller</strong>)<br />

○ Analyse<br />

○ Design<br />

○ Implem<strong>en</strong>tering<br />

○ Test<br />

● S<strong>en</strong>der (Java-applet)<br />

○ Analyse<br />

○ Design<br />

○ Implem<strong>en</strong>tering<br />

○ Test<br />

Hvert <strong>en</strong>kelt program ligger op <strong>til</strong> løsning<strong>en</strong> af de følg<strong>en</strong>de, så disse kan testes vha. hinand<strong>en</strong>.<br />

Test-applikation<strong>en</strong> er <strong>en</strong> Java-applet (hvorfor d<strong>en</strong> også omtales test-applet), der udvikles for at<br />

kunne implem<strong>en</strong>tere og teste modtager<strong>en</strong>. D<strong>en</strong> kan blinke med skærm<strong>en</strong> i forskellige nuancer<br />

og med variabel frekv<strong>en</strong>s og duty-cycle. Desud<strong>en</strong> laves der <strong>en</strong> hjemmeside, som kan vise<br />

applett<strong>en</strong>, så d<strong>en</strong> fremtidige udvikling af modtager<strong>en</strong> kan testes blot vha. <strong>en</strong> internetforbindelse.<br />

Modtager<strong>en</strong> er selve wavecardet, der overordnet set består af <strong>en</strong> <strong>microcontroller</strong> med<br />

forskellige I/O-<strong>en</strong>heder. D<strong>en</strong> testes ved at b<strong>en</strong>ytte test-applikation<strong>en</strong>. S<strong>en</strong>der<strong>en</strong> er <strong>en</strong><br />

videreudvikling af test-applikation<strong>en</strong>, som kan transmittere data <strong>til</strong> modtager<strong>en</strong> via <strong>en</strong><br />

hjemmeside. Modtager<strong>en</strong> b<strong>en</strong>yttes <strong>til</strong> at teste s<strong>en</strong>der<strong>en</strong>s funktionalitet og stabilitet.<br />

6 PIC-16F819 datablad: http://ww1.microchip.com/downloads/<strong>en</strong>/DeviceDoc/39598e.pdf<br />

Overblik 17


4 Test-applikation<br />

Der skal udarbejdes et testprogram, som er <strong>en</strong> mini-udgave af d<strong>en</strong> <strong>en</strong>delige s<strong>en</strong>der-<br />

applikation, <strong>til</strong> at understøtte både soft- og hardwareudvikling<strong>en</strong> af modtager<strong>en</strong>. Programmets<br />

formål er at g<strong>en</strong>erere pålidelige datasignaler fra skærm<strong>en</strong>. For at kunne bruge outputtet <strong>til</strong><br />

noget fornuftigt er det nødv<strong>en</strong>digt at k<strong>en</strong>de de forhold, som wavecardet skal operere under.<br />

Man er bl.a. nødt <strong>til</strong> at k<strong>en</strong>de <strong>til</strong> forskellige typer af skærme, og vide hvordan de opfører sig.<br />

Det vil også være nyttigt at vide, om et lokales lysforhold kan påvirker wavecardets s<strong>en</strong>sorer<br />

mv. Yderligere strukturers og implem<strong>en</strong>teres <strong>en</strong> hjemmesideløsning, hvorfra applett<strong>en</strong> kører fra.<br />

Til sidst undersøges systemets anv<strong>en</strong>delighed ud fra udførte tests.<br />

4.1 Analyse<br />

Test-applikation<strong>en</strong> h<strong>en</strong>v<strong>en</strong>der sig <strong>til</strong> systemudviklere, og d<strong>en</strong> skal bruges <strong>til</strong> at teste hardwar<strong>en</strong><br />

vha. systematiske input. Programmet implem<strong>en</strong>teres som <strong>en</strong> Java-applet, så d<strong>en</strong> kan<br />

anv<strong>en</strong>des fra <strong>en</strong> hvilk<strong>en</strong> som helst computer med <strong>en</strong> internetopkobling og grafisk<br />

brugerinterface. D<strong>en</strong>s opgave består i at uds<strong>en</strong>de blinke-signaler i <strong>en</strong>, af bruger<strong>en</strong>, defineret<br />

rytme, hvorfor det skal være muligt at variere<br />

både frekv<strong>en</strong>s<strong>en</strong>, hvormed der blinkes, samt<br />

on-/off-tid<strong>en</strong> for det <strong>en</strong>kelte blink. On-tid<strong>en</strong> går<br />

under betegnels<strong>en</strong> duty-cycle. Derudover skal<br />

det være muligt at ændre kontrast<strong>en</strong> mellem<br />

blinkets høje og lave del for at gøre det muligt<br />

at undersøge og justere hardwar<strong>en</strong>s<br />

lysfølsomhed.<br />

Illustration 12 viser et udkast <strong>til</strong> applett<strong>en</strong>s<br />

opbygning. De to kasser med runde hjørner<br />

repræs<strong>en</strong>terer hver sin del af programmet,<br />

hvoraf d<strong>en</strong> store er selve applett<strong>en</strong> og d<strong>en</strong> lille<br />

udgør et data-panel med det blink<strong>en</strong>de område<br />

(markeret med grå). De ov<strong>en</strong>for beskrevne<br />

funktionaliteter, for styring af frekv<strong>en</strong>s, duty-<br />

cycle og kontrast, er repræs<strong>en</strong>teret vha. de lodrette scroll-bars. Der er ligeledes placeret <strong>en</strong><br />

knap, mærket ”Test” <strong>til</strong> at tænde og slukke for signalerne.<br />

Illustration 12: Prototype af test-applet.<br />

18 Test-applikation


4.1.1 Skærmteknologier<br />

Normalt b<strong>en</strong>yttes skærme som <strong>en</strong> form for vindue, der omdanner elektriske signaler <strong>til</strong><br />

information <strong>til</strong> brug for lev<strong>en</strong>de m<strong>en</strong>nesker – hvad <strong>en</strong>d der er tale om TV-billeder eller<br />

statusmeddelelser for maskiner. Det nye, ved d<strong>en</strong> måde hvorpå skærm<strong>en</strong> anv<strong>en</strong>des i dette<br />

projekt, ligger i modtager-del<strong>en</strong>, da det nu er <strong>en</strong> maskine, der skal kunne forstå billederne.<br />

S<strong>en</strong>der<strong>en</strong> g<strong>en</strong>ererer billeder i stedet for elektriske signaler, og det er modtager<strong>en</strong>s opgave at<br />

reg<strong>en</strong>erere de elektriske signaler ud fra billederne. Da der er forskel på skærme, er det<br />

nødv<strong>en</strong>digt at kigge nærmere på de forskellige typer. Her omtales kun traditionelle<br />

computerskærme med katoderør og displays, da de udgør d<strong>en</strong> aller største del på markedet<br />

– hvorfor plasma- og laserskærme ikke vil blive berørt yderligere.<br />

Ældre skærme (se illustration 13, der er h<strong>en</strong>tet<br />

fra Wikipedia 7 ), af typ<strong>en</strong> CRT, b<strong>en</strong>ytter <strong>en</strong><br />

elektronkanon (1) – kaldet et katoderør – <strong>til</strong> at<br />

s<strong>en</strong>de elektronstråler (2) mod et positivt ladet<br />

område (5). Undervejs samles (3)<br />

elektronstrålerne og rettes (4) mod et bestemt<br />

punkt på et fint-maske net (6), der sorterer de<br />

tre ”grundfarver”. Derefter rammer strålerne<br />

forskellige fluorescer<strong>en</strong>de fosforlag (7 og 8) på<br />

indersid<strong>en</strong> af <strong>en</strong> glasplade, hvilket får d<strong>en</strong> <strong>til</strong> at<br />

uds<strong>en</strong>de lys, i det korte øjeblik plad<strong>en</strong> rammes<br />

af elektroner. Elektronkanon<strong>en</strong> starter i<br />

skærm<strong>en</strong>s øverste v<strong>en</strong>stre hjørne (set fra seer<strong>en</strong>s synsvinkel) og bevæger sig så i læse<br />

retning mod nederste højre hjørne.<br />

Skærm<strong>en</strong>s opdateringsfrekv<strong>en</strong>s (<strong>en</strong>g. refresh rate måles i hertz) er et udtryk for, hvor mange<br />

gange i sekundet billedet på skærm<strong>en</strong> g<strong>en</strong>tegnes. Bliver opdateringsfrekv<strong>en</strong>s<strong>en</strong> for lav, vil øjet<br />

registrere g<strong>en</strong>tegnigerne som irriter<strong>en</strong>de blink.<br />

Skærm<strong>en</strong> opdateres i samme takt som d<strong>en</strong> strøm, der kommer ud af <strong>en</strong> stikkontakt. I Europa<br />

er d<strong>en</strong>ne frekv<strong>en</strong>s 50Hz, hvorfor hele skærmbilledet vil være opdateret 50 gange i sekundet.<br />

Det sker ved hhv. at opdatere de lige og ulige linjer med hver 25Hz.<br />

CRT-skærme har det, man kalder efterglød ligesom elektriske pærer, der skal bruge nogle<br />

millisekunder på at lyse helt op og slukke helt. Grund<strong>en</strong>, <strong>til</strong> at man ikke blot vil se <strong>en</strong> masse<br />

små blink<strong>en</strong>de punkter, skyldes <strong>en</strong> kombination af efterglød<strong>en</strong> og d<strong>en</strong>, i forhold <strong>til</strong> øjet, høje<br />

opdateringsfrekv<strong>en</strong>s.<br />

Nyere CRT-skærme opdateres ved højere frekv<strong>en</strong>ser <strong>en</strong>d 50 Hz, da man gradvist har været<br />

nødt <strong>til</strong> at mindsket efterglød<strong>en</strong>. Sætter man eksempelvis sin computer <strong>til</strong> sit halv-gamle TV, vil<br />

billedet fremstå gnidret og tåget, og mus<strong>en</strong> vil eksempelvis ikke kunne følge med – der opstår<br />

7 CRT: http://<strong>en</strong>.wikipedia.org/wiki/Cathode_ray_tube<br />

Illustration 13: Skærm med CRT-teknologi.<br />

Test-applikation 19


”haler” efter mus<strong>en</strong>, som det kaldes. For at computerskærme kan leve op <strong>til</strong> de gradvist højere<br />

krav <strong>til</strong> hurtig grafik, der ofte kræves af computerspil, 3D-programmer og lign<strong>en</strong>de, er<br />

efterglød<strong>en</strong> blevet mindsket. Dette har dog resulteret i øgede krav <strong>til</strong> opdateringsfrekv<strong>en</strong>s<strong>en</strong> af<br />

billedet, for at øjet ikke skal nå at opfatte at skærm<strong>en</strong> i virkelighed<strong>en</strong> blinker.<br />

De mere moderne fladskærme b<strong>en</strong>ytter et dot-matrix AMLCD (LCD-display) – se illustration 14,<br />

der også er h<strong>en</strong>tet fra Wikipedia 8 . Hver pixel består af tre TFT'er <strong>til</strong> at belyse de <strong>en</strong>kelte<br />

punkter på skærm<strong>en</strong> med hhv. rød, grøn og blå. Der anv<strong>en</strong>des altså ikke elektronstråler, og<br />

dermed opdateres billedet ikke på samme måde som ved CRT-skærme, m<strong>en</strong> i stedet vises et<br />

fast billede.<br />

Illustration 14: Fladskærm med<br />

TFT-teknologi.<br />

En TFT-skærm vil oftest have <strong>en</strong> opdateringsfrekv<strong>en</strong>s på<br />

60Hz, hvilket svarer <strong>til</strong> skærm<strong>en</strong>s vertikale opdatering 9 .<br />

Ved at ændre spænding<strong>en</strong> (målt i volt) <strong>til</strong> skærm<strong>en</strong>s<br />

baggrundslys, f.eks. vha. PWM (puls-bredde modulation), kan<br />

man styre skærm<strong>en</strong>s lysint<strong>en</strong>sitet. Dette kan dog imidlertid<br />

resultere i højfrekv<strong>en</strong>te blinke-signaler, som <strong>en</strong> lysfølsom<br />

s<strong>en</strong>sor vil kunne registrere.<br />

TFT-skærm<strong>en</strong>s responstid (for tid<strong>en</strong> målt i millisekunder) er et<br />

udtryk for, hvor lang tid det tager at g<strong>en</strong>tegne skærm<strong>en</strong> –<br />

altså d<strong>en</strong> tid et <strong>en</strong>kelt punkt skal bruge for at kunne nå at<br />

skifte fra <strong>en</strong> farve <strong>til</strong> <strong>en</strong> and<strong>en</strong> og <strong>til</strong>bage ig<strong>en</strong>. Des lavere<br />

responstid des mere flyd<strong>en</strong>de vil bevægelser i billedet opfattes.<br />

Ofte vil responstid<strong>en</strong> være målet for <strong>en</strong> gråtone-overgang<br />

(grey-to-grey eller G2G) og ikke efter d<strong>en</strong> oprindelige sort/hvid-overgang jf. ISO-standard<strong>en</strong> –<br />

hvor <strong>en</strong> skærm målt efter d<strong>en</strong> første metode vil give et <strong>til</strong>synelad<strong>en</strong>de ”flottere resultat”. Der<br />

kan dog argum<strong>en</strong>teres for at forhandlerne b<strong>en</strong>ytter sig af resultaterne af G2G-målinger, da<br />

skift mellem helt sort og helt hvid forekommer sjæld<strong>en</strong>t ved alm<strong>en</strong>t brug.<br />

4.1.2 Lysforhold<br />

Det kan ikke antages, at modtager<strong>en</strong> på forhånd er kalibreret <strong>til</strong> <strong>en</strong> bestemt mængde lys, da<br />

bruger<strong>en</strong> kan befinde sig i alt fra et oplyst kontor <strong>til</strong> <strong>en</strong> mørk kælder. På forhånd kan der heller<br />

ikke siges noget om bruger<strong>en</strong>s behov for lys på skærm<strong>en</strong> – eller mangel på samme. Ideelle<br />

signaler er derfor udelukket fra start<strong>en</strong>, hvilket kommer <strong>til</strong> at gøre designet af modtager<strong>en</strong><br />

mere besværligt. Disse forhold kan simuleres vha. ændring<strong>en</strong> af kontrast<strong>en</strong> i applett<strong>en</strong>, så<br />

man nøjagtigt kan definere bestemte gråtone-værdier for højt og lavt signal.<br />

8 TFT-LCD: http://<strong>en</strong>.wikipedia.org/wiki/Thin_film_transistor_liquid_crystal_display<br />

9 TFT refresh rate: http://www.tftc<strong>en</strong>tral.co.uk/specs.htm<br />

20 Test-applikation


4.2 Design<br />

Efter at have analyseret de fysiske forhold, for miljøet hvori dataoverførsl<strong>en</strong> skal foregå, står<br />

det nu forholdsvist klart, hvilke former for signaler der s<strong>en</strong>des <strong>til</strong> modtager<strong>en</strong>. R<strong>en</strong>t faktisk<br />

resulterede analys<strong>en</strong> i <strong>en</strong> lettere modificering af selve hardwar<strong>en</strong>, der fik <strong>til</strong>føjet et low-pass filter<br />

mellem udgang<strong>en</strong> på solcellerne og indgang<strong>en</strong> på forstærkerkredsløbet for at undgå de<br />

forstyrr<strong>en</strong>de PWM-signaler ved dæmpning af skærmbelysning<strong>en</strong>. Dermed undgår man også<br />

andre højfrekv<strong>en</strong>te lyssignaler fra eksempelvis lysstofrør.<br />

I det følg<strong>en</strong>de foretages <strong>en</strong> g<strong>en</strong>nemgang af test-applikation<strong>en</strong>s programstruktur, hvor de<br />

<strong>en</strong>kelte elem<strong>en</strong>ter <strong>til</strong> visning og afvikling af programmets funktionalitet kort ridses op. Et<br />

klassediagram viser rammerne for applett<strong>en</strong>s overordnede opbygning, og der udarbejdes <strong>en</strong><br />

teknik <strong>til</strong> at tegne på skærm<strong>en</strong>.<br />

4.2.1 Programstruktur<br />

Der vil blive oprettet <strong>en</strong> fil med HTML-struktur <strong>til</strong> at vise applett<strong>en</strong> på <strong>en</strong> hjemmeside, og<br />

layoutet styres vha. et stylesheet, som placerer indholdet nederst i browser-vinduet i h<strong>en</strong>hold <strong>til</strong><br />

kravspecifikation<strong>en</strong>. Gæld<strong>en</strong>de standarder ind<strong>en</strong> for webdesign bør følges, og layoutet skal<br />

kunne vises i så mange browsere som muligt. Der vil ikke gøres noget særligt ud af<br />

brugerinformationer på hjemmesid<strong>en</strong>, da det i sidste <strong>en</strong>de vil være op <strong>til</strong> Cardlab at<br />

underbygge deres nuvær<strong>en</strong>de layout og chargon.<br />

4.2.2 Klassediagram<br />

Programmet inddeles i to Java-klasser, hvor TestApplication udgør selve applett<strong>en</strong> og<br />

indeholder diverse kompon<strong>en</strong>ter – bl.a. DataPanel der er det specielle område på skærm<strong>en</strong>,<br />

som oversætter tekst <strong>til</strong> data i form af<br />

billedesignaler. Det fremgår af<br />

illustration 15 at DataPanel skal<br />

implem<strong>en</strong>tere Runnable. Dette skyldes,<br />

at panelet skal køre i <strong>en</strong> tråd for ikke<br />

at bruge alle applett<strong>en</strong>s ressourcer på<br />

udelukk<strong>en</strong>de at stå og blinke.<br />

4.2.3 Dataoverførsel<br />

Illustration 15: Overordnet klassediagram for test-applett<strong>en</strong>.<br />

I princippet vil man kunne overføre data med hastigheder relativt <strong>til</strong> antallet af farv<strong>en</strong>uancer på<br />

skærm<strong>en</strong> og mængd<strong>en</strong> af s<strong>en</strong>sorer på wavecardet. Teknologi<strong>en</strong> er dog på nuvær<strong>en</strong>de<br />

tidspunkt begrænset af, hardware-prototyp<strong>en</strong> af wavecardet der blot har <strong>en</strong> <strong>en</strong>kelt s<strong>en</strong>sor,<br />

som kun kan detektere gråtoner. De analoge signaler er præget af <strong>en</strong> del støj, og sænkes<br />

lysstyrk<strong>en</strong> på nyere LCD-skærme, bliver signalet naturligvis <strong>en</strong>dnu dårligere, da kontrast<strong>en</strong><br />

bliver lavere, og dermed bliver billedet forholdsvist mørkt. D<strong>en</strong>ne rapport vil først og fremmest<br />

Test-applikation 21


fokusere på binær datatransmission, da hardwar<strong>en</strong>s g<strong>en</strong>k<strong>en</strong>delse af gråtoner <strong>en</strong>dnu ikke er<br />

<strong>til</strong>strækkeligt udviklet. Dette bevirker imidlertid at dataoverførsl<strong>en</strong> begrænses grundet de<br />

omtalte skift mellem helt sort og helt hvid, som blev omtalt i analys<strong>en</strong>. Det forv<strong>en</strong>tes dog ikke,<br />

at teknologi<strong>en</strong> når at blive så raffineret i løbet af udarbejdels<strong>en</strong> af d<strong>en</strong>ne opgave, at der opnås<br />

hastigheder, hvor dette bliver et problem. Man bør dog i videreudvikling<strong>en</strong> af systemet sørge<br />

for at hardwar<strong>en</strong> implem<strong>en</strong>teres med mere fintføl<strong>en</strong>de modtagere <strong>en</strong>d de nuvær<strong>en</strong>de solceller,<br />

så lysniveauerne bedre kan skelnes fra hinand<strong>en</strong>. Hvis der kan måles <strong>en</strong> forskel på to<br />

forholdsvist tætligg<strong>en</strong>de gråtoner, vil overførselshastighed<strong>en</strong> kunne forøges betragteligt.<br />

For at undgå de høje frekv<strong>en</strong>ser er der indsat et filter i hardware-prototyp<strong>en</strong> mellem solcellerne<br />

og forstærker<strong>en</strong>. Fladskærme opdaterer som bek<strong>en</strong>dt skærme med 60Hz, så filteret sættes<br />

<strong>til</strong> halvdel<strong>en</strong> af max-frekv<strong>en</strong>s<strong>en</strong>, for at undgå så meget støj som muligt. Dette vil dog let kunne<br />

ændres s<strong>en</strong>ere, når man <strong>en</strong>gang har fået systemet <strong>til</strong> at blive mere stabilt. Med <strong>en</strong> frekv<strong>en</strong>s<br />

på 30Hz giver det <strong>en</strong> maksimal overførselshastighed på 30bit/s, hvilket ikke virker særligt<br />

hurtigt, m<strong>en</strong> samm<strong>en</strong>lignes med datamængd<strong>en</strong> på nogle bytes vil det være ganske fornuftigt.<br />

Ideelt set vil 15 karakterer kunne overføres på fire sekunder. Der<strong>til</strong> skal muligvis ligges et par<br />

ekstra bytes for at styre kommunikation<strong>en</strong> samt et par bits per byte <strong>til</strong> fejltjek; hvorfor d<strong>en</strong><br />

<strong>en</strong>delige overførsel mere sandsynligt vil tage et sted mellem seks <strong>til</strong> otte sekunder.<br />

Test-applikation<strong>en</strong> konfigureres <strong>til</strong> at kunne blinke med skærm<strong>en</strong> 1-100 gange i sekundet. De<br />

yderligere 30-100 gange er simpelth<strong>en</strong> grundet fremtidssikring – og signalets duty-cycle kan<br />

varieres mellem 0-100%. Inds<strong>til</strong>ling<strong>en</strong> af kontrast<strong>en</strong>, for repræs<strong>en</strong>tation<strong>en</strong> af 0 og 1, varierer<br />

skærm<strong>en</strong>s gråtoner med værdier mellem 0-255.<br />

4.2.4 G<strong>en</strong>tegning<br />

Datapanelet skal stå og blinke med<br />

forskellige nuancer, og dermed<br />

foretages <strong>en</strong> g<strong>en</strong>tegning af<br />

datapanelets område <strong>en</strong> hel del<br />

gange i sekundet. G<strong>en</strong>tegnes<br />

panelet kan der imidlertid opstå<br />

væs<strong>en</strong>tlige problemer med<br />

visning<strong>en</strong> af billedet på skærm<strong>en</strong>,<br />

da det tegnes punkt for punkt, linje<br />

for linje. I stedet anv<strong>en</strong>des <strong>en</strong> teknik<br />

kaldet double-buffering 10 (se<br />

illustration 16), hvor billedet forberedes ud<strong>en</strong> for skærm<strong>en</strong>. Her skabes billedet i <strong>en</strong> buffer (1), så<br />

selve tegne-process<strong>en</strong> ikke vises i datapanelet. Når billedet er tegnet færdigt bag facad<strong>en</strong>,<br />

smækkes det op på skærm<strong>en</strong> (2).<br />

10 DoubleBuffering: http://java.sun.com/docs/books/tutorial/extra/fullscre<strong>en</strong>/doublebuf.html<br />

Illustration 16: G<strong>en</strong>tegning af datapanel.<br />

22 Test-applikation


4.3 Implem<strong>en</strong>tering<br />

Herunder beskrives programmets overordnede struktur, samt mindre detaljer for specielle<br />

program-metoder. Selvforklar<strong>en</strong>de kode beskrives ikke i det følg<strong>en</strong>de, m<strong>en</strong> der h<strong>en</strong>vises <strong>til</strong> d<strong>en</strong><br />

samlede kildekode bagerst i rapport<strong>en</strong> eller på vedlagte CD, hvor kildekod<strong>en</strong> for test-<br />

applikation<strong>en</strong> er forsøgt beskrevet så tydeligt som muligt. Ligeledes er der gjort meget ud af<br />

brug<strong>en</strong> af sig<strong>en</strong>ede variabler og konstanter for at gøre kod<strong>en</strong> letlæselig.<br />

Først g<strong>en</strong>nemgås g<strong>en</strong>erering<strong>en</strong> af blinkesignaler for datapanelt og derefter opsætning<strong>en</strong> af<br />

applett<strong>en</strong>s grafiske brugergrænseflade.<br />

4.3.1 Filer<br />

Applett<strong>en</strong>s brugergrænseflade er implem<strong>en</strong>teret i TestApplication.java, og DataPanel.java kan<br />

blinke med skærm<strong>en</strong>. Det hele vises på <strong>en</strong> statisk hjemmeside med index.html, og<br />

template.css placerer applett<strong>en</strong> det ønskede sted.<br />

Fil Beskrivelse<br />

TestApplication.java Applett<strong>en</strong> der indeholder selve brugergrænseflad<strong>en</strong> og d<strong>en</strong>s funktionalitet.<br />

DataPanel.java Det blink<strong>en</strong>de område på skærm<strong>en</strong>.<br />

index.html Hjemmesid<strong>en</strong> som viser Java-applett<strong>en</strong>.<br />

favicon.ico Ikon med Prevas' logo vises ved browser<strong>en</strong>s URL og som bogmærke.<br />

template.css Et stylesheet som håndterer placering<strong>en</strong> af applett<strong>en</strong> på hjemmesid<strong>en</strong>.<br />

4.3.2 Data-panel<br />

For bedst muligt at styre signalets høje og lave periode er det nødv<strong>en</strong>digt hele tid<strong>en</strong> at tjekke,<br />

hvor længe tråd<strong>en</strong> har v<strong>en</strong>tet. Sættes systemet <strong>til</strong> blot at v<strong>en</strong>te i <strong>en</strong> bestemt periode, løber<br />

tråd<strong>en</strong> let over tid<strong>en</strong>, og signalet bliver meget upræcist. Metod<strong>en</strong> herunder minimere dette<br />

problem betragteligt.<br />

private void dynamicDelay(int time) {<br />

long bitPeriod = System.curr<strong>en</strong>tTimeMillis();<br />

while((System.curr<strong>en</strong>tTimeMillis()-bitPeriod) < time) {<br />

try {<br />

Thread.sleep(1);<br />

} catch (InterruptedException e) {<br />

e.printStackTrace();<br />

}<br />

}<br />

}<br />

Tabel 2: Period<strong>en</strong> mellem de <strong>en</strong>kelte blink håndteres af dynamicDelay, der sætter tråd<strong>en</strong> <strong>til</strong> at v<strong>en</strong>te.<br />

Der forekommer dog alligevel mindre forsinkelser, hvilket kan have stor betydning for<br />

stabilitet<strong>en</strong> af datamodtagels<strong>en</strong> s<strong>en</strong>ereh<strong>en</strong>, og kalibrering<strong>en</strong> af systemet bliver ligeledes berørt<br />

af dette fænom<strong>en</strong>.<br />

Panelet blinker i debugmode – ellers står tråd<strong>en</strong> blot og v<strong>en</strong>ter. Hvis ikke d<strong>en</strong>ne v<strong>en</strong>tetid<br />

Test-applikation 23


håndteres vil system-ressurcerne for d<strong>en</strong> givne proces gå helt op i det røde felt. NB: Dette må<br />

siges at være noget af <strong>en</strong> sikkerhedsbrist ved Java-appletter, da d<strong>en</strong> vil kunne få <strong>en</strong> browser<br />

<strong>til</strong> at bruge 99% af CPU'<strong>en</strong>. Vha. et simpelt delay undgås dette som vist herunder.<br />

public void run() {<br />

while(true) { // forever...<br />

if(getMode() == "debugmode") { // test-application<br />

scre<strong>en</strong>Binary();<br />

} else { // to avoid CPU overload, system needs idle time<br />

dynamicDelay(50);<br />

}<br />

}<br />

}<br />

Tabel 3: Tråd<strong>en</strong> skal v<strong>en</strong>te i idlemode for ikke at belaste CPU'<strong>en</strong>.<br />

Hver gang bit-værdi<strong>en</strong> ændres, g<strong>en</strong>tegnes applett<strong>en</strong>. Værdi<strong>en</strong> fastsættes, og repaint kalder<br />

paint, hvor data-panelets baggrundsfarve ændres <strong>til</strong> d<strong>en</strong> givne værdi. Offscre<strong>en</strong>-buffer<br />

funktion<strong>en</strong> håndteres af paint. Metod<strong>en</strong> update ændres, så paint kaldes direkte ud<strong>en</strong> først at<br />

g<strong>en</strong>tegne baggrund<strong>en</strong>, som d<strong>en</strong> normalt vil gøre ind<strong>en</strong> noget nyt tegnes på skærm<strong>en</strong>.<br />

public void invalidate() { super.invalidate(); offscre<strong>en</strong> = null; }<br />

public void update(Graphics g) { paint(g); }<br />

public void paint(Graphics g) {<br />

Color highColor = new Color(getHighContrast(), getHighContrast(), getHighContrast());<br />

Color lowColor = new Color(getLowContrast(), getLowContrast(), getLowContrast());<br />

}<br />

if(offscre<strong>en</strong> == null) {<br />

offscre<strong>en</strong> = createImage(getSize().width, getSize().height);<br />

}<br />

Graphics offscre<strong>en</strong>Graphics = offscre<strong>en</strong>.getGraphics();<br />

offscre<strong>en</strong>Graphics.setClip(0, 0, getSize().width, getSize().height);<br />

super.paint(offscre<strong>en</strong>Graphics);<br />

if(getBit()) {<br />

offscre<strong>en</strong>Graphics.setColor(highColor);<br />

offscre<strong>en</strong>Graphics.fillRect(0, 0, getSize().width, getSize().height);<br />

} else {<br />

offscre<strong>en</strong>Graphics.setColor(lowColor);<br />

offscre<strong>en</strong>Graphics.fillRect(0, 0, getSize().width, getSize().height);<br />

}<br />

g.drawImage(offscre<strong>en</strong>, 0, 0, null);<br />

offscre<strong>en</strong>Graphics.dispose();<br />

4.3.3 Test-applikation<br />

Tabel 4: Håndtering<strong>en</strong> af offscre<strong>en</strong>-buffer<strong>en</strong> sker i paint(), der kaldes når <strong>en</strong> bit-værdi ændres.<br />

Applett<strong>en</strong> begynder med at afvikle init, hvor selve opsætning<strong>en</strong> af brugergrænseflad<strong>en</strong> finder<br />

sted. Det hele ordnes i <strong>en</strong> tråd, så applett<strong>en</strong> ikke fryser fast im<strong>en</strong>s.<br />

public void init() {<br />

try { // Set up the user interface<br />

javax.swing.SwingU<strong>til</strong>ities.invokeAndWait(new Runnable() {<br />

public void run() {<br />

createGUI();<br />

}<br />

});<br />

} catch (Exception e) { // an unknown error occurred<br />

System.err.println("createGUI() didn't successfully complete");<br />

}<br />

}<br />

Tabel 5: init() håndterer opsætning<strong>en</strong> af applett<strong>en</strong>s paneler, knapper mv.<br />

24 Test-applikation


Applett<strong>en</strong> er inddelt således, at nogle overordnede<br />

paneler indeholder andre paneler. Dette hjælper med <strong>til</strong><br />

at organisere knapper i blokke og blokke i sektioner,<br />

så det er forholdsvist let at rykke rund på grupper af<br />

knapper – eller slå dem <strong>til</strong> og fra som man ønsker.<br />

Applett<strong>en</strong> har <strong>en</strong> Container, hvor i panelerne er placeret<br />

(se illustration 17). Ind<strong>en</strong> i container<strong>en</strong> er placeret to<br />

paneler – én <strong>til</strong> at blinke med data (outputPanel) og én <strong>til</strong><br />

at tage imod input (controlPanel). D<strong>en</strong> første udgøres af<br />

et objekt af DataPanel-klass<strong>en</strong>, og d<strong>en</strong> and<strong>en</strong> indeholder<br />

paneler <strong>til</strong> at styre blinke-signalerne. S<strong>en</strong>ere vil der blive<br />

oprettet et userPanel, hvor bruger<strong>en</strong> kan kommunikere<br />

data <strong>til</strong> wavecardet via et tekstfelt og nogle knapper;<br />

m<strong>en</strong> ind<strong>til</strong> videre er der blot et debugPanel i controlPanel.<br />

debugPanel indeholder yderligere paneler med Swing-kompon<strong>en</strong>ter a la knapper, slidere, tekst-<br />

labels mm. Disse simple kompon<strong>en</strong>ter er placeret i paneler udelukk<strong>en</strong>de for at adskille dem i<br />

grupper. For <strong>en</strong> mere detaljeret g<strong>en</strong>nemgang af brugerinterfacets paneler h<strong>en</strong>vises <strong>til</strong><br />

kildekod<strong>en</strong> for metod<strong>en</strong> createGUI, hvor opsætning<strong>en</strong> af de <strong>en</strong>kelte paneler er inddelt i blokke<br />

af kode for at gør det mere overskueligt.<br />

Bruger<strong>en</strong>s handlinger registreres vha. Action- og ChangeList<strong>en</strong>ers. Her g<strong>en</strong>nemgås d<strong>en</strong><br />

overordnede idé med et eksempel på <strong>en</strong> List<strong>en</strong>er i debugPanel, der er føjet <strong>til</strong> <strong>en</strong> kompon<strong>en</strong>t<br />

som i eksemplet med dutycycleSlider herunder.<br />

periodSlider.addChangeList<strong>en</strong>er ( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setDutycycle(dutycycleSlider.getValue());<br />

dutycycleValueLabel.setText("ON-time:" + outputPanel.getDutyHigh() +<br />

"ms OFF-time:" + outputPanel.getDutyLow() + "ms");<br />

}<br />

} );<br />

Tabel 6: Handlinger ved ændring af dutycycleSlider.<br />

Til at lytte og reagere på kompon<strong>en</strong>ters hændelser b<strong>en</strong>yttes konstruktioner af anonyme indre<br />

klasser, hvorved implem<strong>en</strong>tering af de krævede metoder jf. d<strong>en</strong> pågæld<strong>en</strong>de List<strong>en</strong>ers<br />

interface undgås. Man bør dog være opmærksom på at de indre klasser ikke ligger inde i<br />

selve d<strong>en</strong> ydre klasse (TestApplication.java), m<strong>en</strong> indlæses hver for sig. Det tager længere tid,<br />

des flere klasser der skal indlæses, hvorfor eksempalvis større brugergrænseflader ikke bør<br />

b<strong>en</strong>ytte sig af d<strong>en</strong>ne metode. I stedet kan man lade d<strong>en</strong> ydre klasse implem<strong>en</strong>tere<br />

ChangeList<strong>en</strong>er, så kun <strong>en</strong> klasse indlæses, og derfor vises applett<strong>en</strong> hurtigere.<br />

De rester<strong>en</strong>de List<strong>en</strong>ers ligner d<strong>en</strong> forgå<strong>en</strong>de og vil ikke blive beskrevet yderligere her. Der<br />

h<strong>en</strong>vises <strong>til</strong> kildekod<strong>en</strong> bagerst i rapport<strong>en</strong> (bilag D.1.1) eller d<strong>en</strong> vedlagte DVD.<br />

Illustration 17: Panelers placering.<br />

Applett<strong>en</strong>s såkaldte look-and-feel ændres <strong>til</strong> udse<strong>en</strong>det for det operativsystem, som bruger<strong>en</strong><br />

anv<strong>en</strong>der, for at give bruger<strong>en</strong> <strong>en</strong> fornemmelse af at kunne g<strong>en</strong>k<strong>en</strong>de brugerinterfacet.<br />

Knapper, sliders, tekstfelter mv. vil fremstå som de, der som standard b<strong>en</strong>yttes af systemet.<br />

Test-applikation 25


private void createGUI() {<br />

...<br />

looks = UIManager.getInstalledLookAndFeels();<br />

changeLookAndFeel(SYSTEM_LAYOUT);<br />

}<br />

private void changeLookAndFeel(int value) {<br />

try {<br />

UIManager.setLookAndFeel(looks[value].getClassName());<br />

SwingU<strong>til</strong>ities.updateCompon<strong>en</strong>tTreeUI(this);<br />

} catch (Exception e) {<br />

e.printStackTrace();<br />

}<br />

}<br />

4.3.4 Hjemmeside<br />

Tabel 7: Brugerinterfacet får samme udse<strong>en</strong>de som bruger<strong>en</strong> er vant <strong>til</strong>.<br />

Hjemmeside-dokum<strong>en</strong>tet 11 har d<strong>en</strong> obligatoriske DOCTYPE, der fortæller browser<strong>en</strong>, hvilk<strong>en</strong><br />

dokum<strong>en</strong>tstandard HTML-fil<strong>en</strong> lever op <strong>til</strong> – i dette <strong>til</strong>fælde er der tale om XHTML 1.0 Strict.<br />

Derudover har dokum<strong>en</strong>tet d<strong>en</strong> sædvanlige struktur med <strong>en</strong> head- og body-sektion. I head er<br />

karaktersættet valgt <strong>til</strong> iso-8859-1 for vestlige bogstaver – og der linkes <strong>til</strong> stylesheet'et<br />

template.css (hvilket omtales i det efterfølg<strong>en</strong>de afsnit). Man ville muligvis let forfalde <strong>til</strong> blot at<br />

indsætte et <strong>en</strong>kelt applet-tag for at kalde Java-applett<strong>en</strong>. Dette er dog ikke h<strong>en</strong>sigtsmæssigt,<br />

da tag'et er under afvikling jf. W3C-standard<strong>en</strong> 12 og derfor ikke understøttes af d<strong>en</strong> valgte<br />

DOCTYPE. I stedet bør object-tags anv<strong>en</strong>des, og for at understøtte flere browser-typer må der<br />

lidt omdirigering <strong>til</strong> vha.


4.3.6 Systemafvikling<br />

Det <strong>en</strong>delige resultat af programmet ses i<br />

figur<strong>en</strong> <strong>til</strong> højre (illustration 18), hvor applett<strong>en</strong> er<br />

zoomet i forhold <strong>til</strong> selve browser-vinduet.<br />

Browser<strong>en</strong> er i full-scre<strong>en</strong>, og applett<strong>en</strong> vises<br />

nederst <strong>til</strong> højre. I forhold <strong>til</strong> prototyp<strong>en</strong><br />

(beskrevet under analys<strong>en</strong>) vises sliders<br />

vandret og ikke lodret. Desud<strong>en</strong> kan<br />

kontrast<strong>en</strong> justeres med <strong>en</strong>kelte klik eller ved at<br />

indtaste tallet direkte. I stedet for frekv<strong>en</strong>s<strong>en</strong> er<br />

det periodetid<strong>en</strong>, der ændres, da det giver<br />

større præcision i selve programmet. Derudover<br />

vises <strong>en</strong> statusmeddelelse med oplysninger om<br />

frekv<strong>en</strong>s, periodetid samt on- og off-tider for<br />

signalet. Det hvide område nederst i applett<strong>en</strong><br />

repræs<strong>en</strong>terer datapanelet.<br />

4.4 Test<br />

Ind<strong>en</strong> test<strong>en</strong> af applett<strong>en</strong> analyseres signalets karakteristika (se figur 19) vha. lys fra <strong>en</strong><br />

blink<strong>en</strong>de lysdiode. Der måles med et oscilloskop – først på outputtet af solcellern<strong>en</strong>, hvilket<br />

giver et pænt firkant-signal (A), som dog er ret lavt, m<strong>en</strong> trodst alt ligner inputtet. Efter at have<br />

haft signalet ig<strong>en</strong>nem et low-pass filter ses tydelige forandringer (B), der er et resultat af dets<br />

RC-led. Modstand<strong>en</strong>s størrelse og kond<strong>en</strong>sator<strong>en</strong>s tidskonstant afspejler hhv. stige- og<br />

faldetiderne. Efter <strong>en</strong> forstærkning af signalet bringes det op på et niveau, der er <strong>til</strong> at måle for<br />

<strong>microcontroller</strong><strong>en</strong> (C).<br />

Vha. test-applett<strong>en</strong> er der udført <strong>en</strong> række tests af hardware-prototyp<strong>en</strong> for at finde ud af,<br />

hvordan hardwar<strong>en</strong> opfører sig. Der foretages målinger på forskellige led i systemet, hvor der<br />

startes med det rå output fra solcellerne, hvorefter low-pass filteret monteres og <strong>til</strong> slut måles<br />

på det <strong>en</strong>delige signal fra forstærker<strong>en</strong>s udgang (det direkte input <strong>til</strong> <strong>microcontroller</strong><strong>en</strong>s ADC-<br />

indgang). Derudover undersøges signalernes grænseværdier.<br />

Illustration 18: En browser i full-scre<strong>en</strong> viser<br />

applett<strong>en</strong>.<br />

Illustration 19: Outputtet fra hhv. solcellerne, filtret og forstærker<strong>en</strong> ved belysning af <strong>en</strong> lysdiode.<br />

Test-applikation 27


Test<strong>en</strong> har <strong>til</strong> formål at verificere de pulser, som applett<strong>en</strong> uds<strong>en</strong>der via skærm<strong>en</strong> og samtidig<br />

teste de signaler, som hardwar<strong>en</strong> g<strong>en</strong>erer derudfra.<br />

Testsc<strong>en</strong>arie Forv<strong>en</strong>tet resultat Faktisk resultat<br />

Test-applett<strong>en</strong> sættes<br />

<strong>til</strong> at blinke med<br />

<strong>en</strong> frekv<strong>en</strong>s på<br />

2Hz@50% (altså to<br />

gange i sekundet<br />

med <strong>en</strong> duty-cycle<br />

på 50%). Hardwareprototyp<strong>en</strong><br />

placeres<br />

på <strong>en</strong> LCD-skærm<br />

og, der foretages<br />

målinger direkte på<br />

solcellerne.<br />

Signalet føres g<strong>en</strong>nemforstærkerkredsløbet,<br />

m<strong>en</strong><br />

ellers foretages ing<strong>en</strong><br />

ændringer.<br />

Der fremkommer et<br />

pulssignal, som minder<br />

om et firkantsignal.<br />

Herudfra vil signalets<br />

opførsel i forhold <strong>til</strong><br />

skærm<strong>en</strong> kunne<br />

analyseres.<br />

En højere spænding<br />

kan forv<strong>en</strong>tes som<br />

output.<br />

Der fremkommer<br />

et<br />

signal med<br />

<strong>en</strong> frekv<strong>en</strong>s<br />

på 2Hz,<br />

hvor de høje<br />

og lave perioder<br />

er ca.<br />

lige store. Ved første øjekast ser signalet<br />

næst<strong>en</strong> perfekt ud. Stigetid<strong>en</strong> ligger på<br />

omkring 18ms (aflæst øverst <strong>til</strong> højre i billedet)<br />

og faldetid<strong>en</strong> 29ms, hvilket skyldes skærm<strong>en</strong>s<br />

responstid. Spænding<strong>en</strong> mellem højt og lavt<br />

niveau (Pk-Pk) er på ca. 190mV.<br />

Et signal<br />

med <strong>en</strong><br />

peak-topeak<br />

på ca.<br />

3V<br />

g<strong>en</strong>ereres,<br />

og der er<br />

sket <strong>en</strong><br />

halvering af<br />

stigetid<strong>en</strong>, hvilket imidlertid ikke er positivt.<br />

Signalets amplitude vil blive større des mere<br />

lys, der er <strong>til</strong> stede, og på et tidspunkt vil<br />

forstærker<strong>en</strong> gå i mætning og simpelth<strong>en</strong><br />

klippe af signalet og give <strong>en</strong> konstant høj<br />

spænding, hvis solcellerne leverer et for kraftigt<br />

signal (ved for højt gain), hvilket er <strong>til</strong>fældet for<br />

signalet på figur<strong>en</strong>. Dette kan løses ved at<br />

ændre på antallet af solceller, skrue ned for<br />

forstærkning<strong>en</strong> eller dæmpe for lysstyrk<strong>en</strong> på<br />

skærm<strong>en</strong>. D<strong>en</strong> mest optimale løsning vil være<br />

<strong>en</strong> kombination af de to første, da ansvaret for<br />

hardwar<strong>en</strong> ikke bør ligge i bruger<strong>en</strong>s hænder.<br />

Der vises et tydeligere eksempel på dette<br />

under udvikling<strong>en</strong> af modtager<strong>en</strong>.<br />

28 Test-applikation


Lysstyrk<strong>en</strong> dæmpes<br />

– ellers holdes systemet<br />

uændret.<br />

Lysstyrk<strong>en</strong> holdes<br />

uændret jf. testsc<strong>en</strong>ariet<br />

ov<strong>en</strong>for.<br />

Low-pass filtret er<br />

sat på efter solcellerne<br />

og skulle<br />

dermed dæmpe de<br />

høje frekv<strong>en</strong>ser over<br />

30 Hz.<br />

Et par af solcellerne<br />

frakobles for at give<br />

pænere signaler.<br />

Nu placeres<br />

hardware-prototyp<strong>en</strong><br />

på <strong>en</strong> CRT-skærm,<br />

og der måles direkte<br />

på solcellerne. Testapplett<strong>en</strong><br />

slukkes,<br />

hvorfor d<strong>en</strong> kun<br />

uds<strong>en</strong>der et hvidt<br />

lyssignal.<br />

Test-applett<strong>en</strong> sættes<br />

<strong>til</strong> at blinke med<br />

<strong>en</strong> fast frekv<strong>en</strong>s.<br />

Signalet viser højfrekv<strong>en</strong>t<br />

støj.<br />

Signalets karakteristik<br />

burde være uændret i<br />

forhold <strong>til</strong> signalet fra<br />

første testsc<strong>en</strong>arie.<br />

Skærm<strong>en</strong>s<br />

karakteristika<br />

visualiseres.<br />

CRT-skærm<strong>en</strong>s fortolkning<br />

af et pulssignal<br />

vises på skopet.<br />

Der ses tydeligesignalforstyrrelser<br />

som skyldes<br />

baggrundslysets<br />

højfrekv<strong>en</strong>te<br />

PWM-signal.<br />

Der vil altså ikke kunne måles på skærme<br />

med dæmpet lysstyrke med sådanne signaler,<br />

hvorfor der må sættes et filter på før<br />

forstærkning<strong>en</strong>.<br />

Signalet minder<br />

om outputtet<br />

fra forstærker<strong>en</strong><br />

ind<strong>en</strong> dæmpning<strong>en</strong><br />

af lysstyrk<strong>en</strong>.<br />

Systemet er<br />

ikke længere følsomt overfor d<strong>en</strong> højfrekv<strong>en</strong>te<br />

støj fra skærm<strong>en</strong>, lysstofrør mv. Samtidig er<br />

<strong>microcontroller</strong><strong>en</strong> i stand <strong>til</strong> at måle signalets<br />

niveau.<br />

Der fremkommer<br />

et<br />

trekant-signal<br />

som vist i<br />

figur<strong>en</strong>. Man<br />

ser tydeligt<br />

hvordan signalet<br />

peaker i<br />

det øjeblik <strong>en</strong> elektron rammer det<br />

flouriser<strong>en</strong>de lag på glasplad<strong>en</strong> og efterglød<strong>en</strong>s<br />

langsomme aftag<strong>en</strong> – ind<strong>til</strong> <strong>en</strong>dnu <strong>en</strong> elektron<br />

rammer. Ved sort signal fremkommer blot <strong>en</strong><br />

vandret linje.<br />

Man ser tydeligtforskell<strong>en</strong><br />

mellem<br />

høje og lave<br />

signal. Antallet<br />

af peaks<br />

afhænger af<br />

d<strong>en</strong> frekv<strong>en</strong>s,<br />

hvormed der blinkes – des lavere hastighed<br />

des flere toppe på signalet. Det er dog svært<br />

at vurdere præcist hvornår, signalet går lavt.<br />

Test-applikation 29


5 Modtager<br />

Der er i det foregå<strong>en</strong>de udarbejdet et program <strong>til</strong> at g<strong>en</strong>erere systematiske blinkesignaler <strong>til</strong><br />

gavn for udvikling<strong>en</strong> af selve modtager<strong>en</strong>. Ind<strong>til</strong> videre er programmets g<strong>en</strong>erelle funktionalitet<br />

blevet beskrevet, og det hele har været set fra ov<strong>en</strong>. I dette afsnit inddeles systemet i<br />

delproblemer for bedre at kunne overskue diverse problems<strong>til</strong>linger. Ligeledes beskrives d<strong>en</strong><br />

måde, hvorpå wavecardets <strong>microcontroller</strong> modtager informationer fra <strong>en</strong> LCD-skærm. De<br />

fysiske udfordringer vil blive analyseret, og der kigges nærmere på udvikling<strong>en</strong> af <strong>en</strong><br />

overførselsprotokol – herunder datamodtagels<strong>en</strong>, dekodningsprocess<strong>en</strong> og fejlkontrol.<br />

5.1 Analyse<br />

Her præs<strong>en</strong>teres systemets <strong>en</strong>kelte delområder med udgangspunkt i skits<strong>en</strong> (illustration 21)<br />

herunder. D<strong>en</strong> viser det originale wavecard øverst <strong>til</strong> højre i figur<strong>en</strong> – og d<strong>en</strong>s nye anv<strong>en</strong>delse<br />

som modtager nederst <strong>til</strong> højre. Oprindeligt bestod wavecardet blot af <strong>en</strong> MCU, <strong>en</strong> piezo, nogle<br />

LEDs og et batteri. For at muliggøre datamodtagelse er der i d<strong>en</strong> nye version yderligere<br />

monteret et par<br />

solceller (bag på<br />

kortet) samt et<br />

filter og <strong>en</strong><br />

forstærker <strong>til</strong> at<br />

optimere de<br />

signaler, der<br />

s<strong>en</strong>des <strong>til</strong> MCU'<strong>en</strong>.<br />

En Java-applet<br />

udgør s<strong>en</strong>der<strong>en</strong><br />

(på samme måde<br />

som i test-<br />

applikation<strong>en</strong>), der<br />

for eksempel vises<br />

i <strong>en</strong> browser på <strong>en</strong> computerskærm. Data overføres, ved at s<strong>en</strong>der<strong>en</strong> lyser med skærm<strong>en</strong> på<br />

<strong>en</strong> bestemt måde, og modtager<strong>en</strong> opfanger lyset via solcellerne og s<strong>en</strong>der det <strong>til</strong> <strong>en</strong> ADC-<br />

indgang på <strong>microcontroller</strong><strong>en</strong>.<br />

Illustration 20: Skitse af systemets overordnede funktionalitet.<br />

Wavecardet v<strong>en</strong>des, så d<strong>en</strong>s LEDs peger ud mod bruger<strong>en</strong> og placeres foran applett<strong>en</strong> ov<strong>en</strong><br />

på computerskærm<strong>en</strong>s nederst kant (hvis det er muligt for d<strong>en</strong> pågæld<strong>en</strong>de skærmtype).<br />

Dette vil dog typisk ikke kunne lade sig gøre på de ældre CRT-skærme, hvor bruger<strong>en</strong> selv<br />

30 Modtager


må holde kortet eller midlertidigt sætte det fast med tape. Dermed er solcellerne placeret lige<br />

over applett<strong>en</strong>, så data kan opfanges, og wavecardet kan kommunikere status-informationer<br />

<strong>til</strong> bruger<strong>en</strong> via lysdioderne.<br />

5.1.1 Systemanv<strong>en</strong>delse<br />

Der er udtænkt <strong>en</strong> bestemt procedure (se illustration 21), som bruger<strong>en</strong> skal følge for at<br />

programmere kortet fra s<strong>en</strong>der<strong>en</strong> på skærm<strong>en</strong>. De mørke bobler indikerer bruger<strong>en</strong>s<br />

interaktivitet med s<strong>en</strong>der-applett<strong>en</strong>, og de hvide er bruger<strong>en</strong>s handlinger med selv wavecardet.<br />

Hele process<strong>en</strong> begynder med, at bruger<strong>en</strong> indtaster d<strong>en</strong> tekst, der ønskes overført <strong>til</strong><br />

wavecardet. Dernæst trykkes på <strong>en</strong> knap mærket for at uds<strong>en</strong>de g<strong>en</strong>tagne signaler<br />

om, at s<strong>en</strong>der<strong>en</strong> er klar <strong>til</strong> at programmere kortet. For at kortet kan opfatte s<strong>en</strong>der<strong>en</strong>s<br />

signaler, skal det på <strong>en</strong> eller and<strong>en</strong> måde aktiveres, hvilket kun kan ske vha. de signaler, som<br />

piezo<strong>en</strong> g<strong>en</strong>ererer ud fra rystelser. Dernæst placeres kortet på skærm<strong>en</strong> over de blink<strong>en</strong>de<br />

signaler. Når kortet opdager<br />

d<strong>en</strong> blink<strong>en</strong>de sekv<strong>en</strong>s,<br />

finder d<strong>en</strong> automatisk baud-<br />

rat<strong>en</strong> for dataoverførsl<strong>en</strong>,<br />

hvilk<strong>en</strong> indikeres ved at vise<br />

periodetid<strong>en</strong> for de blink<strong>en</strong>de<br />

sekv<strong>en</strong>ser med kortets<br />

lysdioder. Bruger<strong>en</strong> behøver<br />

ikke specifikt at vide, at dette<br />

netop er periodetid<strong>en</strong>, m<strong>en</strong><br />

skal blot samm<strong>en</strong>ligne<br />

lysdioderne med s<strong>en</strong>der<strong>en</strong>s<br />

illustration af period<strong>en</strong>, for at<br />

kontrollerer om der er over<strong>en</strong>sstemmelse. Opdages signalet ikke – eller er der ikke<br />

over<strong>en</strong>sstemmelse – må der være sket <strong>en</strong> fejl, så kortet rystes og placeres g<strong>en</strong>tagne gange,<br />

ind<strong>til</strong> signalet opfanges korrekt. Bruger<strong>en</strong> trykker på knapp<strong>en</strong> , og s<strong>en</strong>der<strong>en</strong><br />

overfører dermed data <strong>til</strong> modtager<strong>en</strong>, der indikerer modtagelse ved at blinke med lysdioderne.<br />

Ved fejl i overførsl<strong>en</strong> vises periodetid<strong>en</strong> på ny, og der kan blot trykkes <strong>en</strong>dnu <strong>en</strong>gang på<br />

for at forsøge ig<strong>en</strong>. Når modtagels<strong>en</strong> er færdig, indikeres dette overfor bruger<strong>en</strong><br />

med <strong>en</strong> bestemt sekv<strong>en</strong>s på lysdioderne – eksempelvis lyser de alle op, viser et løbelys eller<br />

lign<strong>en</strong>de. Bruger<strong>en</strong> fjerner kortet fra skærm<strong>en</strong> og tester det på sædvanligvis ved at ryste det i<br />

luft<strong>en</strong> og tjekker, om d<strong>en</strong> ønskede tekst vises. Er dette ikke <strong>til</strong>fældet begyndes forfra dog ud<strong>en</strong><br />

at indtaste tekst<strong>en</strong> på ny. Ellers er wavecardet nu færdig-programmeret.<br />

Systemet holdes så brugerv<strong>en</strong>ligt som muligt, ved at holde programmerings-procedur<strong>en</strong> på et<br />

absolut minimum og give interfacet et fåtal af knapper.<br />

Illustration 21: Aktivitetsdiagram for systemets anv<strong>en</strong>delse.<br />

Modtager 31


Ønskes <strong>en</strong> <strong>en</strong>dnu mere brugerv<strong>en</strong>lig <strong>til</strong>gang (se illustration 22), kan auto-baud funktionalitet<strong>en</strong><br />

erstattes med <strong>en</strong> på forhånd defineret baud-rate, som både s<strong>en</strong>der og modtager er <strong>en</strong>ige om,<br />

hvilket vil være d<strong>en</strong> sædvanlige procedure ved traditionelle serielle forbindelser. Man vil derved<br />

spare <strong>en</strong> del interaktivitet og dyrebar v<strong>en</strong>tetid<br />

væk, som ofte vil få bruger<strong>en</strong> <strong>til</strong> at blive<br />

utålmodig og dermed træt af systemet.<br />

knapp<strong>en</strong> vil kunne fjernes – så<br />

brug<strong>en</strong> nu blot skal indtaste d<strong>en</strong> ønskede<br />

tekst, aktivere kortet (ved at ryste det), placere<br />

det foran skærm<strong>en</strong> og trykke på .<br />

Wavecardet vil selv opdage, at <strong>en</strong> s<strong>en</strong>der<br />

forsøger at programmere det. Fejler process<strong>en</strong><br />

trykkes blot på <strong>en</strong>dnu <strong>en</strong>gang.<br />

Auto-baud funktionalitet<strong>en</strong> vil dog alligevel blive implem<strong>en</strong>teret – for det første for eksemplets<br />

skyld og for det andet er det <strong>en</strong> rar feature, der i fremtid<strong>en</strong> kan eksperim<strong>en</strong>teres yderligere<br />

med. Eksempelvis vil det på sigt være nyttigt af h<strong>en</strong>syn <strong>til</strong> bagud-kompatibilitet med ældre<br />

korttyper. Der kan evt. udvikles <strong>en</strong> metode <strong>til</strong> at gemme <strong>en</strong> detekteret baud-rate, der så<br />

bruges som standard, ind<strong>til</strong> man beslutter sig for at ændre d<strong>en</strong> ig<strong>en</strong>. Dette er blot <strong>en</strong> idé <strong>til</strong><br />

videreudvikling og ligger ud<strong>en</strong> for formålet med d<strong>en</strong>ne opgave.<br />

5.1.2 Dataoverførsel<br />

Efter at bruger<strong>en</strong> har trykket på eller (som vist ov<strong>en</strong>for), s<strong>en</strong>der<br />

skærm<strong>en</strong> <strong>en</strong> masse analoge signaler afsted. Figur 23 viser de stadier i dataoverførsl<strong>en</strong>, der<br />

Illustration 23: Indkapsling af data.<br />

skal arbejdes med fra aflæsning af<br />

skærm<strong>en</strong> <strong>til</strong> visning af d<strong>en</strong> overførte tekst.<br />

For at modtager<strong>en</strong> kan forstå signalerne,<br />

må de analyseres og digitaliseres. Det er<br />

derefter modtager<strong>en</strong>s opgave et få noget<br />

fornuftigt ud af de digitaliserede signaler<br />

ved at undersøge niveauerne og timing<strong>en</strong>. Derefter skal data dekodes og tjekkes for fejl – for<br />

<strong>til</strong> sidst at blive gemt og kunne visualiseres.<br />

5.1.2.1 Analog og digital signalbehandling<br />

Illustration 22: Simplificeret anv<strong>en</strong>delse.<br />

Skærm<strong>en</strong> uds<strong>en</strong>der data i form af lyssignaler, der opfanges af <strong>en</strong> lysfølsom s<strong>en</strong>sor, hvorefter<br />

de s<strong>en</strong>des <strong>til</strong> MCU'<strong>en</strong> for yderligere behandling, hvilket er illustreret i figur<strong>en</strong> (illustration 24).<br />

32 Modtager


Solcellerne modtager ikke kun lyset fra skærm<strong>en</strong>, m<strong>en</strong> forstyrres af andre lyskilder – som<br />

nævnt tidligere kommer selv skærm<strong>en</strong>s eget PWM-signal i vej<strong>en</strong>. Disse uønskede, højfrekv<strong>en</strong>te<br />

signaler sorteres fra med et low-pass filter og s<strong>en</strong>des <strong>til</strong> indgang<strong>en</strong> på <strong>en</strong> forstærker, for at<br />

booste max-spænding<strong>en</strong> fra omkring 100-200mV <strong>til</strong> 2-6V. Derefter ankommer signalerne <strong>til</strong> <strong>en</strong><br />

ADC på wavecardets MCU, hvor de analoge signaler digitaliseres og bearbejdes yderligere i<br />

det program, der tager hånd om datamodtagels<strong>en</strong>. Og det er netop, hvad der beskrives i de<br />

følg<strong>en</strong>de afsnit; m<strong>en</strong> først kigges der lidt nærmere på <strong>en</strong> karakteristik af det indkomne signal.<br />

Illustration 25: Detaljeret signal fra solcellerne.<br />

Illustration 26: Detaljeret signal efter filtrering.<br />

Illustration 24: Lyssignalet fra skærm<strong>en</strong> filtreres, forstærkes, digitaliseres og behandles.<br />

Vha. af et osscilloskop måles et analogt pulssignal<br />

fra solcellerne (se illustration 25), og det har <strong>en</strong><br />

karakteristik, der minder om et digitalt signal. I<br />

forhold <strong>til</strong> faldtid<strong>en</strong> har signalet <strong>en</strong> hurtig stigning på<br />

omkring 17ms (aflæst <strong>til</strong> højre i billedet) ved<br />

optimale lysforhold, hvor computerskærm<strong>en</strong>s<br />

baggrundslys ikke er dæmpet, og der ikke er<br />

kraftigt lys i rummet. Efter stigning<strong>en</strong> afrundes<br />

signalet roligt og viser <strong>en</strong> konstant vandret linje. Når<br />

signalet går lavt falder det hurtigt i start<strong>en</strong> og<br />

afrundes jf. skærm<strong>en</strong>s responstid. For de<br />

pågæld<strong>en</strong>de forhold tager det signalet ca. 26ms<br />

at falde <strong>til</strong> ro. Amplitud<strong>en</strong> er på ca. 160mV (jf.<br />

50mV pr. tern som vist nederst <strong>til</strong> v<strong>en</strong>stre i figur<strong>en</strong>).<br />

Low-pass filtret sorterer de høje frekv<strong>en</strong>ser fra<br />

lyset, som påvirker solcellerne og lader de lave<br />

frekv<strong>en</strong>ser slippe ig<strong>en</strong>nem. Her kan som sagt<br />

være tale om højfrekv<strong>en</strong>t lys fra lysstofrør og<br />

andre lyskilder, m<strong>en</strong> specielt fladskærme har det<br />

med at puls-bredde-modulere baggrundslyset, når<br />

bruger<strong>en</strong> sænker lysstyrk<strong>en</strong>. Illustration 26 viser et<br />

pulssignal fra <strong>en</strong> computerskærm, hvor baggrundslyset er dæmpet <strong>en</strong> del. Det ses tydeligt at<br />

filtrets RC-led (modstand<strong>en</strong> og kond<strong>en</strong>sator<strong>en</strong>) ikke påvirker signalets karakteristik<br />

nævneværdigt. Dog resulterer dæmpning<strong>en</strong> af baggrundslyset i <strong>en</strong> noget lavere amplitude, der<br />

Modtager 33


for dette signal når ned på omkring 80mV (jf. 20mV pr. tern), hvilket dog ikke i sig selv er et<br />

problem, da signalet forstærkes. Samm<strong>en</strong>lignes signalet med figur<strong>en</strong> for det optimale signal<br />

opdages <strong>en</strong> del støj (der er et resultat af et zoom på signalet), som naturligvis også vil blive<br />

forstærket og vil fylde <strong>en</strong> del i forhold <strong>til</strong> selve signalet. Dvs., at signalet kan blive svært at<br />

analysere, hvis skærm<strong>en</strong>s lysstyrke sænkes for meget, da MCU'<strong>en</strong> vil have svært ved at<br />

beregne signalets niveau. Ud fra analys<strong>en</strong> af outputtet fra solcellerne, ser det ud <strong>til</strong> at blive<br />

udfordr<strong>en</strong>de nok at detektere forskell<strong>en</strong> mellem signalets, i forvej<strong>en</strong> skæve, høje og lave<br />

niveauer. Overførsl<strong>en</strong> <strong>til</strong> wavecardet skal kunne foregå under forskellige forhold, og det vil blive<br />

svært at detektere flere niveauer med de nuvær<strong>en</strong>de solceller, så der vil arbejdes videre med<br />

idé<strong>en</strong> om at omdanne de analoge niveauer <strong>til</strong> digitale signaler. Dermed må overvejelser<br />

omkring overførsel af data parallelt (altså som gråtoner), se sig slået af simple skift mellem sort<br />

og hvid – hhv. højt og lavt niveau, for bedre at kunne detektere signalet. Dermed går man på<br />

sigt også på kompromis med overførselshastighed<strong>en</strong>, da skift mellem sort og hvid, som nævnt<br />

tidligere, tager længere tid for <strong>en</strong> fladskærm <strong>en</strong>d skift mellem gråtoner.<br />

Illustration 27: Analog <strong>til</strong> digital med level-trigger.<br />

For at detektere et skift mellem de to<br />

nuancer vil d<strong>en</strong> oplagte løsning være at<br />

analysere signalets værdier og give et bud<br />

på, hvornår det er over eller under <strong>en</strong> giv<strong>en</strong><br />

grænse (ofte 50%) af hhv. dets minimum-<br />

og maximum-niveau (se illustration 27).<br />

Figur<strong>en</strong>s stiplede linje er niveauet, hvor<br />

omkring det digitale signal skifter i <strong>en</strong>t<strong>en</strong> d<strong>en</strong><br />

<strong>en</strong>e eller and<strong>en</strong> retning jf. det analog signal.<br />

Der er nødt <strong>til</strong> at være <strong>en</strong> marg<strong>en</strong> (de prikkede linjer), som det analoge signale skal nå over,<br />

før der skiftes <strong>til</strong> højt niveau – eller nå under for et lavt niveau. Dette gøres for at undgå glitches<br />

(se illustration 28), hvor signalt vil hoppe op og ned nogle gange ind<strong>en</strong> et <strong>en</strong>deligt skift.<br />

De langsomme stige-/faldetider kommer dog <strong>til</strong> at volde <strong>en</strong><br />

del problemer for d<strong>en</strong> pågæld<strong>en</strong>de metode <strong>til</strong> at<br />

konvertere signalet. Eksempelvis vil et pulssignals høje og<br />

lave niveauer variere med nogle millisekunder i forhold <strong>til</strong><br />

hinand<strong>en</strong> alt afhængig af frekv<strong>en</strong>s<strong>en</strong>, hvormed der blinkes<br />

på skærm<strong>en</strong>. Ved høje frekv<strong>en</strong>ser når signalet ikke at<br />

falde helt ved skift fra højt <strong>til</strong> lavt og <strong>til</strong> højt niveau ig<strong>en</strong> (se<br />

illustration 29). Signalet skifter mellem MIN og MAX, m<strong>en</strong><br />

ved for høje frekv<strong>en</strong>ser når det simpelth<strong>en</strong> ikke helt ned<br />

på MIN (grundet filtrets tidskonstant og skærm<strong>en</strong>s<br />

responstid), ind<strong>en</strong> det ig<strong>en</strong> begynder at stige.<br />

Illustration 28: Eksempel på <strong>en</strong> glitch<br />

ved niveauskift.<br />

34 Modtager


I testafsnittet for sektion<strong>en</strong> om<br />

test-applett<strong>en</strong> viste det sig at<br />

forstærker<strong>en</strong>s nuvær<strong>en</strong>de<br />

opsætning desværre havde <strong>en</strong><br />

t<strong>en</strong>d<strong>en</strong>s <strong>til</strong> at gå i mætning, når<br />

solcellerne blev påvirket af for<br />

meget lys. Det fremgår af det<br />

øverste signal i illustration 30, hvordan forstærker<strong>en</strong> klipper topp<strong>en</strong> af signalet, hvilket resulterer<br />

i for høj on-tid og dermed for lav off-tid i forhold <strong>til</strong> det oprindelige signal. Stigning<strong>en</strong> har ikke<br />

d<strong>en</strong> sædvanlige bløde overgang <strong>til</strong> det høje niveau. Max-spænding<strong>en</strong> er med forstærkning<strong>en</strong><br />

Illustration 30: Forstærker<strong>en</strong> går i mætning.<br />

nu oppe på 4V (jf. 2V pr. tern) og svinger med <strong>en</strong><br />

peak-to-peak på ca. 3½V. Dette er illustreret med<br />

outputtet (se figur<strong>en</strong>s nederste signal) fra et lille<br />

hjemmelavet program <strong>til</strong> <strong>en</strong> <strong>microcontroller</strong>, som<br />

giver et digital signal ud fra et analogt (i dette <strong>til</strong>fælde<br />

figur<strong>en</strong>s øverste signal). Microcontroller<strong>en</strong>s inbyggede<br />

A/D-converter er på 10 bit, hvilket giver 1024<br />

niveauer (værdier fra 0-1023). Der trigges på et fald<br />

eller <strong>en</strong> stigning på 10% i stedet for d<strong>en</strong> ov<strong>en</strong>for<br />

beskrevne metode.<br />

Som nævnt i forbindelse med analys<strong>en</strong> af systemanv<strong>en</strong>dels<strong>en</strong> (afsnit 5.1.1) skal der defineres<br />

<strong>en</strong> periodetid, så systemet ved, hvornår det skal læse d<strong>en</strong> pågæld<strong>en</strong>de digitale værdi.<br />

Signalet aflæses evt. midt i period<strong>en</strong> som vist i<br />

illustration 31, så man er nog<strong>en</strong>lunde sikker på, at det<br />

har nået at skifte <strong>til</strong> d<strong>en</strong> aktuelle værdi. Da der ikke er<br />

noget kloksignal peger det i retning af asynkron seriel<br />

kommunikation 13 , hvor der må udvikles <strong>en</strong> overførsels<br />

protokol, som synkroniserer signalet løb<strong>en</strong>de. Hvis der<br />

blot synkroniseres på første bit, kan man eksempelvis<br />

ikke regne med at bit 100 netop aflæses som d<strong>en</strong>ne. Der kan være sket ind<strong>til</strong> flere<br />

forskydninger undervejs, så det i stedet er for eksempel bit 99 eller 103, der aflæses.<br />

5.1.2.2 Kodning<br />

De datablokke, som s<strong>en</strong>der<strong>en</strong> overfører, er kodet på <strong>en</strong> speciel måde for at sikre <strong>en</strong> eller flere<br />

aspekter – så som hurtig transmission, sikker transmission, fejlkontrol og lign<strong>en</strong>de. Da der ikke<br />

findes <strong>en</strong> gængs måde at kode data på <strong>til</strong> transmission via <strong>en</strong> skærm, vil der i designfas<strong>en</strong><br />

blive udviklet <strong>en</strong> hybrid mellem flere k<strong>en</strong>dte kodningsformer. Kod<strong>en</strong> skal <strong>til</strong>passes, så der kan<br />

overføres så mange forskellige tegn som muligt, for at sikre d<strong>en</strong> fremtidige udvikling for andre<br />

kortprojekter, som desværre ikke kan omtales yderligere her (jf. afsnit 2.2).<br />

13 Asynkron kommunikation: http://<strong>en</strong>.wikipedia.org/wiki/Asynchronous_communication<br />

Illustration 29: Ved høje frekv<strong>en</strong>ser når signalet ikke at falde helt.<br />

Illustration 31: Aflæsning af digitalt signal.<br />

Modtager 35


Ind<strong>en</strong> for emnet datakommunikation b<strong>en</strong>yttes begreberne kodning og dekodning – typisk<br />

anv<strong>en</strong>des deres <strong>en</strong>gelske varianter – hhv. <strong>en</strong>coding og decoding. En kode er ikke hemmelig i<br />

d<strong>en</strong>ne samm<strong>en</strong>hæng. Det er blot <strong>en</strong> måde at udtrykke data på, som var der tale om et andet<br />

sprog. Informationer omdannes simpelth<strong>en</strong> <strong>til</strong> <strong>en</strong> and<strong>en</strong> form – <strong>en</strong>t<strong>en</strong> fysisk eller repræs<strong>en</strong>tativt.<br />

Ved kodning omdannes data <strong>til</strong> symboler, der kan kommunikeres, og ved dekodning sker det<br />

modsatte. I modtager<strong>en</strong>s <strong>til</strong>fælde er det altså dekodningsprocess<strong>en</strong>, der er interessant. D<strong>en</strong><br />

sørger for, at de modtagne data omdannes <strong>til</strong> d<strong>en</strong> form, der passer <strong>til</strong> visning<strong>en</strong> af symboler<br />

på wavecardet.<br />

Karakterer repræs<strong>en</strong>teres vha. et skema som for eksempel <strong>en</strong> ASCII-tabel 14 , <strong>en</strong> Morse-kode 15 ,<br />

stregkoder á la Code128B 16 etc. Fordel<strong>en</strong> ved at d<strong>en</strong> første er d<strong>en</strong>, at de fleste<br />

computersystemer allerede har ASCII ”indbygget”. Implem<strong>en</strong>teres andre koder, vil man, typisk i<br />

programkod<strong>en</strong>, skulle oprette et skema som <strong>en</strong> oversigt over kodning<strong>en</strong> for hvert <strong>en</strong>kelt tegn,<br />

hvilket vil kræve væs<strong>en</strong>tlig plads på <strong>en</strong> microsontroller. De fleste embeddede systemer<br />

forsøges holdt så billige som muligt, og de har dermed begrænset lagerplads, da der ofte skal<br />

produceres et stort antal, hvorfor <strong>en</strong> besparelse på få c<strong>en</strong>ts vil have stor indflydelse. Der er<br />

derfor ikke råd <strong>til</strong> at spilde plads på lagerområder, meg<strong>en</strong> funktionalitet og I/O-b<strong>en</strong> på chipp<strong>en</strong>.<br />

Morse-kod<strong>en</strong> vil kunne overføre data hurtigere, da d<strong>en</strong> er direkte optimeret <strong>til</strong> <strong>dataoverførsel</strong> –<br />

og stregkoder vil typisk være udstyret med <strong>en</strong> effektiv fejlkontol. Der er dog også trade-offs<br />

ved brug af disse alternativer <strong>til</strong> ASCII. Morse har udover tal og store bogstaver også visse<br />

specielle tegn repræs<strong>en</strong>teret, m<strong>en</strong> man vil selv skulle opfinde koder for små bogstaver og<br />

yderligere specialtegn.<br />

Ved anv<strong>en</strong>delse af <strong>en</strong> af de anerk<strong>en</strong>dte stregkode-type, Code128, fylder hver karakter<br />

forholdsvist meget – 11 bit i forhold <strong>til</strong> de sædvanlige 8 bit. D<strong>en</strong> har dog <strong>en</strong> interessant<br />

beregning af checksum, hvor hver <strong>en</strong>kelt karakter vægtes i forhold <strong>til</strong> de andre og giver<br />

dermed større sikkerhed <strong>en</strong>d d<strong>en</strong> simpleste form for tjeksum-beregning 17 . Samtidig er d<strong>en</strong> ikke<br />

så beregningstung, som ved brug af CRC (<strong>en</strong>g. Cyclic Redundancy Check) 18 .<br />

5.1.2.3 Visualisering<br />

Wavecardet bruger kun syv LEDs <strong>til</strong> at vise <strong>en</strong> tekst i luft<strong>en</strong>. En karakter<br />

består af et kvadrat på 7x7 punkter, der <strong>en</strong>t<strong>en</strong> er tændt eller slukket (se<br />

illustration 32). For hver karakter vises <strong>en</strong> lodret linje af gang<strong>en</strong> (indikeret<br />

med d<strong>en</strong> grå ramme) – og når kortet rystes skiftes hurtigt mellem de<br />

lodrette kolonner, så øjet vil opfatte tekst<strong>en</strong>, som om d<strong>en</strong> står i luft<strong>en</strong>.<br />

Det kan blive vanskeligt at vise d<strong>en</strong> overførte tekst frit i luft<strong>en</strong>, da d<strong>en</strong><br />

14 ASCII-tabel: http://www.asciitable.com/<br />

15 Morse-kode: http://<strong>en</strong>.wikipedia.org/wiki/Morse_code<br />

16 Code128: http://www.barcodeisland.com/code128.phtml<br />

17 Simpel checksum: http://<strong>en</strong>.wikipedia.org/wiki/Checksum<br />

18 CRC: http://<strong>en</strong>.wikipedia.org/wiki/Cyclic_redundancy_check<br />

Illustration 32:<br />

Visning af tegn.<br />

36 Modtager


nuvær<strong>en</strong>de implem<strong>en</strong>tation af wavecardet ikke har <strong>en</strong> fast karaktertabel, der fortæller,<br />

hvordan hvert <strong>en</strong>kelt bogstav ser ud. I stedet er bogstaverne hard coded, hvilket på ing<strong>en</strong><br />

måde er særligt fleksibelt. Desud<strong>en</strong> er der ikke mere plads på wavecardet i sin nuvær<strong>en</strong>de<br />

form <strong>til</strong> at implem<strong>en</strong>tere <strong>en</strong> sådan tabel, hvilket vil kræve <strong>en</strong> del oprydning i kod<strong>en</strong> – og så kan<br />

man <strong>en</strong>dda ikke være sikker på, at der samtidig vil være plads <strong>til</strong> både kod<strong>en</strong> for<br />

<strong>dataoverførsel</strong> og visning af bogstaver.<br />

En nødløsning vil være at vise ASCII-kod<strong>en</strong> på lysdioderne for hver karakter, der er blevet<br />

overført via skærm<strong>en</strong>. Som test vil man kunne overføre bestemte karakterer og observere at<br />

de rigtige ASCII-værdier fremkommer på lysdioderne. Eksempelvis vil <strong>en</strong> overførelse af tekst<strong>en</strong><br />

”QqQqQq” vise hhv. ”01010001”, ”01110001” osv. på lysdioderne (jf. ASCII-tabell<strong>en</strong>), og dermed<br />

blinker kun bit 5 (start<strong>en</strong>de med bit 0 bagfra), hvilket vil være let at overskue. Ligeledes vil <strong>en</strong><br />

udskrift af d<strong>en</strong> variabel eller det område i hukommels<strong>en</strong>, hvor d<strong>en</strong> overførte tekst ligger, kunne<br />

dokum<strong>en</strong>tere påstand<strong>en</strong> om, at <strong>en</strong> giv<strong>en</strong> tekst blev overført korrekt.<br />

5.2 Design<br />

D<strong>en</strong> overordnede forståelse for de indkomne signaler er nu på plads. Der er ligeledes blevet<br />

lavet <strong>en</strong> grov skitse af de teknikker, der skal b<strong>en</strong>yttes <strong>til</strong> at kode data med, og der er blevet<br />

kigget lidt på visning<strong>en</strong> af det <strong>en</strong>delige resultat. D<strong>en</strong>ne del danner grundlag for<br />

implem<strong>en</strong>tation<strong>en</strong> af modtager<strong>en</strong>, hvor de <strong>en</strong>kelte delelem<strong>en</strong>ter af programmet bygges op.<br />

Først omdannes det analoge signal <strong>til</strong> <strong>en</strong> digital værdi, og der kigges nærmere på udvikling<strong>en</strong><br />

af <strong>en</strong> protokol <strong>til</strong> datatransmission via <strong>en</strong> skærm. For at styre begiv<strong>en</strong>hederne i<br />

overførselsprocess<strong>en</strong> udarbejdes <strong>til</strong>stande, som systemet kan befinde sig i undervejs.<br />

5.2.1 Aflæsning af signal<br />

MCU'<strong>en</strong> modtager som bek<strong>en</strong>dt datasignalet via <strong>en</strong> ADC-ingang, som ved et skift fra sort <strong>til</strong><br />

hvid på skærm<strong>en</strong> giver et<br />

signal, der ligner det på<br />

illustration 33. I<br />

baggrund<strong>en</strong> ses det rå<br />

signal, og ov<strong>en</strong> på det er<br />

vist, hvordan det skal<br />

fortolkes af programmet.<br />

Først midles signalet og<br />

derudfra foretages <strong>en</strong><br />

række målinger med<br />

faste mellemrum,<br />

hvorefter <strong>en</strong> ny værdi<br />

samm<strong>en</strong>holdes med <strong>en</strong><br />

tidligere aflæst værdi. Ved<br />

Illustration 33: Signalet midles og aflæses med faste mellemrum. Der<br />

foretages <strong>en</strong> vurdering af om niveauet er skiftet ind<strong>en</strong> for <strong>en</strong> marg<strong>en</strong>.<br />

Modtager 37


at indsætte et mellemrum mellem målingerne, omsættes værdierne <strong>til</strong> vinkler, så <strong>en</strong> stigning<br />

eller et fald let kan registreres. Der indsættes <strong>en</strong> definition for et stabilt signal, der udgør <strong>en</strong><br />

marg<strong>en</strong>, som signalet kan bevæge sig ind<strong>en</strong> for ud<strong>en</strong> at skifte d<strong>en</strong> digitale værdi. Kun hvis <strong>en</strong><br />

ny måling når at afvige meget fra <strong>en</strong> tidligere måling, registreres <strong>en</strong>t<strong>en</strong> <strong>en</strong> stigning eller et fald i<br />

signalet – og det virtuelle digitale signal skifter <strong>til</strong>stand.<br />

5.2.2 Overførselsprotokol<br />

I forbindelse med computernetværk har OSI-<br />

modell<strong>en</strong> 19 vist sig som <strong>en</strong> effektiv måde at<br />

analysere og arbejde med datakommunikation<br />

på, hvorfor der er forsøgt skabt overblik over<br />

dataoverførsl<strong>en</strong> <strong>til</strong> wavecardet med inspiration<br />

fra netop d<strong>en</strong>ne model. Illustration 34 viser <strong>en</strong><br />

protokol for, hvordan data er repræs<strong>en</strong>teret<br />

undervejs i transmissions-process<strong>en</strong>. Pil<strong>en</strong>e<br />

viser kommunikationsvej<strong>en</strong>, hvor der er tale<br />

om <strong>en</strong>vejskommunikation fra s<strong>en</strong>der <strong>til</strong><br />

modtager med hhv. <strong>en</strong> skærm og solceller<br />

som interface.<br />

Bruger<strong>en</strong> indtaster <strong>en</strong> tekst i s<strong>en</strong>der<strong>en</strong>s<br />

applikationslag (kaldet ”Tekst” i figur<strong>en</strong>), hvorefter d<strong>en</strong> kodes i laget ned<strong>en</strong>under. Data-blokke,<br />

der på modtager-sid<strong>en</strong> kan være både<br />

karakterer og kommandoer, repræs<strong>en</strong>teres<br />

vha. blink<strong>en</strong>de sekv<strong>en</strong>ser på skærm<strong>en</strong>.<br />

Solcellerne opfanger de blink<strong>en</strong>de sekv<strong>en</strong>ser,<br />

der læses som asynkron seriel-data (se<br />

illustration 35), da der som bek<strong>en</strong>dt ikke er noget kloksignal <strong>til</strong>rådighed. For hver data-byte<br />

synkroniseres signalet ved hver start-bit (logisk 1), og systemet gør sig klar <strong>til</strong> <strong>en</strong>dnu <strong>en</strong><br />

transaktion ved modtagelse af <strong>en</strong> stop-bit (logisk 0). Imellem de to kontrol-bits s<strong>en</strong>des 8 bit<br />

data – typisk med LSB (altså bit<br />

0) først. D<strong>en</strong>ne konfiguration<br />

kaldes 8N1 (otte databits, ing<strong>en</strong><br />

paritet og <strong>en</strong> <strong>en</strong>kelt stop-bit) og<br />

er d<strong>en</strong> mest almindelige ind<strong>en</strong> for asynkron seriel-kommunikation. Overførselshastighed<strong>en</strong><br />

beregnes ved at dividere bit-rat<strong>en</strong> med ti – jf. d<strong>en</strong> 10-bit lange data-byte – så med <strong>en</strong> bit-rate<br />

på eksempelvis 30bits/s vil der kunne overføres 3 bytes i sekundet.<br />

Efter modtagelse af <strong>en</strong> data-byte smides start- og stop-bits væk, og systemet skal bruge <strong>en</strong><br />

start-kommando for at kunne påbegynde datamodtagels<strong>en</strong>. Når d<strong>en</strong> opfanges gemmes de<br />

19 OSI-modell<strong>en</strong>: http://<strong>en</strong>.wikipedia.org/wiki/OSI_model<br />

Illustration 36: Data-bytes s<strong>en</strong>dt.<br />

Illustration 34: Lagdelt protokol.<br />

Illustration 35: Seriel-datas repræs<strong>en</strong>tation.<br />

38 Modtager


følg<strong>en</strong>de karakterer, som vist i illustration 36, ind<strong>til</strong> <strong>en</strong> stop-kommando detekteres. Første<br />

modtagne byte er <strong>en</strong> tjeksum-karakter (<strong>en</strong>g. checksum), der skal verificere, om data mellem<br />

<strong>en</strong> start- og stop-kommando overføres korrekt.<br />

5.2.3 Tilstandsmaskine<br />

Der opbygges <strong>en</strong> <strong>til</strong>standsmaskine som vist i figur 37. Cirklerne udgør de forskellige <strong>til</strong>stande<br />

(kaldet operationer), som systemet kan befinde sig i. Pil<strong>en</strong>e mellem cirklerne kaldes transitioner,<br />

og de viser, hvad der skal <strong>til</strong> for at skifte fra <strong>en</strong> operation <strong>til</strong> <strong>en</strong> and<strong>en</strong>.<br />

Ved aktivering af kortet nuls<strong>til</strong>les <strong>microcontroller</strong><strong>en</strong> i Reset og går direkte videre (”true” eller ”1”<br />

betyder ud<strong>en</strong> betingelse) <strong>til</strong> Normal. D<strong>en</strong>ne <strong>til</strong>stand repræs<strong>en</strong>terer wavecardets almindelige<br />

funktionalitet, hvor tekst vises i luft<strong>en</strong>, når kortet rystes. Wavecardet holdes ligeledes våg<strong>en</strong> ved<br />

at ryste det og går automatisk i dvale<br />

ved længere tids inaktivitet. Opdages<br />

et blinke-signal via kortets solceller<br />

skiftes <strong>til</strong> Signal, hvor kortet forsøger<br />

at detektere frekv<strong>en</strong>s<strong>en</strong> af det<br />

modtagne signal. Periodetid<strong>en</strong> for hhv.<br />

det høje og lave signal af hvert <strong>en</strong>kelt<br />

blink samm<strong>en</strong>lignes med hinand<strong>en</strong>,<br />

m<strong>en</strong> bliver disse på intet tidspunkt<br />

<strong>en</strong>s ind<strong>en</strong> <strong>en</strong> giv<strong>en</strong> time out, nuls<strong>til</strong>les<br />

systemet i Reset. Hvis de <strong>til</strong>g<strong>en</strong>gæld<br />

bliver <strong>en</strong>s, accepteres periodetid<strong>en</strong>,<br />

hvilket resulterer i et skift <strong>til</strong> Init, hvor<br />

systemet gøres klar <strong>til</strong><br />

datamodtagelse og går direkte <strong>til</strong><br />

Ready. Modtages <strong>en</strong> start-bit ind<strong>en</strong><br />

for <strong>en</strong> giv<strong>en</strong> periode, gøres systemet<br />

klar <strong>til</strong> at modtage <strong>en</strong> databyte i Data<br />

– ellers hoppes <strong>til</strong>bage <strong>til</strong> Reset. Når<br />

Illustration 37: Systemets <strong>til</strong>stande.<br />

der er modtaget <strong>en</strong> databyte og <strong>en</strong> efterfølg<strong>en</strong>de stop-bit, synkroniseres datamodtagels<strong>en</strong>, og<br />

systemet går i Mode. Modtages ikke <strong>en</strong> hel byte data eller <strong>en</strong> stop-bit ind<strong>en</strong> for <strong>en</strong> giv<strong>en</strong><br />

periode, s<strong>en</strong>des systemet <strong>til</strong>bage i Ready og v<strong>en</strong>ter på <strong>en</strong> ny start-bit eller time out.<br />

Modtager 39


5.2.4 Kommandoer<br />

I <strong>til</strong>standsmaskin<strong>en</strong> ov<strong>en</strong>for er Mode <strong>en</strong> form for virtuel<br />

operation. I første omgang er d<strong>en</strong> synonym med No-mode,<br />

(se illustration 38) der v<strong>en</strong>ter på at modtage <strong>en</strong> kommando. I<br />

<strong>til</strong>fælde af <strong>en</strong> start-kommando (start-byte) skiftes <strong>til</strong> Receive.<br />

Programmet kan udvides <strong>til</strong> at modtage flere kommandoer<br />

og derved skifte mellem forskellige modes. Når <strong>en</strong><br />

kommando er modtaget, v<strong>en</strong>der systemet automatisk <strong>til</strong>bage<br />

<strong>til</strong> Ready fra Mode (som vist tidligere), hvor der gøres klar <strong>til</strong><br />

modtagelse af flere data.<br />

I Receive v<strong>en</strong>tes på modtagelse af <strong>en</strong> stop-byte (synonymt<br />

med <strong>en</strong> stop-kommando). Efter <strong>en</strong> undersøgelse af<br />

tjeksumm<strong>en</strong> vurderes om datamodtagels<strong>en</strong> er foregået ud<strong>en</strong><br />

fejl. Er dette ikke <strong>til</strong>fældet sættes mode <strong>til</strong>bage <strong>til</strong> No-mode,<br />

og systemet går i Ready for at v<strong>en</strong>te på <strong>en</strong> ny kommando. Accepteres tjeksumm<strong>en</strong> derimod,<br />

afsluttes datatransmission<strong>en</strong>, og systemet går i Finish for at indikere korrekt datamodtagelse<br />

overfor bruger<strong>en</strong>. Derefter nuls<strong>til</strong>les systemet for at gøre klar <strong>til</strong> at vise d<strong>en</strong> overførte tekst.<br />

5.3 Implem<strong>en</strong>tering<br />

Kildekod<strong>en</strong> på vedlagte DVD er løb<strong>en</strong>de beskrevet undervejs i implem<strong>en</strong>teringsprocess<strong>en</strong>, og<br />

der er naturligvis anv<strong>en</strong>dt sig<strong>en</strong>de variabler for at øge læsev<strong>en</strong>lighed<strong>en</strong>. Der indledes med <strong>en</strong><br />

oversigt over de anv<strong>en</strong>dte filer, og efterfølg<strong>en</strong>de beskrives bearbejdels<strong>en</strong> af selve modtager<strong>en</strong>s<br />

funktionalitet.<br />

5.3.1 Filer<br />

Systemet er splittet op i flere filer for at gøre programmet mere overskueligt. Der anv<strong>en</strong>des<br />

header-filer på sædvanligvis for at gøre programfunktioner, #defines mv. <strong>til</strong>gængelige.<br />

Fil Beskrivelse<br />

main.c Hovedprogrammet som indeholder d<strong>en</strong> grundlægg<strong>en</strong>de funktionalitet.<br />

init.c Microcontroller<strong>en</strong>s grundlægg<strong>en</strong>de opsætning.<br />

init.h En simpel header-fil som gør init.c <strong>til</strong>gængelig.<br />

isr.c Håndtering af interrupts.<br />

picu<strong>til</strong>.c Samling af program-funktioner <strong>til</strong> udvikling af embeddede projekter.<br />

picu<strong>til</strong>.h Typiske systeminds<strong>til</strong>linger for embeddede projekter.<br />

Illustration 38: Kommandoer.<br />

40 Modtager


5.3.2 Opsætning<br />

Fundam<strong>en</strong>tet for afvikling<strong>en</strong> af programmet på <strong>microcontroller</strong><strong>en</strong> ligger i d<strong>en</strong>s opsætning.<br />

Systemet kører med <strong>en</strong> intern 8MHz clock og interrupts for Timer1, ADC og EEPROM<br />

aktiveres. Port A har flere analoge indgange, hvor port AN0 anv<strong>en</strong>des som indgang for<br />

hardware-prototyp<strong>en</strong>, og wavecardets syv lysdioder er <strong>til</strong>knyttet port B (bit 7 <strong>til</strong> 1). Der<br />

anv<strong>en</strong>des <strong>en</strong> 16-bit timer (Timer1), som programmet kan b<strong>en</strong>ytte <strong>til</strong> at tælle og v<strong>en</strong>te i <strong>en</strong><br />

bestemt periode ud<strong>en</strong> at fryse systemet ved polling 20 . Der arbejdes med <strong>en</strong> frekv<strong>en</strong>s på<br />

999,50Hz og dermed <strong>en</strong> bekvem periodetid på 0,001001 sekund (altså ligeomkring 1 ms). Se<br />

evt. flere detaljer i d<strong>en</strong> komm<strong>en</strong>terede kildekode for init.c (afsnit D) eller på vedlagte DVD.<br />

5.3.3 Interrupts<br />

Ved et hvert interrupt kaldes funktion<strong>en</strong> my_isr i fil<strong>en</strong> isr.c, hvor d<strong>en</strong> pågæld<strong>en</strong>de interrupt<br />

id<strong>en</strong>tificeres, og der reageres kun på <strong>en</strong> interrupt, hvis d<strong>en</strong> er aktiveret i fil<strong>en</strong> init.c. I interrupt-<br />

funktion<strong>en</strong> aflæses og analyseres de digitaliserede signaler fra ADC'<strong>en</strong>. Signalerne gemmes i<br />

<strong>en</strong> ring-buffer, der har længd<strong>en</strong> RAW_SIGNAL_BUFFER_LENGTH, og med mellemrum midles buffer<strong>en</strong>s<br />

indhold jf. SIGNAL_MEASURE_MS for bedre at kunne detektere siganlets niveau og dermed udglatte<br />

ev<strong>en</strong>tuelle fejl i ADC'<strong>en</strong>s målinger.<br />

De digitale signalers periodetid bearbejdes også i interrupt-funktion<strong>en</strong> under timer-interrupts. Her<br />

styres aflæsning<strong>en</strong> af de digitale værdier vha. virtual_clock, der beregnes ud fra d<strong>en</strong> fundne<br />

periodetid.<br />

5.3.4 Opbygning<br />

Programmet udføres i <strong>en</strong> forever-løkke (altså <strong>en</strong> u<strong>en</strong>delige løkke), som for hvert g<strong>en</strong>nemløb<br />

analyserer signalerne fra skærm<strong>en</strong> via hardware-prototyp<strong>en</strong>. Ligeledes styres programmets<br />

<strong>til</strong>stand med <strong>en</strong> almindelig <strong>til</strong>standsmaskine som beskrevet tidligere (i afsnit 5.2.3 og 5.2.4) og<br />

bruger<strong>en</strong> informeres om systemets <strong>til</strong>stand via de syv lysdioder.<br />

5.3.5 Datamodtagelse<br />

Beregning<strong>en</strong> af <strong>en</strong> tjeksum for de overførte data gøres forholdsvist ukompliceret, da der ikke<br />

er tale om kritiske data. Ved s<strong>en</strong>ere implem<strong>en</strong>tering af <strong>dataoverførsel</strong> <strong>til</strong> brug for andre<br />

kortprojekter bør der evt. kigges nærmere på beregning af <strong>en</strong> CRC, for at datamodtagels<strong>en</strong><br />

bliver mere pålidelig. I første omgang er der dog ikke behov for <strong>en</strong> så grundig og beregnings-<br />

tung algoritme.<br />

Microcontroller<strong>en</strong> har <strong>en</strong> ub<strong>en</strong>yttet EEPROM, som kan rumme <strong>en</strong> hel del data (256 bytes),<br />

hvor<strong>til</strong> overførsl<strong>en</strong> kan foregå. Dermed kan teksterne variere i længde ud<strong>en</strong> brug af dynamiske<br />

variabler, så man ikke risikerer at løbe ind i problemer med d<strong>en</strong> begrænsede hukommelse.<br />

20 Polling: http://<strong>en</strong>.wikipedia.org/wiki/Polling_(computer_sci<strong>en</strong>ce)<br />

Modtager 41


5.3.5.1 Tjeksum<br />

Data-blokk<strong>en</strong>e består som bek<strong>en</strong>dt af karakterer eller kommandoer. De er kodet jf. samme<br />

kodning som Code 128B, der svarer <strong>til</strong> ASCII, m<strong>en</strong> hvor de første 32 kontroltegn er fjernet.<br />

Dvs., at første tegn (på plads nul) er Space, hvilket giver i alt 96 karakterer med mulighed for<br />

kommandoer og egne tegn så som smilies og hjemmelavede symboler fra og med plads 96.<br />

Grund<strong>en</strong> <strong>til</strong> at tabell<strong>en</strong>s indhold flyttes, skyldes d<strong>en</strong> modulo-operation, som Code 128 anv<strong>en</strong>der<br />

<strong>til</strong> beregning af tjeksum, hvorved multiplikation med store tale undgås. Med <strong>en</strong> start-kommando<br />

(for nuvær<strong>en</strong>de ASCII-kode 96) gøres wavecardet klar <strong>til</strong> modtagelse af data. Tjeksumm<strong>en</strong><br />

beregnes ved at tage værdi<strong>en</strong> af start-kommando<strong>en</strong>, hvor<strong>til</strong> der lægges d<strong>en</strong> vægtede sum af<br />

hver <strong>en</strong>kelt karakter for <strong>til</strong> sidst at tage <strong>en</strong> modulo 96 af resultatet – hvor tallet svarer <strong>til</strong> start-<br />

kommando<strong>en</strong> eller rettere d<strong>en</strong> første karakter ud<strong>en</strong> for tabell<strong>en</strong>:<br />

I et eksempel på udregning af tjeksumm<strong>en</strong> for ordet ”Hej” vil man først tage start-kommando<strong>en</strong><br />

og lægge værdi<strong>en</strong> af føste karakter <strong>til</strong>, dernæst 2 gange værdi<strong>en</strong> af d<strong>en</strong> and<strong>en</strong> karakter og <strong>til</strong><br />

sidst 3 ganget med værdi<strong>en</strong> af tredje karkter. Stop-kommando<strong>en</strong> (i dette <strong>til</strong>fælde 97)<br />

medregnes ikke. Dette giver tallet 496, hvoraf man udfører <strong>en</strong> modulus-operation (altså finder<br />

rest<strong>en</strong> ved division) med tallet 96, hvilket giver, tjeksum-værdi<strong>en</strong>, 16. Udregning<strong>en</strong> ser altså<br />

således ud: Tjeksum =961⋅402⋅69 3⋅74mod 96=16<br />

En data-byte med tallet 16 er derfor indeholdt på ”Check”-plads<strong>en</strong> jf. figur 36 på side 38,<br />

hvorfor værdierne af de overførte bytes vil være: 96, 16, 40, 69, 74 og 97 for ordet ”Hej”.<br />

5.3.5.2 Lagring<br />

I <strong>microcontroller</strong><strong>en</strong> gemmes data i d<strong>en</strong>s<br />

interne EEPROM, der virtuelt er delt op i to<br />

blokke (kaldet banker – se illustration 39).<br />

Formålet med bankerne er at bevare gamle<br />

data ved modtagelse af nye, for at undgå<br />

at <strong>en</strong> ev<strong>en</strong>tuel fejl i dataoverførsl<strong>en</strong> resulterer i et ikke-funktionelt wavecard. Med <strong>en</strong> EEPROM-<br />

størrelse på 256 bytes (for PIC16F819) er der 128 bytes <strong>til</strong>rådighed per bank. De to første<br />

bytes i hver bank bruges dog <strong>til</strong> hhv. d<strong>en</strong> pågæld<strong>en</strong>de teksts længde samt tjeksum-byt<strong>en</strong>.<br />

Illustration<strong>en</strong> viser, at længd<strong>en</strong> af indholdet i bank 0 er på tre bytes efter check-byt<strong>en</strong> (aflæst<br />

på første plads i bank 0), hvilket betyder, at alt andet derefter ikke læses. Bank 1 er inaktiv,<br />

da d<strong>en</strong>nes første byte har værdi<strong>en</strong> 255 (FFh).<br />

5.4 Test<br />

Tjeksum =Kommando start ∑ i =1<br />

n<br />

i⋅Karakter i mod Kommando start<br />

Illustration 39: EEPROM-banker hvor Bank 0 er aktiv.<br />

Test af modtager<strong>en</strong> udføres med hjælp fra test-applett<strong>en</strong>, der følger et fast mønster, når d<strong>en</strong><br />

blinker med skiftevis højt (sort) og lavt (hvidt) signal, hvilket modtager<strong>en</strong> fortolker som hhv. 1 og<br />

42 Modtager


0. Første data-bit modtages efter <strong>en</strong> start-bit (et logisk 1-tal), hvorfor de følg<strong>en</strong>de bits modtages<br />

som 01010101B, hvilket læses bagfra, da LSB modtages først, så resultatet ved aflæsning af<br />

EEPROM'<strong>en</strong> bliver i virkelighed<strong>en</strong> 10101010B eller (AAH). Overførsl<strong>en</strong> afsluttes med <strong>en</strong> stop-bit<br />

(repræs<strong>en</strong>teret ved et logisk 0), og <strong>en</strong> ny transaktion påbegyndes med <strong>en</strong>dnu <strong>en</strong> start-bit osv.<br />

osv. Dette sc<strong>en</strong>arie b<strong>en</strong>yttes <strong>til</strong> at undersøge fejlrat<strong>en</strong> for modtager<strong>en</strong> ved at fylde EEPROM'<strong>en</strong><br />

med <strong>en</strong> masse 1'er og 0'er, hvorfor succeskriteriet er så mange AH-nibbles (1010B) i<br />

EEPROM'<strong>en</strong> som muligt. Efterfølg<strong>en</strong>de undersøges grænserne for automatisk detektering af<br />

signalets periodetid.<br />

Hvert af de følg<strong>en</strong>de testsc<strong>en</strong>arier afhænger af de forudgå<strong>en</strong>de, så de givne forhold og<br />

inds<strong>til</strong>linger er gæld<strong>en</strong>de, ind<strong>til</strong> andet beskrives.<br />

Testsc<strong>en</strong>arie Forv<strong>en</strong>tet resultat Faktisk resultat<br />

Modtager<strong>en</strong> modificeres<br />

<strong>til</strong> at kunne modtage<br />

data med <strong>en</strong> fast<br />

periodetid på 100ms.<br />

Yderligere sættes modtager<strong>en</strong><br />

<strong>til</strong> skrive de<br />

modtagne bits direkte i<br />

EEPROM'<strong>en</strong>.<br />

Test-applett<strong>en</strong> sættes <strong>til</strong><br />

at blinke med <strong>en</strong><br />

frekv<strong>en</strong>s på 5Hz@50%<br />

(<strong>en</strong> periode på 200ms),<br />

hvilket giver hhv. <strong>en</strong> on-<br />

og off-tid på 100ms,<br />

hvilket svarer <strong>til</strong><br />

periodetid<strong>en</strong> for hver bit.<br />

Efter nogle minutter<br />

standses forsøget.<br />

Det meste af<br />

EEPROM'<strong>en</strong> vil være<br />

fyldt med HEX-værdi<strong>en</strong><br />

A (1010B). Der vil<br />

muligvis være nogle fejl<br />

i modtagels<strong>en</strong>, der kan<br />

skyldes at applett<strong>en</strong><br />

”falder ud”, som<br />

skyldes mangl<strong>en</strong>de<br />

kalibrering.<br />

Modtager<strong>en</strong> opdager et blinkesignal og<br />

forsøger at detektere periodetid<strong>en</strong>.<br />

Tydelige fejl i blinkesignalet opdages med<br />

det blotte øje – og efter nærmere<br />

undersøgelse af styresystemets processer<br />

står det klart, at nogle programmer<br />

optager store mængder CPU-tid.<br />

Figur<strong>en</strong> viser styresystemets jobliste<br />

sorteret efter CPU-tid, og det fremgår<br />

tydeligt, hvad problemet skyldes – nemlig<br />

programmet Miro, der sluger store<br />

mængder ressourcer.<br />

Modtager 43


Efter at have afsluttet de<br />

kræv<strong>en</strong>de processer<br />

foretages <strong>en</strong>dnu et<br />

forsøg som beskrevet<br />

ov<strong>en</strong>for.<br />

Systemet sættes <strong>til</strong> at<br />

køre med periodetid på<br />

200ms.<br />

EEPROM'<strong>en</strong> fyldes<br />

med AH'er som<br />

beskrevet ov<strong>en</strong>for.<br />

Forekomst<strong>en</strong> af fejl<br />

reduceres i forhold <strong>til</strong><br />

d<strong>en</strong> tidligere test.<br />

Billedet viser EEPROM'<strong>en</strong>s 256 bytes<br />

(2048 bits) fyldt op med 1'er og 0'er<br />

repræs<strong>en</strong>teret som HEX-værdier. Fejlrat<strong>en</strong><br />

er illustreret med de grå felter:<br />

Tæller man efter, er der fejl i 13 af de 256<br />

bytes, hvilket giver <strong>en</strong> fejlrate på 1 hver<br />

157-158 bits.<br />

Der optræder kun <strong>en</strong> <strong>en</strong>kelt fejl, m<strong>en</strong><br />

<strong>til</strong>g<strong>en</strong>gæld tager det lang tid at fylde<br />

EEPROM'<strong>en</strong> op. En beregning viser, at<br />

dette vil tage mere <strong>en</strong>d 8½ minut (10 bits x<br />

200 ms x 256 bytes). Selvom det ikke er<br />

nødv<strong>en</strong>digt at fylde hele lageret under<br />

normalt brug, giver det alligevel <strong>en</strong> idé om,<br />

hvor langsomt det går. En overførsel af 15<br />

karakterer er måske et mere håndgribeligt<br />

eksempel; hvilket vil tage et halvt minut (10<br />

bits x 200 ms x 15 karakterer).<br />

Noget kan tyde på at Java-appletter ikke<br />

er beregnet <strong>til</strong> at stå og blinke mange<br />

gange i sekundet. Double-buffer<strong>en</strong> har <strong>en</strong><br />

betydelig virkning på opdatering<strong>en</strong> af<br />

datapanelet, m<strong>en</strong> d<strong>en</strong> er dog ikke i stand<br />

<strong>til</strong> at udrette mirakler. For at udvikle <strong>en</strong><br />

mere stabil s<strong>en</strong>der er man nødsaget <strong>til</strong> at<br />

gå på kompromis med d<strong>en</strong> dynamik, der<br />

ligger i brug<strong>en</strong> af Java-appletter for at<br />

opnå dybere adgang <strong>til</strong> grafikkortet.<br />

Desud<strong>en</strong> kan et real-time system<br />

anbefales, hvilket Java bestemt ikke er i<br />

stand <strong>til</strong> at levere, da programmerne kører<br />

i <strong>en</strong> virtuel maskine med <strong>en</strong> masse<br />

sideløb<strong>en</strong>de processer så som garbage<br />

collection.<br />

Styresystemets processer får hver 10 ms<br />

CPU-tid af gang<strong>en</strong>, hvilket gør, at<br />

systemet i hvert fald ikke i fremtid<strong>en</strong> kan<br />

køre hurtigere <strong>en</strong>d d<strong>en</strong>ne hastighed.<br />

44 Modtager


Modificering<strong>en</strong> af<br />

kildekod<strong>en</strong> ændres<br />

<strong>til</strong>bage <strong>til</strong> sin oprindelige<br />

form, for at kunne teste<br />

d<strong>en</strong> automatiske<br />

detektering af<br />

periodetid<strong>en</strong>.<br />

Test-applett<strong>en</strong> startes<br />

med <strong>en</strong> on/off-tid på<br />

50ms. Modtager<strong>en</strong>s<br />

lysdioder aflæses, når<br />

periodetid<strong>en</strong> er fundet,<br />

hvorefter samme test<br />

udføres nogle gange.<br />

Test-applett<strong>en</strong> sættes<br />

g<strong>en</strong>tag<strong>en</strong>de gange <strong>til</strong> <strong>en</strong><br />

on/off-tid på 40 ms, og<br />

modtager<strong>en</strong>s lysdioder<br />

aflæses.<br />

Test-applett<strong>en</strong> sættes<br />

g<strong>en</strong>tag<strong>en</strong>de gange <strong>til</strong> <strong>en</strong><br />

on/off-tid på 30 ms, og<br />

modtager<strong>en</strong>s lysdioder<br />

aflæses.<br />

Test-applett<strong>en</strong> sættes<br />

g<strong>en</strong>tag<strong>en</strong>de gange <strong>til</strong> <strong>en</strong><br />

on/off-tid på 20 ms, og<br />

modtager<strong>en</strong>s lysdioder<br />

aflæses.<br />

Test-applikation<strong>en</strong><br />

sættes <strong>til</strong> at blinke med<br />

<strong>en</strong> periodetid på 30ms.<br />

Der måles på outputtet<br />

fra hardware-prototyp<strong>en</strong><br />

(d<strong>en</strong> analoge indgang)<br />

samt på <strong>en</strong> port (RA7),<br />

hvor værdi<strong>en</strong> af<br />

variabl<strong>en</strong> digital_value<br />

(<strong>microcontroller</strong><strong>en</strong>s<br />

fortolkning af det<br />

analoge signal) <strong>til</strong>skrives.<br />

Modtager<strong>en</strong>s lysdioder<br />

viser periodetid<strong>en</strong>.<br />

Modtager<strong>en</strong>s lysdioder<br />

viser periodetid<strong>en</strong>.<br />

Modtager<strong>en</strong>s lysdioder<br />

viser periodetid<strong>en</strong>.<br />

Modtager<strong>en</strong>s lysdioder<br />

viser periodetid<strong>en</strong>.<br />

Forholdet mellem de<br />

analoge og digitale<br />

signaler kan<br />

samm<strong>en</strong>lignes for d<strong>en</strong><br />

givne periodetid. Der<br />

forv<strong>en</strong>tes <strong>en</strong> fin<br />

sammanhæng mellem<br />

det analoge og digitale<br />

signal.<br />

Lysdioderne viser g<strong>en</strong>tagne gange<br />

0110010B (50D), hvilket svarer <strong>til</strong> d<strong>en</strong><br />

ønskede periodetid.<br />

Lysdioderne viser g<strong>en</strong>tagne gange<br />

0101000B (40D), hvilket svarer <strong>til</strong> d<strong>en</strong><br />

ønskede periodetid.<br />

Lysdioderne viser g<strong>en</strong>tagne gange<br />

0011110B (30D), hvilket svarer <strong>til</strong> d<strong>en</strong><br />

ønskede periodetid.<br />

Modtager<strong>en</strong> har besvær med at detektere<br />

periodetid<strong>en</strong>, hvilket vil sige, at græns<strong>en</strong><br />

for aflæsning med d<strong>en</strong> nuvær<strong>en</strong>de<br />

konfiguration ligger omkring <strong>en</strong> periodetid<br />

på 30 ms. Dette betyder ikke<br />

nødv<strong>en</strong>digvis, at systemet kan overføre<br />

data jf. d<strong>en</strong>ne hastighed, m<strong>en</strong> viser blot<br />

græns<strong>en</strong> for aflæsning<strong>en</strong> af skærm<strong>en</strong><br />

med d<strong>en</strong> nuvær<strong>en</strong>de hardware og<br />

opsætning.<br />

Det lykkedes<br />

langt h<strong>en</strong> ad<br />

vej<strong>en</strong> at<br />

aflæse et<br />

korrekt signal.<br />

Dog<br />

fremgår det<br />

tydeligt, at<br />

signalet har svært ved at nå helt op på<br />

MAX og helt ned på MIN (som forklaret i<br />

afsnit 5.1.2.1) ved hvert skift i niveau på<br />

skærm<strong>en</strong>.<br />

Modtager 45


Modtager<strong>en</strong> sættes <strong>til</strong> at<br />

modtage data med <strong>en</strong><br />

fast periodetid på 40ms,<br />

og test-applett<strong>en</strong><br />

inds<strong>til</strong>les <strong>til</strong>svar<strong>en</strong>de. Ig<strong>en</strong><br />

måles på outputtet fra<br />

hardware-prototyp<strong>en</strong><br />

samt debug-port<strong>en</strong><br />

(RA7).<br />

Test-applet og modtager<br />

ændres ig<strong>en</strong> – nu <strong>til</strong> at<br />

overføre data med <strong>en</strong><br />

50ms periodetid og<br />

samme målinger<br />

foretages.<br />

Periodetid<strong>en</strong> på 50ms<br />

bibeholdes og ig<strong>en</strong><br />

sættes modtager<strong>en</strong> <strong>til</strong> at<br />

skrive de modtagne bits<br />

direkte i EEPROM'<strong>en</strong>.<br />

Der vil muligvis ikke<br />

forekomme voldsomme<br />

problemer mht.<br />

aflæsning af det<br />

g<strong>en</strong>ererede digitale<br />

signal. Dog forv<strong>en</strong>tes<br />

stadig inkonsist<strong>en</strong>te<br />

perioder for det digitale<br />

signals.<br />

Der forekommer flere<br />

fejl <strong>en</strong>d ved forsøg med<br />

<strong>en</strong> periodetid på 100<br />

ms.<br />

Modtager<strong>en</strong><br />

kan bedre<br />

analysere<br />

de lidt<br />

længere<br />

perioder, og<br />

d<strong>en</strong> kan<br />

derfor g<strong>en</strong>erere<br />

et pænere digitalt signal. Der er dog<br />

stadig uregelmæssigheder, som gør, at<br />

det analoge signal ikke når helt i top eller<br />

bund for hver periode.<br />

Testapplett<strong>en</strong><br />

uds<strong>en</strong>der<br />

et analogt<br />

signal hvorudframodtager<strong>en</strong><br />

g<strong>en</strong>ererer<br />

<strong>en</strong> velpro-portioneret digital udgave. Kigger<br />

man på billedet, ses det, hvor på det<br />

analoge signal der trigges. Når der vises<br />

<strong>en</strong> hvid farve i test-applikation<strong>en</strong>, giver det<br />

et logisk 0 – og <strong>til</strong>svar<strong>en</strong>de giver <strong>en</strong> sort<br />

farve et logisk 1-tal.<br />

Resultatet viser ret tydeligt at <strong>en</strong> halvering<br />

af periodetid<strong>en</strong> resulterer i <strong>en</strong> fordobling af<br />

antallet af fejl:<br />

Dette kan sandsynligvis forhindres med <strong>en</strong><br />

kalibrering af systemet ved at justere de<br />

<strong>en</strong>kelte parametre (#defines) øverst i<br />

kildekod<strong>en</strong>.<br />

46 Modtager


Periodetid<strong>en</strong> forbliver<br />

uændret, og modtager<strong>en</strong><br />

kalibreres ved at<br />

justere følg<strong>en</strong>de parametre<br />

i hhv. main.c og<br />

isr.c:<br />

MEAN_SIGNAL_OFFSET_VALUE,<br />

SIGNAL_TRIGGER_LEVEL_PCT,<br />

PERIOD_READ_DIVIDER,<br />

RAW_SIGNAL_BUFFER_LENGTH,<br />

samt SIGNAL_MEASURE_MS.<br />

Efterfølg<strong>en</strong>de afvikles<br />

programmet på <strong>microcontroller</strong><strong>en</strong>,<br />

og efter et<br />

par minutter aflæses<br />

EEPROM'<strong>en</strong>. Alt dette<br />

gøres nogle gange ind<strong>til</strong>,<br />

der er opnået et<br />

<strong>til</strong>fredss<strong>til</strong>l<strong>en</strong>de resultat.<br />

Antallet af AH'er i<br />

EEPROM'<strong>en</strong> varierer fra<br />

gang <strong>til</strong> gang. Slutresultatet<br />

bliver bedre<br />

<strong>en</strong>d ved forrige test.<br />

Det lykkedes at reducere fejlrat<strong>en</strong><br />

betydeligt efter kalibrering af modtager<strong>en</strong>.<br />

Tests viser, at d<strong>en</strong> kan komme ned i<br />

omegn<strong>en</strong> af otte fejl, som vist i figur<strong>en</strong>,<br />

hvilket cirka giver <strong>en</strong> fejl i 1:256 gange.<br />

D<strong>en</strong>ne konfiguration ser således ud – med<br />

to solceller aktiveret:<br />

MEAN_SIGNAL_OFFSET_VALUE = 15<br />

SIGNAL_TRIGGER_LEVEL_PCT = 5<br />

PERIOD_READ_DIVIDER = 2<br />

RAW_SIGNAL_BUFFER_LENGTH = 3<br />

SIGNAL_MEASURE_MS = 10<br />

Systemet kan muligvis kalibreres <strong>en</strong><br />

anelse bedre, m<strong>en</strong> flimr<strong>en</strong> fra skærm<strong>en</strong><br />

gør procedur<strong>en</strong> besværlig og<br />

usystematisk. Desud<strong>en</strong> lever de<br />

nuvær<strong>en</strong>de inds<strong>til</strong>lingerne op <strong>til</strong> at kunne<br />

besvise mulighed<strong>en</strong> for <strong>dataoverførsel</strong> via<br />

<strong>en</strong> computerskærm med <strong>en</strong> nog<strong>en</strong>lunde<br />

hastighed.<br />

Modtager 47


6 S<strong>en</strong>der<br />

Test-applikation<strong>en</strong> viste sig nyttig i forbindelse med udarbejdelse af modtager<strong>en</strong>, og d<strong>en</strong> vil i<br />

det følg<strong>en</strong>de blive modificeret, så der kan indtastes og overføres <strong>en</strong> tekst <strong>til</strong> wavecardet.<br />

6.1 Analyse<br />

Brugerinterfacet kommer <strong>til</strong> at ligne test-<br />

applikation<strong>en</strong>s (se illustration 40), og d<strong>en</strong><br />

placeres samme sted på hjemmesid<strong>en</strong> (nederst<br />

i højre hjørne) som vist tidligere. Der er ikke<br />

behov for at implem<strong>en</strong>tere meget andet <strong>en</strong>d<br />

bruger<strong>en</strong>s mulighed for at kommunikere <strong>en</strong><br />

giv<strong>en</strong> tekst videre <strong>til</strong> modtager<strong>en</strong>, hvorfor der<br />

skal være et <strong>en</strong>kelt tekstfelt samt nogle<br />

knapper <strong>til</strong> at påbegynde transaktion<strong>en</strong>.<br />

Tekst<strong>en</strong> skal blot kodes jf. datamodtagels<strong>en</strong> på<br />

modtager<strong>en</strong> (se afsnit 5.3.5) og transmittere<br />

resultatet via skærm<strong>en</strong> – på stort set samme<br />

måde som test-applet<strong>en</strong> (afsnit 4) blinkede med<br />

skærm<strong>en</strong>.<br />

Selve programmet er på samme måde som tidligere bygget op omkring <strong>en</strong> applet (figur<strong>en</strong>s<br />

største kasse med runde hjørner) med et datapanel (d<strong>en</strong> lidt mindre kasse med runde hjørner).<br />

Herover, i et panel for sig selv, placeres et tekstfelt samt de tidligere omtalte knapper <br />

og jf. afsnittet om systemets anv<strong>en</strong>delse (afsnit 5.1.1). Test-applikation<strong>en</strong>s<br />

rester<strong>en</strong>de funktionalitet er gemt af vej<strong>en</strong> for at forvirre bruger<strong>en</strong> mindst muligt; og man kan<br />

overveje mulighed<strong>en</strong> for hurtigt at h<strong>en</strong>te dem frem ig<strong>en</strong> med <strong>en</strong> parameter i URL'<strong>en</strong><br />

(browser<strong>en</strong>s adressefelt) <strong>til</strong> brug for videreudvikling af systemet.<br />

Illustration 40: Prototype for s<strong>en</strong>der<strong>en</strong>.<br />

48 S<strong>en</strong>der


6.2 Design<br />

Der ændres ikke voldsomt på programmets struktur i forhold <strong>til</strong> test-applikation<strong>en</strong>. Dog<br />

erstattes HTML-fil<strong>en</strong> af <strong>en</strong> PHP-fil blot for at kunne frembringe test-applikation<strong>en</strong>s funktionalitet<br />

ud<strong>en</strong> at skulle have to forskellige udgaver af programmet ligg<strong>en</strong>de. Ud over <strong>en</strong> mindre<br />

<strong>til</strong>pasning af applet<strong>en</strong> er det kun kodning<strong>en</strong> af data og selve overførselsprocess<strong>en</strong>, der<br />

bearbejdes yderligere.<br />

Cirklerne i illustration 41 viser de data-blokke,<br />

der omsættes <strong>til</strong> blink<strong>en</strong>de sekv<strong>en</strong>ser på<br />

skærm<strong>en</strong>, når der trykkes på . Som<br />

bek<strong>en</strong>dt s<strong>en</strong>des først <strong>en</strong> start-byte efterfulgt af<br />

d<strong>en</strong> beregnede tjeksum og alt afhængig af<br />

antallet af karakterer s<strong>en</strong>des <strong>en</strong> databyte af<br />

gang<strong>en</strong>, og der afsluttes med <strong>en</strong> stop-byte<br />

(nøjagtigt som beskrevet i afsnit 5.2.2 på side<br />

38).<br />

Farv<strong>en</strong>uancerne i figur<strong>en</strong> er et eksempel på de<br />

sekv<strong>en</strong>ser, som datapanelet blinker med. De repræs<strong>en</strong>terer hver <strong>en</strong>kelt bit i overførsl<strong>en</strong> af <strong>en</strong><br />

start-byte. Imellem hvert skift v<strong>en</strong>tes i <strong>en</strong> periode, så d<strong>en</strong> pågæld<strong>en</strong>de farve vises på<br />

skærm<strong>en</strong> i et fast tidsrum. Der vises <strong>en</strong>t<strong>en</strong> sort (logisk 1) eller hvid (logisk 0) på skærm<strong>en</strong> i <strong>en</strong><br />

periode svar<strong>en</strong>de <strong>til</strong> periodetid<strong>en</strong>. En start-bit repræs<strong>en</strong>teres med <strong>en</strong> sort sekv<strong>en</strong>s, hvorpå der<br />

følger 8 bit data og afslutningsvis vises <strong>en</strong> hvid sekv<strong>en</strong>s som stop-bit. Det samme gør sig<br />

gæld<strong>en</strong>de for de rester<strong>en</strong>de bytes, hvor nuancerne for repræs<strong>en</strong>tation<strong>en</strong> af data dog varierer.<br />

Knapp<strong>en</strong> viser blot skift<strong>en</strong>de sekv<strong>en</strong>ser af sort og hvid med <strong>en</strong> fast v<strong>en</strong>tetid mellem<br />

hvert skift. I testfas<strong>en</strong> (afsnit 6.4) vurderes d<strong>en</strong> maksimale overførselshastighed ved at finde<br />

d<strong>en</strong> korteste periodetid for <strong>en</strong> stabil overførsel.<br />

Illustration 41: Kodning og <strong>dataoverførsel</strong>.<br />

S<strong>en</strong>der 49


6.3 Implem<strong>en</strong>tering<br />

Som vist i designet er der tale om <strong>en</strong> meget fast sekv<strong>en</strong>tiel struktur af, måd<strong>en</strong> data overføres<br />

på. Der er ikke nog<strong>en</strong> dynamik i form af <strong>til</strong>bagemelding fra modtager<strong>en</strong>, da der som bek<strong>en</strong>dt<br />

er tale om <strong>en</strong>vejskommunikation. Det gælder simpelth<strong>en</strong> om, at s<strong>en</strong>der og modtager skal<br />

være <strong>en</strong>ige om struktur<strong>en</strong> for overførsl<strong>en</strong> samt opsætning<strong>en</strong> af kodning<strong>en</strong>. De følg<strong>en</strong>de<br />

underafsnit beskriver og viser de vigtigste kodestumper i forbindelse med udvikling<strong>en</strong> af<br />

s<strong>en</strong>der<strong>en</strong>. For yderligere detaljer h<strong>en</strong>vises <strong>til</strong> d<strong>en</strong> samlede kildekode bagerst i rapport<strong>en</strong> (afsnit<br />

D) eller på vedlagte DVD.<br />

6.3.1 Filer<br />

Samm<strong>en</strong>lignet med test-applikation<strong>en</strong> er fil<strong>en</strong> TestApplication.java skiftet ud med<br />

Transmitter.java og index.html er erstattet af index.php. Desud<strong>en</strong> er DataPanel.java blevet<br />

opdateret, og debug.html sørger for, at hele applikation<strong>en</strong> kan afvikles fra d<strong>en</strong> vedlagte DVD.<br />

Fil Beskrivelse<br />

Transmitter.java Applett<strong>en</strong> der indeholder hele brugergrænseflad<strong>en</strong> og d<strong>en</strong>nes funktionalitet.<br />

DataPanel.java Det blink<strong>en</strong>de dataområde på skærm<strong>en</strong>.<br />

index.php<br />

debug.html<br />

favicon.ico<br />

Dynamisk hjemmeside som <strong>en</strong>t<strong>en</strong> viser s<strong>en</strong>der-applett<strong>en</strong> eller hele<br />

programmet på <strong>en</strong> gang. Her<strong>til</strong> kræves <strong>en</strong> server med PHP installeret.<br />

Viser både test- og s<strong>en</strong>der-applet som <strong>en</strong> statisk hjemmeside, så hele<br />

programmet kan afvikles ud<strong>en</strong> brug af <strong>en</strong> webserver med PHP.<br />

Et ikon med Prevas' logo der vises ved sid<strong>en</strong> af URL'<strong>en</strong> og gemmes som<br />

bogmærke.<br />

template.css Et stylesheet som håndterer placering<strong>en</strong> af applett<strong>en</strong> på hjemmesid<strong>en</strong>.<br />

6.3.2 Data-panel (version 2)<br />

Start-bits repræs<strong>en</strong>teres som logisk 1 og <strong>en</strong> stop-bits som det modsatte – logisk 0. ASCII-<br />

tabell<strong>en</strong> flyttes 32 tegn ned, hvilket svare <strong>til</strong> karakter<strong>en</strong> for Space (' '), der også b<strong>en</strong>yttes <strong>til</strong> at<br />

”skifte” mellem de logiske blokke for små og store bogstaver i ASCII-tabell<strong>en</strong>. Start- og stop-<br />

bytes sættes <strong>til</strong> hhv. første og and<strong>en</strong> karakter efter tabell<strong>en</strong>, så de svarer <strong>til</strong> modtager<strong>en</strong>s<br />

konfiguration (afsnit 5.3.5 på side 41).<br />

Applett<strong>en</strong> kan gå i forskellige modes, hvor debugmode udfører test-applikation<strong>en</strong>s funktionalitet; et<br />

tryk på knapp<strong>en</strong> sætter programmet i detectmode, ligesom knapp<strong>en</strong><br />

sætter programmet i programmode. Ved d<strong>en</strong> sidste låses systemet dog først, så påvirkninger<br />

ved tryk på andre knapper ikke registreres og dermed ødelægger transaktion<strong>en</strong>. Derefter<br />

bliver data-panelet clearet i <strong>en</strong> periode svar<strong>en</strong>de <strong>til</strong> <strong>en</strong> byte data, for at modtager<strong>en</strong> kan<br />

detekterer start-byt<strong>en</strong>. Når transaktion<strong>en</strong> er færdig låses systemet op ig<strong>en</strong> og v<strong>en</strong>der <strong>til</strong>bage <strong>til</strong><br />

50 S<strong>en</strong>der


udgangspunktet (idlemode).<br />

Detect-signalet blinker med højt og lavt niveau, der begge holdes i <strong>en</strong> fastlagt periode. Det<br />

fungerer stortset på samme måde som ved test-applett<strong>en</strong>.<br />

Ved programmering overføres data-signalerne som illustreret i designet (afsnit 6.2). Først<br />

beregnes tjeksumm<strong>en</strong>, hvorefter de <strong>en</strong>kelte bytes vises på skærm<strong>en</strong> <strong>en</strong> karakter af gang<strong>en</strong>.<br />

Figur<strong>en</strong> herunder viser d<strong>en</strong> sekv<strong>en</strong>tielle struktur i kod<strong>en</strong>.<br />

private void programMode() {<br />

char checksum = calculateChecksum(getText()); // calculate checksum<br />

transmit(START_BYTE); // s<strong>en</strong>d start byte<br />

transmit(checksum); // s<strong>en</strong>d checksum byte<br />

for(int i=0; i < getText().l<strong>en</strong>gth(); i++) // loop characters<br />

transmit((char)((getText().charAt(i)) – ASCII_OFFSET)); // - and s<strong>en</strong>d data<br />

transmit(STOP_BYTE); // s<strong>en</strong>d stop byte<br />

} // programMode<br />

Tabel 8: Struktur<strong>en</strong> for dataoverførsl<strong>en</strong>.<br />

Tjeksumm<strong>en</strong>, for d<strong>en</strong> tekst der skal overføres, beregnes på sædvanlig vis (jf. afsnit 5.3.5.1,<br />

side 42).<br />

private char calculateChecksum(String text) {<br />

int sum = START_BYTE;<br />

for(int i=1; i = 0; i--) {<br />

if(binary.charAt(i) == '0')<br />

setBit(false);<br />

else<br />

setBit(true);<br />

}<br />

dynamicDelay(getPeriod());<br />

// s<strong>en</strong>d stop bit<br />

setBit(STOP_BIT);<br />

dynamicDelay(getPeriod());<br />

} // transmit<br />

Tabel 10: Repræs<strong>en</strong>tation af data på skærm<strong>en</strong>.<br />

S<strong>en</strong>der 51


6.3.3 Dynamisk hjemmeside<br />

S<strong>en</strong>der<strong>en</strong> 21 implem<strong>en</strong>teres på <strong>en</strong> dynamisk hjemmeside, så det er muligt hurtigt at slå test-<br />

funktionaliteterne <strong>til</strong> og fra. I <strong>en</strong> fremtidig udgave kan man evt. justere applett<strong>en</strong> automatisk i<br />

forhold <strong>til</strong> skærmopløsning<strong>en</strong> ved brug af et par linjer JavaScript, så datapanelet opnår samme<br />

størrelse som wavecardet.<br />

6.3.4 Systemafvikling<br />

Illustration 42 viser to browser-vinduer med<br />

hver sin udgave af s<strong>en</strong>der-applikation<strong>en</strong>.<br />

Bagerste vindue viser udgav<strong>en</strong> med test-<br />

miljøet, der giver mulighed for både at<br />

anv<strong>en</strong>de test-funktionaliteterne <strong>til</strong> udvikling af<br />

nye hard- og software prototyper samt d<strong>en</strong><br />

ordinære s<strong>en</strong>der med tekstfeltet og de<br />

<strong>til</strong>hør<strong>en</strong>de knapper.<br />

Det forreste vindue viser d<strong>en</strong> s<strong>til</strong>r<strong>en</strong>e<br />

s<strong>en</strong>der-applikation <strong>til</strong>egnet slutbruger<strong>en</strong>. D<strong>en</strong><br />

fremstår <strong>en</strong>kel, og der skulle ikke være så<br />

meget at tage fejl af. På selve hjemmesid<strong>en</strong><br />

kan brug<strong>en</strong> evt. informeres om systemets<br />

anv<strong>en</strong>delse – så som hvilke knapper der<br />

skal trykkes på, og hvordan browser<strong>en</strong><br />

sættes i full-scre<strong>en</strong> mv.<br />

6.4 Test<br />

Formålet med dette afsnit er at teste det samlede system og udforske grænserne for de<br />

forhold, modager<strong>en</strong> bedst fungerer under i samspil med s<strong>en</strong>der<strong>en</strong>. Først g<strong>en</strong>nemgås<br />

bruger<strong>en</strong>s interaktion med både s<strong>en</strong>der og modtager – og derefter undersøges modtager<strong>en</strong>s<br />

stabilitet og performance. Som ved tidligere tests afhænger de <strong>en</strong>kelte testsc<strong>en</strong>arie af<br />

hinand<strong>en</strong>, hvilket betyder, at test<strong>en</strong> er et samlet forløb, hvor et givet testsc<strong>en</strong>arie afhænger af<br />

de forudgå<strong>en</strong>de.<br />

21 S<strong>en</strong>der med simpelt brugerinterface: http://micromedia.dk/wavecard/ eller http://micromedia.dk/wavecard/index.php og<br />

med test-funktioner: http://micromedia.dk/wavecard/index.php?debug<br />

Illustration 42: S<strong>en</strong>der – hhv. med og ud<strong>en</strong> debugger.<br />

52 S<strong>en</strong>der


Testsc<strong>en</strong>arie Forv<strong>en</strong>tet resultat Faktisk resultat<br />

Modtager<strong>en</strong> aktiveres.<br />

Der anv<strong>en</strong>des<br />

<strong>en</strong> LCD-skærm.<br />

Der indtastes <strong>en</strong><br />

tekst (”Greetings”) i<br />

s<strong>en</strong>derns tekstfelt,<br />

og der trykkes på<br />

knapp<strong>en</strong> .<br />

S<strong>en</strong>der<strong>en</strong>s<br />

datapanel begynder<br />

at blinke med hhv.<br />

højt og lavt signal.<br />

knapp<strong>en</strong><br />

trykkes ig<strong>en</strong>, og<br />

s<strong>en</strong>der<strong>en</strong> holder op<br />

med at blinke.<br />

Endnu <strong>en</strong>gang<br />

trykkes på .<br />

Efter at have fundet<br />

periodetid<strong>en</strong> v<strong>en</strong>tes<br />

<strong>en</strong> rum tid m<strong>en</strong>s<br />

s<strong>en</strong>der<strong>en</strong> stadig<br />

blinker.<br />

M<strong>en</strong>s datapanelet<br />

stadig blinker (hvilket<br />

dog ikke er et krav)<br />

trykkes nu på<br />

.<br />

Modtager<strong>en</strong> går i<br />

normal-<strong>til</strong>stand. D<strong>en</strong><br />

lyser med alle sine<br />

lysdioder og indikerer<br />

dermed, at d<strong>en</strong> ikke<br />

indeholder data.<br />

Modtager<strong>en</strong> indikerer,<br />

at d<strong>en</strong> forsøger at<br />

finde periodetid<strong>en</strong> ved<br />

at blinke med hhv. <strong>en</strong><br />

af to lysdioder. Når<br />

periodetid<strong>en</strong> er fundet<br />

vises 110010B (50D ms)<br />

på lysdioderne, hvilket<br />

svarer <strong>til</strong> d<strong>en</strong><br />

periodetid s<strong>en</strong>der<strong>en</strong> er<br />

inds<strong>til</strong>let <strong>til</strong>.<br />

Efter <strong>en</strong> rum tid (jf.<br />

modtager<strong>en</strong>s variabel<br />

TIMEOUT) går<br />

modtager<strong>en</strong> <strong>til</strong>bage i<br />

normal-<strong>til</strong>stand.<br />

Modtager<strong>en</strong> forsøger<br />

<strong>en</strong>dnu <strong>en</strong>gang at finde<br />

periodetid<strong>en</strong>, og<br />

indikerer dette på<br />

lysdioderne.<br />

Modtager<strong>en</strong> forbliver i<br />

samme <strong>til</strong>stand og<br />

v<strong>en</strong>ter på at modtage<br />

<strong>en</strong> start-kommando.<br />

Lysdioderne begynder<br />

at blinke med<br />

periodetid<strong>en</strong>. Bagefter<br />

indikeres om<br />

modtagels<strong>en</strong> lykkedes.<br />

Lysdiod<strong>en</strong> viser konstant 1111111B.<br />

Modtager<strong>en</strong> blinker med hhv. 0000001B og<br />

0000010B. Der går nogle sekunder, ind<strong>en</strong><br />

modtager<strong>en</strong> finder <strong>en</strong> mulig periodetid angivet<br />

ved 0101000B (40D ms), hvilk<strong>en</strong> desværre er<br />

forkert.<br />

Lysdioderne viser 1111111B, og indikerer<br />

dermed, at d<strong>en</strong> er <strong>til</strong>bage i normal-<strong>til</strong>stand.<br />

Lysdioderne indikerer ig<strong>en</strong>, at d<strong>en</strong> forsøger at<br />

finde periodetid<strong>en</strong> ved at blinke med hhv.<br />

0000001B og 0000010B. Af og <strong>til</strong> går<br />

modtager<strong>en</strong> kortvarigt <strong>til</strong>bage i normal-<strong>til</strong>stand<br />

(jf. variabl<strong>en</strong> TIMEOUT), m<strong>en</strong> søgning<strong>en</strong> efter<br />

periodetid<strong>en</strong> g<strong>en</strong>optages hurtigt.<br />

Lysdioderne viser d<strong>en</strong> ønskede periodetid –<br />

0110010B (50D ms ).<br />

Lysdioderne viser uændret 0110010B (50D).<br />

Modtager<strong>en</strong>s lysdioder blinker med hhv.<br />

0110010 (periodetid<strong>en</strong>) og 1001101 (d<strong>en</strong><br />

inverterede periodetid).<br />

Efter nogle sekunder vises periodetid<strong>en</strong> ig<strong>en</strong>,<br />

og modtager<strong>en</strong> indikerer dermed, at<br />

datamodtagels<strong>en</strong> ikke var vellykket.<br />

S<strong>en</strong>der 53


M<strong>en</strong>s modtager<strong>en</strong><br />

stadig viser<br />

periodetid<strong>en</strong> trykkes<br />

<strong>en</strong>dnu <strong>en</strong>gang på<br />

.<br />

Modtager<strong>en</strong> er<br />

<strong>til</strong>bage i normal<strong>til</strong>stand.<br />

Der indtastes <strong>en</strong> ny<br />

tekst (”Happy<br />

Val<strong>en</strong>tine's”) og<br />

trykkes på .<br />

Når d<strong>en</strong> rigtige<br />

periodetid er fundet<br />

trykkes på<br />

.<br />

Ig<strong>en</strong> blinker<br />

lysdioderne med<br />

periodetid<strong>en</strong> og viser<br />

derefter om data blev<br />

modtaget korrekt.<br />

Lysdioderne blinker<br />

med indholdet af det<br />

dataområde, som<br />

netop er blevet<br />

<strong>til</strong>skrevet d<strong>en</strong> overførte<br />

tekst.<br />

Modtager<strong>en</strong> viser, at<br />

d<strong>en</strong> forsøger at finde<br />

periodetid<strong>en</strong> som<br />

beskrevet tidligere.<br />

D<strong>en</strong> fundne periodetid<br />

vises og blinkes under<br />

dataoverførsl<strong>en</strong>.<br />

Ved korrekt<br />

modtagelse vises et<br />

løbelys og<br />

efterfølg<strong>en</strong>de vises d<strong>en</strong><br />

nye tekst på<br />

lysdioderne.<br />

Under datamodtagels<strong>en</strong> blinker lysdioderne<br />

atter med hhv. periodetid<strong>en</strong> og d<strong>en</strong> inverterede<br />

periodetid.<br />

Efterfølg<strong>en</strong>de viser modtager<strong>en</strong> et hurtigt<br />

løbelys, der bekræfter korrekt datamodtagelse.<br />

Kigger man nøje efter, viser lysdioderne ig<strong>en</strong><br />

og ig<strong>en</strong> de <strong>en</strong>kelte karakters ASCII-værdi for<br />

d<strong>en</strong> overførte tekst: G (1000111B = 47H), r<br />

(1110010B = 72H), e (1100101B = 65H), e<br />

(1100101B = 65H), t (1110100B = 74H), i<br />

(1101001B = 69H), n (1101110B = 6EH), g<br />

(1100111B = 67H) og s (1110011B = 73H). De<br />

binære tal angiver, hvad lysdioderne viser – og<br />

de hexadecimale kan ses i EEPROM'<strong>en</strong>:<br />

Første byte i EEPTOM'<strong>en</strong> er som bek<strong>en</strong>dt<br />

længd<strong>en</strong> af tekst<strong>en</strong> – altså tallet 9.<br />

Andet tal er d<strong>en</strong> overførte tjeksum-karakter, M<br />

(4DH).<br />

Modtager<strong>en</strong> er nogle sekunder om at<br />

registrere periodetid<strong>en</strong>. Efter at have fundet<br />

d<strong>en</strong> forsøges data overført nogle gange, før<br />

det lykkedes. Der skal muligvis <strong>en</strong> del<br />

kalibrering mere <strong>til</strong> for at undgår disse<br />

v<strong>en</strong>tetider.<br />

Kigger man efter i EEPROM'<strong>en</strong>, har<br />

modtager<strong>en</strong> registreret d<strong>en</strong> nye tekst og gjort<br />

d<strong>en</strong> aktiv ved at angive d<strong>en</strong>s længde (11H =<br />

17D karakterer). D<strong>en</strong> gamle teksts længde er<br />

sat <strong>til</strong> FFH, hvilket gør d<strong>en</strong> inaktiv:<br />

54 S<strong>en</strong>der


Baggrundslyset på<br />

skærm<strong>en</strong> sænkes<br />

så meget som<br />

muligt, og dermed<br />

mindskes amplitud<strong>en</strong><br />

for det signal<br />

<strong>microcontroller</strong><strong>en</strong><br />

skal behandle.<br />

Modtager<strong>en</strong> ændres<br />

ig<strong>en</strong>, så der skrives<br />

A'er (1010B) overalt i<br />

EEPROM'<strong>en</strong>.<br />

Der trykkes på<br />

-knapp<strong>en</strong>,<br />

så applett<strong>en</strong> blinker<br />

med <strong>en</strong> periode på<br />

50ms.<br />

Der skrues nu op på<br />

halv kontrast og<br />

<strong>en</strong>dnu et forsøg<br />

foretages som det<br />

ov<strong>en</strong>for.<br />

Skærmbilledet bliver<br />

gråligt. Muligvis vil<br />

systemet skulle<br />

justeres for at kunne<br />

registrere de svage<br />

signaler.<br />

Resultatet burde blive<br />

<strong>en</strong> hel del bedre <strong>en</strong>d<br />

tidligere.<br />

Allerede ind<strong>en</strong> der trykkes på ,<br />

begynder <strong>microcontroller</strong><strong>en</strong> at søge efter<br />

periodetid<strong>en</strong>. Variabl<strong>en</strong> PROGRAMMER_MODE_TICKS<br />

(antallet af blink ind<strong>en</strong> der søges efter<br />

periodetid<strong>en</strong>) ændres fra værdi<strong>en</strong> 3 <strong>til</strong> 4.<br />

Efter <strong>en</strong>dnu et forsøg v<strong>en</strong>ter <strong>microcontroller</strong><strong>en</strong><br />

med at søge efter periodetid<strong>en</strong> ind<strong>til</strong> der<br />

trykkes på . Dog ser indholdet af<br />

EEPROM'<strong>en</strong> katastrofalt ud.<br />

Hardware-prototyp<strong>en</strong> er så følsom, at d<strong>en</strong> kan<br />

påvirkes blot ved at bevæge <strong>en</strong> hånd 8-10 cm<br />

h<strong>en</strong> i nærhed<strong>en</strong> af d<strong>en</strong>.<br />

Der opstår i omegn<strong>en</strong> af 17 fejl, hvilket må<br />

betragtes som et udmærket resultat taget d<strong>en</strong><br />

noget ustabile hardware i betragtning.<br />

S<strong>en</strong>der 55


7 Udvidelser<br />

Udviklingsafdeling<strong>en</strong> bag de forskellige plastickort-projekter så som wavecardet åbner nye<br />

muligheder for måd<strong>en</strong> at samm<strong>en</strong>sætte forskellige teknologier på. Dette afsnit s<strong>til</strong>ler skarpt på<br />

nogle idéer <strong>til</strong> videreudvikling, som er opstået undervejs i projektforløbet. Der er tale om r<strong>en</strong>e<br />

tankeeksperim<strong>en</strong>ter, hvor fantasi<strong>en</strong> får frit spil.<br />

For det første kan der kigges nærmere på implem<strong>en</strong>tering af de lavt prioriterede krav fra<br />

kravspecifikation<strong>en</strong> (jf. afsnit 2.5), hvor datamodtagels<strong>en</strong> kan forbedres betydeligt, ved<br />

implem<strong>en</strong>tering af flere s<strong>en</strong>sorer. Dette s<strong>til</strong>ler imidlertid krav <strong>til</strong> antallet af ADC-indgange på<br />

<strong>microcontroller</strong><strong>en</strong> og kan gå h<strong>en</strong> at blive dyrt i længd<strong>en</strong>. Ved implem<strong>en</strong>tering af <strong>en</strong> mere<br />

lysfølsom og stabil s<strong>en</strong>sor vil der kunne aflæses nuancer af grå fra skærm<strong>en</strong>. Endvidere vil <strong>en</strong><br />

farves<strong>en</strong>sor, á la <strong>en</strong> CCD-chip, muliggøre aflæsning af <strong>en</strong>dnu flere nuancer fra skærm<strong>en</strong>,<br />

hvilket vil øge dataoverførsl<strong>en</strong> betydeligt. Man må dog påregne <strong>en</strong> del tab, hvis der skal være<br />

<strong>en</strong> vis sikkerhed i overførsl<strong>en</strong> og ved mulighed for dæmpning af lysstyrk<strong>en</strong> på skærm<strong>en</strong>.<br />

Desud<strong>en</strong> vil man gå glip af strømbesparels<strong>en</strong> ved implem<strong>en</strong>tering af <strong>en</strong> farves<strong>en</strong>sor.<br />

Der er indlys<strong>en</strong>de fordele ved at bruge solceller (og piezoer), da de ikke bruger strøm, m<strong>en</strong> i<br />

stedet g<strong>en</strong>erer d<strong>en</strong>. D<strong>en</strong>ne type kompon<strong>en</strong>ter er defor g<strong>en</strong>iale <strong>til</strong> små embeddede systemer,<br />

hvor strøm besparelse vægtes højt.<br />

Antallet af CRT-skærme er nedadgå<strong>en</strong>de, og ind<strong>en</strong> for nogle få år vil de være et yderst<br />

sjæld<strong>en</strong>t syn i de teknologiske dele af verd<strong>en</strong>. Godt kan de g<strong>en</strong>give flottere billeder <strong>en</strong>d LCD-<br />

typ<strong>en</strong>, m<strong>en</strong> <strong>til</strong>g<strong>en</strong>gæld afgiver de <strong>en</strong> masse varme, bruger <strong>en</strong> del mere strøm og æstetisk set<br />

er de klodsede, besværlige og fylder meget. Folk vælger dem typisk fra, hvorfor udvidelser af<br />

<strong>dataoverførsel</strong><strong>en</strong> <strong>til</strong> CRT-skærme nok ikke vil blive aktuel, så fokus kan lægges på<br />

forbedringer af understøttels<strong>en</strong> af LCD-skærme.<br />

Implem<strong>en</strong>teres et digitalt filter i stedet for det nuvær<strong>en</strong>de RC-kredsløb mellem solcellerne og<br />

forstærker<strong>en</strong> på prototyp<strong>en</strong>, vil man undgå <strong>en</strong> del af de langsomme stige-/faldetider på<br />

signalet som vist under test af hardware-prototyp<strong>en</strong> (afsnit 4.4) og analys<strong>en</strong> af modtager<strong>en</strong><br />

(afsnit 5.1.2.1). Dette vil dog kræve mere plads på <strong>microcontroller</strong><strong>en</strong>, m<strong>en</strong> <strong>til</strong>g<strong>en</strong>gæld vil<br />

signalerne blive meget mere tydelige, så der vil kunne opnås <strong>en</strong> højere overførselshastighed.<br />

Hvad angår udviddelse af selve kortets funktionalitet, er det kun fantasi<strong>en</strong>, der sætter<br />

grænser. Her nævnes i flæng: visning af firmalogo, scrolling-tekst, logoer der drejer rundt og<br />

andre gadget-agtige funktioner. Aflæsning fra skærm<strong>en</strong> kan også kombineres på forskellige<br />

måder, så der kan udvikles mere raffinerede teknologier. Prevas har nogle forskellige idéer på<br />

tegnebrættet, som desværre ikke kan nævnes yderligere her.<br />

56 Udvidelser


Kunne man helt undgå operationsforstærker<strong>en</strong> mellem solcellerne, og ADC'<strong>en</strong> vil der kunne<br />

spares på produktionsomkostningerne. Signalet vil dog komme <strong>til</strong> at ligge ret lavt, hvorfor man<br />

vil gå på kompromis med opløsning<strong>en</strong> og dermed overførselshastighed<strong>en</strong>, medmindre hele d<strong>en</strong><br />

<strong>en</strong>e side af kortet fyldes med solceller. Systemet vil <strong>til</strong>g<strong>en</strong>gæld være ret simpelt, da solcellerne<br />

forbindes direkte <strong>til</strong> ADC-indgang<strong>en</strong> ud<strong>en</strong> fordyr<strong>en</strong>de mellemled.<br />

En af de større problemer bliver på sigt at holde liv i kortets batteri, hvofor der må <strong>en</strong> form for<br />

g<strong>en</strong>opladning <strong>til</strong>. Af de muligheder, der umiddelbart er <strong>til</strong>rådighed, kan nævnes opladning via<br />

piezo<strong>en</strong>, når kortet rystes. Ved montering af solceller <strong>til</strong> <strong>dataoverførsel</strong> vil disse også kunne<br />

anv<strong>en</strong>des som <strong>en</strong>ergiforsyning. Der vil <strong>en</strong>dda være rigeligt med plads på kortet <strong>til</strong> solceller,<br />

selvom man ev<strong>en</strong>tuelt beslutter sig for <strong>en</strong> and<strong>en</strong> form for s<strong>en</strong>sor <strong>til</strong> datamodtagelse. Muligvis<br />

kan der udvikles <strong>en</strong> anordning <strong>til</strong> opladning vha. <strong>en</strong> magnet, eller der kan monteres et minimalt<br />

stik <strong>til</strong> opladning via <strong>en</strong> transformator <strong>til</strong> stikkontakt<strong>en</strong>, som det k<strong>en</strong>des fra mobiltelefoner,<br />

GPS'er og lign<strong>en</strong>de. Yderligere vil man muligvis i fremtid<strong>en</strong> se batterier med solceller<br />

premonteret, eller batterier der oplades vha. varme, når kortet ligger i <strong>en</strong>s baglomme. D<strong>en</strong><br />

fremadstorm<strong>en</strong>de nanoteknologi bidrager konstant med nye muligheder.<br />

Udvidelser 57


8 Konklusion<br />

På baggrund af de udførte tests vurderes det samlede resultat af systemet. Der foretages <strong>en</strong><br />

kort g<strong>en</strong>nemgang af kravspecifikation<strong>en</strong> for at undersøge, om løsning<strong>en</strong> lever op <strong>til</strong><br />

forv<strong>en</strong>tningerne. Projektets arbejdsproces komm<strong>en</strong>teres og samm<strong>en</strong>holdes med dele af<br />

forundersøgels<strong>en</strong>.<br />

8.1 Systemet<br />

Det er vigtigt at understrege, at der ikke er tale om et færdigt produkt – i stedet handler det<br />

om proof-of-concept med fokus på optisk <strong>dataoverførsel</strong> fra <strong>en</strong> computerskærm <strong>til</strong> et indlejret<br />

system. Med dette udgangspunkt kan udfaldet betragtes som <strong>en</strong> succes, hvor s<strong>til</strong>lede krav<br />

(afsnit 2.5, side 10) med de to højeste prioriteter er opfyldt. Jf. visualisering<strong>en</strong> (krav 12) vises<br />

data kort på modtager<strong>en</strong>s lysdioder – eller de kan aflæses i et af d<strong>en</strong>s interne lagerområder<br />

vha. et udviklingsmiljø. D<strong>en</strong> overførte tekst vises altså ikke i luft<strong>en</strong>, hvilket skyldes d<strong>en</strong><br />

nuvær<strong>en</strong>de implem<strong>en</strong>tering af wavecardet, hvor tekster er hard-kodet på kortet og ikke<br />

b<strong>en</strong>ytter <strong>en</strong> systematisk metode <strong>til</strong> at omdanne karakterer <strong>til</strong> lys. Krav med lavere prioriteter<br />

(krav 5 og 10) har ikke vist sig aktuelle af d<strong>en</strong> simple årsag, at de vil kræve flere <strong>til</strong>gængelige<br />

porte på <strong>microcontroller</strong><strong>en</strong>. Wavecardets <strong>microcontroller</strong> står overfor <strong>en</strong> udskiftning <strong>til</strong> <strong>en</strong> and<strong>en</strong><br />

type med færre funktionaliteter, da d<strong>en</strong>ne type embeddede systemer produceres i større<br />

mængder, og der kan spares mange p<strong>en</strong>ge ved at mindske hardwareomkostningerne.<br />

De udførte tests afhænger meget af modtager<strong>en</strong>s konfiguration mht. behandling<strong>en</strong> af det<br />

analoge signal. Ligeledes betyder de forhold systemet fungere under <strong>en</strong> hel del for succes<strong>en</strong><br />

af overførsl<strong>en</strong> – her spiller forskellige faktorer ind så som forstyrrelser i hardware-prototyp<strong>en</strong>,<br />

løse forbindelser i testmiljøet, kalibrering af modtager<strong>en</strong>, for svagt lys fra skærm<strong>en</strong>, for kraftige<br />

lysforhold i rummet og applett<strong>en</strong>s stabilitet. I bund og grund vil det kun være bearbejdning<strong>en</strong> af<br />

det analoge signal fra skærm<strong>en</strong>, som kan volde problemer, fordi mange af forhindringerne vil<br />

forsvinde ved d<strong>en</strong> <strong>en</strong>delige implem<strong>en</strong>tering af hardwar<strong>en</strong>. Lysforhold<strong>en</strong>e er ikke blevet testet<br />

særligt grundigt af d<strong>en</strong> simple årsag, at solcellerne på d<strong>en</strong> <strong>en</strong>delige udgave vil være placeret<br />

klods op og ned ad skærm<strong>en</strong>, og selve kortet vil skygge for det udefrakomm<strong>en</strong>de lys. D<strong>en</strong><br />

nuvær<strong>en</strong>de hadware-prototype vil dog være følsom overfor direkte lys. Man bør kraftigt<br />

g<strong>en</strong>overveje brug<strong>en</strong> af Java-appletter <strong>til</strong> at overføre data med, hvis de ikke <strong>til</strong>deles <strong>til</strong>strækkeligt<br />

med systemressourcer. Systemudviklere vil sandsynligvis have styr på dette (i forbindelse med<br />

tests), hvilket ikke kan forv<strong>en</strong>tes af slutbruger<strong>en</strong>. Desud<strong>en</strong> har Java ikke <strong>en</strong> dyb nok <strong>til</strong>gang <strong>til</strong><br />

systemet, så der opstår flimr<strong>en</strong> på skærm<strong>en</strong>, hvilket skyldes mangl<strong>en</strong>de synkronisering mellem<br />

skærm og grafikkort. Dog er det smart, at s<strong>en</strong>der<strong>en</strong> kan <strong>til</strong>gås blot vha. <strong>en</strong> internetforbindelse.<br />

58 Konklusion


Bredd<strong>en</strong> af selve bølgerne, fra de lyssignaler som skærm<strong>en</strong> uds<strong>en</strong>der, varierer <strong>en</strong> del, alt efter<br />

hastighed<strong>en</strong> hvormed der blinkes, hvilket gør bestemmelse af periodetid<strong>en</strong> <strong>en</strong> anelse<br />

besværlig.<br />

Ønskes detektering af gråtoner fra skærm<strong>en</strong>, for at øge dataoverførsl<strong>en</strong>, får man imidlertid<br />

problemer med modtagels<strong>en</strong>, hvis baggrundslyset er dæmpet, hvilket vil få d<strong>en</strong> uønskede<br />

effekt, at bruger<strong>en</strong> aktivt skal forberede transaktion<strong>en</strong>.<br />

8.2 Process<strong>en</strong><br />

Der kan puttes mange <strong>til</strong>lægsord på arbejdsmiljøet hos Prevas, hvor der konstant kommer nye<br />

folk <strong>til</strong>, og nogle få falder fra. Medarbejderne er imødekomm<strong>en</strong>de, interesserede i hinand<strong>en</strong>s<br />

projekter og v<strong>en</strong>lige <strong>til</strong> at hjælpe. Specielt i forbindelse med udvikling<strong>en</strong> af hardware-prototyp<strong>en</strong><br />

har det været rigtigt spænd<strong>en</strong>de at være med i samarbejdet på tværs af forskellige<br />

fagområder og opleve grænselandet mellem hard- og softwareudvikling.<br />

For det meste har det daglig arbejde foregået i virksomhed<strong>en</strong> – og i mere privat regi under<br />

int<strong>en</strong>siv rapport-skrivning grundet støj fra det åbne kontorlandskab. Arbejdsdisciplin<strong>en</strong> har<br />

været høj under hele projektforløbet med <strong>en</strong> g<strong>en</strong>nemsnitlig arbejdsdag på omkring 8-9 timer<br />

5-6 dage om ug<strong>en</strong> – i runde tal <strong>en</strong> arbejdsuge på lidt over 41 timer – og der<strong>til</strong> kommer<br />

yderligere tid <strong>til</strong> frokost og networking. (se evt. detaljerne i bilag B). Fordeling<strong>en</strong> af<br />

arbejdsindsats<strong>en</strong> fremgår af<br />

illustration 43, som viser det<br />

proc<strong>en</strong>tvise tidsforbrug for hver<br />

udviklingsfase samt rapportering.<br />

Der er blevet brugt <strong>en</strong> del<br />

ressourcer på bes<strong>til</strong>ling af udstyr og<br />

frems<strong>til</strong>ling af testmiljøet, hvorfor<br />

implem<strong>en</strong>tering<strong>en</strong> fylder forholdsvist<br />

meget.<br />

Projektet har i overrask<strong>en</strong>de høj<br />

grad fulgt tidsplan<strong>en</strong> (se bilag A)<br />

med ganske få afvigelser. Der er<br />

overordnet set blevet arbejdet efter<br />

vandfaldsmodell<strong>en</strong> g<strong>en</strong>nem hele<br />

forløbet; m<strong>en</strong> samtidig har opgav<strong>en</strong>s art forudsættet <strong>en</strong> <strong>til</strong>bagev<strong>en</strong>d<strong>en</strong> <strong>til</strong> tidligere udførte<br />

opgaver. Her tænkes på arbejdet med test-applikation<strong>en</strong>, der gradvist blev udvidet <strong>til</strong> at have<br />

flere af s<strong>en</strong>der<strong>en</strong>s eg<strong>en</strong>skaber. Desud<strong>en</strong> har de <strong>en</strong>kelte tests været vigtige for at kunne<br />

udføre de efterfølg<strong>en</strong>de opgaver, hvorfor vandfaldsmodell<strong>en</strong> i dette <strong>til</strong>fælde viste sig effektiv.<br />

Med h<strong>en</strong>syn <strong>til</strong> kontakt <strong>til</strong> vejleder<strong>en</strong> har al kommunikation foregået via CampusNet (DTUs<br />

intranet), og der har fundet to møder sted i virksomhed<strong>en</strong> samt tre på DTU.<br />

Analyse<br />

Design<br />

Impl.<br />

Test<br />

Rapport<br />

Illustration 43: Fordeling af tidsforbruget for projektets faser.<br />

Konklusion 59


Bilag A - Tidsplan<br />

Der afsættes <strong>en</strong> uge <strong>til</strong> halvand<strong>en</strong> <strong>til</strong> selve opstart<strong>en</strong> af projektet for at danne overblik over<br />

problems<strong>til</strong>lingerne. Ind<strong>en</strong> juleferi<strong>en</strong> (i uge 51, 2007 og uge 1, 2008) udvikles <strong>en</strong> test-applikation<br />

for at kunne <strong>til</strong>passe hardwar<strong>en</strong> og analysere de signaler, der s<strong>en</strong>des <strong>til</strong> modtager<strong>en</strong>. Der<br />

afsættes ca. 10 dage <strong>til</strong> dette.<br />

Illustration 44: Det indled<strong>en</strong>de forløb samt udvikling af test-applikation<strong>en</strong>.<br />

Til udvikling<strong>en</strong> af modtager<strong>en</strong> er der afsat ca. 3-4 uger – så med <strong>en</strong> uges vinterferie sidst i<br />

period<strong>en</strong> burde de rester<strong>en</strong>de programfunktioner komme på plads.<br />

Illustration 45: Udvikling af modtager<strong>en</strong>.<br />

60 Bilag A - Tidsplan


I d<strong>en</strong> afslutt<strong>en</strong>de del af projektet skal alle kompon<strong>en</strong>terne kædes samm<strong>en</strong>. S<strong>en</strong>der<strong>en</strong> udvikles<br />

ud fra test-applikation<strong>en</strong> og testes med modtager<strong>en</strong>. Sidst m<strong>en</strong> ikke mindst skal rapport<strong>en</strong><br />

skrives færdig.<br />

Illustration 46: Udvikling af s<strong>en</strong>der<strong>en</strong> og det afslutt<strong>en</strong>de forløb.<br />

Bilag A - Tidsplan 61


Bilag B - Logbog<br />

Her følger <strong>en</strong> oversigt over det faktiske tidsforbrug, som indledes med <strong>en</strong> opsummering af<br />

timetallet for de <strong>en</strong>kelte områder samt <strong>en</strong> illustrattion, der grafisk viser de indbyrdes forhold<br />

mellem udviklingsfaserne. Ligeledes følger <strong>en</strong> detaljeret oversigt over de <strong>en</strong>kelte dages<br />

aktiviteter i løbet af projektperiod<strong>en</strong>.<br />

B.1 Oversigt<br />

Fordeling af arbejdstid<br />

Analyse<br />

Design<br />

Impl.<br />

Test<br />

Rapport<br />

Beskrivelse Analyse Design Im pl. Test Rapport Total Pr. uge<br />

Antal timer i alt 95 72 138 70 121 496 41,33<br />

Fordeling 19% 15% 28% 14% 24% 100%<br />

62 Bilag B - Logbog


B.2 Detaljer<br />

Uge Dato Beskrivelse af aktivitet Analyse Design Im pl. Test Rapport Pr. uge<br />

1 man. 3. dec. Research 8<br />

tir. 4. dec. Research, Tidsplan 8<br />

ons. 5. dec. Research, Kravspecifikation 8<br />

tor. 6. dec. Analysediagram, Aktivitetsdiagram 8<br />

fre. 7. dec. Aktivitetsdiagram 8<br />

lør. 8. dec.<br />

søn. 9. dec. Research 5 45<br />

2 man. 10. dec. Struktur, Rapport-setup 8<br />

tir. 11. dec. Struktur, Forord, Indledning, 8<br />

ons. 12. dec. Introduktion <strong>til</strong> prototype, Test-program 3 5<br />

tor. 13. dec. Test-program, Aktivitetsdiagram 6 2<br />

fre. 14. dec. Analysediagram for test-applet 5<br />

lør. 15. dec.<br />

søn. 16. dec. 37<br />

3 man. 17. dec. Designdiagram, transmitter-/test-applet 3<br />

tir. 18. dec. Transmitter-applet 9<br />

ons. 19. dec. HTML og stylesheet <strong>til</strong> applet 8<br />

tor. 20. dec. Datapanel (område der blinker med data) 8<br />

fre. 21. dec. Observationstest af test-applikation 4 4<br />

lør. 22. dec.<br />

søn. 23. dec. 36<br />

4 man. 24. dec. Juleferie<br />

tir. 25. dec.<br />

ons. 26. dec.<br />

tor. 27. dec.<br />

fre. 28. dec.<br />

lør. 29. dec.<br />

søn. 30. dec.<br />

5 man. 31. dec.<br />

tir. 1. jan.<br />

ons. 2. jan.<br />

tor. 3. jan.<br />

fre. 4. jan.<br />

lør. 5. jan.<br />

søn. 6. jan.<br />

6 man. 7. jan. Forberedelse 4 4<br />

tir. 8. jan. Målinger med prototype 5 3<br />

ons. 9. jan. Install af HI-TIDE, opsætning af MCU 4 2<br />

tor. 10. jan. Skærmteknologier 6 3<br />

fre. 11. jan. Designdiagrammer for modtager 3 5<br />

lør. 12. jan.<br />

søn. 13. jan. 39<br />

7 man. 14. jan. Justering af double-buffer i applet 8<br />

tir. 15. jan. Undersøg overførselsprotokol. 4 4<br />

ons. 16. jan. Forsøg på udvikling af protokol. 3 4<br />

tor. 17. jan. Diagrammer for protokol. Indkøb ICD2. 5 3<br />

fre. 18. jan. Møde med Bjarne. Stik <strong>til</strong> udviklingsmiljø 3 4 1<br />

lør. 19. jan.<br />

søn. 20. jan. 39<br />

8 man. 21. jan. MPLAB-opsætning. Struktur af rapport 4 3<br />

tir. 22. jan. Indsamling af måledata. Diagrammer 3 3 2<br />

ons. 23. jan. Møde med Edw ard på DTU 4<br />

Bilag B - Logbog 63


tor. 24. jan. Opsætning af <strong>microcontroller</strong> 6<br />

fre. 25. jan. Pulse detection 8<br />

lør. 26. jan. Analyse af signaler 8<br />

søn. 27. jan. 41<br />

9 man. 28. jan. Vinterferie<br />

tir. 29. jan.<br />

ons. 30. jan.<br />

tor. 31. jan.<br />

fre. 1. feb.<br />

lør. 2. feb.<br />

søn. 3. feb.<br />

10 man. 4. feb. Digital modtagelse 1 2 6<br />

tir. 5. feb. S<strong>en</strong>der applikation 1 2 6<br />

ons. 6. feb. Modtager decoding 1 2 6<br />

tor. 7. feb. Datamodtagelse tuning 6<br />

fre. 8. feb. Datamodtagelse tuning 8<br />

lør. 9. feb.<br />

søn. 10. feb. 41<br />

11 man. 11. feb. Datamodtagelse 3 5<br />

tir. 12. feb. Test-applikation dokum<strong>en</strong>tation 5 5 5<br />

ons. 13. feb. Enkodning af datasignaler på s<strong>en</strong>der 2 4 6<br />

tor. 14. feb. Fremvisning af <strong>dataoverførsel</strong> 3<br />

fre. 15. feb. Modtager analyse 2 7<br />

lør. 16. feb.<br />

søn. 17. feb. 47<br />

12 man. 18. feb. Signalbehandling for modtager 6 2 3<br />

tir. 19. feb. Dataoverførsel 6 2 3<br />

ons. 20. feb. Design illustrationer 6 4<br />

tor. 21. feb. Design illustrationer 8<br />

fre. 22. feb. Design illustrationer 4 3<br />

lør. 23. feb.<br />

søn. 24. feb. 47<br />

13 man. 25. feb. Design illustrationer 8<br />

tir. 26. feb. Illustrationer, implem<strong>en</strong>tering og testmiljø 4 4<br />

ons. 27. feb. Illustrationer implem<strong>en</strong>tering og testmiljø 4 4<br />

tor. 28. feb. Illustrationer, implem<strong>en</strong>tering og testmiljø 4 4<br />

fre. 29. feb. Test 8<br />

lør. 1. mar.<br />

søn. 2. mar. 40<br />

14 man. 3. mar. Test og kalibrering 6<br />

tir. 4. mar. Test og kalibrering 6<br />

ons. 5. mar. Test og kalibrering 6<br />

tor. 6. mar. Rettelser og opsætning af rapport 6<br />

fre. 7. mar. Målinger, Møde med Edw ard på DTU 6 3<br />

lør. 8. mar. Test af signaler 5<br />

søn. 9. mar. Rettelser 8 46<br />

15 man. 10. mar. Konklusion 8<br />

tir. 11. mar. Møde med Bjarne i Prevas 2 6<br />

ons. 12. mar. De sidste rettelser 9<br />

tor. 13. mar. De sidste rettelser 8<br />

fre. 14. mar. Udskrivning og kopiering af CD'ere 5 38<br />

64 Bilag B - Logbog


Bilag C - <strong>Tekniske</strong> begreber<br />

I rapport<strong>en</strong> forekommer ord og v<strong>en</strong>dinger af teknisk karakter, som kan være svære at forstå<br />

betydning<strong>en</strong> af, hvis man ikke er stødt på dem før eller i det daglige arbejder med d<strong>en</strong>ne form<br />

for systemer. List<strong>en</strong> herunder viser så vidt som muligt både d<strong>en</strong> tekniske betegnelse i hele ord<br />

og d<strong>en</strong>nes forkortelse samt d<strong>en</strong>nes betydning.<br />

Teknisk betegnelse Betydning<br />

ADC<br />

(Analog-to-Digital Converter)<br />

AMLCD<br />

Active Matrix Liquid Crystal Display<br />

Omsætter analoge signaler fra d<strong>en</strong> fysiske verd<strong>en</strong> <strong>til</strong> digitale signaler,<br />

som <strong>en</strong> computer kan forstå.<br />

Se under LCD.<br />

Bit-rate Også kaldet data-rate angiver antallet af bits der overføres i <strong>en</strong><br />

dataforbindelse – typisk angivet i bits per sekund med <strong>en</strong>hed<strong>en</strong> bps<br />

eller bit/s.<br />

CSS<br />

Cascading Style Sheet<br />

Adskiller <strong>en</strong> hjemmesides layout fra d<strong>en</strong> struktur (HTML eller XHTML),<br />

så designet kan bearbejdes separat fra indholdet.<br />

Duty-cycle D<strong>en</strong> del af tid<strong>en</strong> (målt i proc<strong>en</strong>t) et digitalt signal er højt.<br />

EEPROM<br />

Electrically Erasable Programmable<br />

Read-Only Memory<br />

IDE<br />

Integrated Developm<strong>en</strong>t Environm<strong>en</strong>t<br />

Et lagerområde på <strong>en</strong> chip der bevares, selv om d<strong>en</strong> ikke <strong>til</strong>føres<br />

strøm.<br />

Udviklingsmiljø der integrerer <strong>en</strong> avanceret teksteditor med<br />

projektstyring, compiller og debugger.<br />

Interrupt Giver <strong>en</strong> <strong>microcontroller</strong> besked når forskellige forhold gør sig<br />

gæld<strong>en</strong>de. F.eks. hvis <strong>en</strong> ADC-måling er klar, <strong>en</strong> timer nuls<strong>til</strong>les mv.<br />

LCD<br />

Liquid Crystal Display<br />

LED<br />

(Light-Emitting Diode)<br />

En type avanceret display der ofte forekommer i fladskærme.<br />

Også kaldet <strong>en</strong> lysdiode – uds<strong>en</strong>der lys når d<strong>en</strong> påvirkes med <strong>en</strong><br />

svag elektrisk spænding.<br />

Low-pass filter Et elektrisk kredsløb der filtrerer høje frekv<strong>en</strong>ser fra et signal og kun<br />

videres<strong>en</strong>der frekv<strong>en</strong>ser under <strong>en</strong> fastsat grænse. Se RC-led.<br />

LSB<br />

Least Significant Bit<br />

MCU<br />

(Micro Controller Unit)<br />

MSB<br />

Most Significant Bit<br />

D<strong>en</strong> mindst betyd<strong>en</strong>de bit i et binært tal er d<strong>en</strong>, der er længst <strong>til</strong><br />

højre.<br />

En meget lille computer der er yderst specialiseret, så d<strong>en</strong> kun<br />

anv<strong>en</strong>des <strong>til</strong> bestemte formål.<br />

D<strong>en</strong> mest betyd<strong>en</strong>de bit i et binært tal er d<strong>en</strong>, der er længst <strong>til</strong><br />

v<strong>en</strong>stre.<br />

Nibble En halv byte eller 4 bits (24) repræs<strong>en</strong>terer 16 forskellige værdier.<br />

Op-amp<br />

Operational amplifier<br />

PCB<br />

Printed Circuit Board<br />

Et forstærkerkredsløb der eksempelvis kan hæve <strong>en</strong> giv<strong>en</strong> svag<br />

spænding et hel del gang.<br />

Teknisk betegnelse for <strong>en</strong> printplade.<br />

Bilag C - <strong>Tekniske</strong> begreber 65


PIC<br />

Programmable Interface<br />

Controller/Programmable Intellig<strong>en</strong>t<br />

Computer<br />

PWM<br />

Pulse Width Modulation<br />

RC-led<br />

Resistor/Capacitor<br />

SRAM<br />

Static Random Access Memory<br />

TFT<br />

Thin Film Transistor<br />

En <strong>microcontroller</strong> udviklet af produc<strong>en</strong>t<strong>en</strong> Microchip der fås i mange<br />

forskellige udgaver.<br />

En måde at sænke <strong>en</strong> elektrisk spænding på ved skiftevis at tænde<br />

og slukke for d<strong>en</strong> med høj hastighed.<br />

Oplader <strong>en</strong> kond<strong>en</strong>sator ig<strong>en</strong>nem <strong>en</strong> modstand for at bestemme<br />

d<strong>en</strong> tid, hvormed kond<strong>en</strong>sator<strong>en</strong> oplades. Se evt. under Low-pass<br />

filter.<br />

Er <strong>en</strong> type hurtig hukommelse vis indhold forsvinder, når strøm ikke<br />

<strong>til</strong>føres.<br />

En teknik anv<strong>en</strong>dt i bl.a. LCD-skærme <strong>til</strong> at kunne vise hver pixel.<br />

Timer B<strong>en</strong>yttes af <strong>en</strong> <strong>microcontroller</strong> <strong>til</strong> at holde styr på hvor lang tid der<br />

går mellem forskellige hændelser. En timer anv<strong>en</strong>des evt. samm<strong>en</strong><br />

med interrupts.<br />

XHTML<br />

eXt<strong>en</strong>ded HyperText Markup<br />

Language<br />

D<strong>en</strong> måde <strong>en</strong> hjemmeside beskrives på. XHTML er <strong>en</strong><br />

videreudvikling af HTML for at komme tættere på XML.<br />

66 Bilag C - <strong>Tekniske</strong> begreber


D.1 Test-applikation<br />

D.1.1 TestApplication.java<br />

package testapp;<br />

// Core packages<br />

import java.awt.*;<br />

import java.awt.ev<strong>en</strong>t.*;<br />

// Ext<strong>en</strong>sion packages<br />

import javax.swing.*;<br />

import javax.swing.ev<strong>en</strong>t.ChangeEv<strong>en</strong>t;<br />

import javax.swing.ev<strong>en</strong>t.ChangeList<strong>en</strong>er;<br />

/**<br />

* 'Transmitter' is a web application for transferring<br />

* data from the scre<strong>en</strong> to an electronic device. It has<br />

* debugging facilities to control the duty cycle and<br />

* period of the digital signals.<br />

*<br />

* @author Hasse Bylov - hasse@bylov.com<br />

* @see http://www.micromedia.dk/wavecard/index.html<br />

*<br />

*/<br />

public class TestApplication ext<strong>en</strong>ds JApplet {<br />

private static final long serialVersionUID = 5811536125471100063L;<br />

private static final int PERIOD_MIN = 10;<br />

private static final int PERIOD_MAX = 1000;<br />

private static final int PERIOD_INIT = 50;<br />

private static final int DUTY_MIN = 0;<br />

private static final int DUTY_MAX = 100;<br />

private static final int DUTY_INIT = 50;<br />

private static final int HIGH_CONTRAST = 0;<br />

private static final int LOW_CONTRAST = 255;<br />

private static final int COLOR_DEPTH_MAX = 255;<br />

private static final int COLOR_DEPTH_MIN = 0;<br />

private static final int COLOR_DEPTH_STEP = 1;<br />

private static final int NUMBER_OF_ROWS = 4;<br />

private static final int NUMBER_OF_COLUMNS = 4;<br />

private static final int SYSTEM_LAYOUT = 2;<br />

// System<br />

private UIManager.LookAndFeelInfo looks[];<br />

// Panels<br />

private JPanel periodPanel;<br />

private JPanel dutycyclePanel;<br />

private JPanel contrastPanel;<br />

private JPanel statusPanel;<br />

private JPanel debugPanel;<br />

private JPanel controlPanel;<br />

private DataPanel outputPanel;<br />

Bilag D - Kildekode<br />

Bilag D - Kildekode 67


Debugging<br />

private JLabel periodLabel;<br />

private JSlider periodSlider;<br />

private JLabel periodValueLabel;<br />

private JLabel periodUnitLabel;<br />

private JLabel dutycycleLabel;<br />

private JSlider dutycycleSlider;<br />

private JLabel dutycycleValueLabel;<br />

private JLabel dutycycleUnitLabel;<br />

private JLabel lowContrastLabel;<br />

private SpinnerNumberModel lowContrast;<br />

private JSpinner lowContrastSpinner;<br />

private JLabel highContrastLabel;<br />

private JSpinner highContrastSpinner;<br />

private SpinnerNumberModel highContrast;<br />

private JToggleButton operateButton;<br />

/**<br />

* init() is the applet's main method where things are setup once<br />

*/<br />

public void init() {<br />

try { // Set up the user interface<br />

javax.swing.SwingU<strong>til</strong>ities.invokeAndWait(new Runnable() {<br />

public void run() {<br />

createGUI();<br />

}<br />

});<br />

} catch (Exception e) { // an unknown error occurred<br />

System.err.println("createGUI() didn't successfully complete");<br />

}<br />

} // init<br />

/**<br />

* changeLookAndFeel() makes the user interface look<br />

* like the user's operating system<br />

* @param int look number<br />

*/<br />

private void changeLookAndFeel(int value) {<br />

try {<br />

UIManager.setLookAndFeel(looks[value].getClassName());<br />

SwingU<strong>til</strong>ities.updateCompon<strong>en</strong>tTreeUI(this);<br />

} catch (Exception e) {<br />

e.printStackTrace();<br />

}<br />

} // changeLookAndFeel<br />

/**<br />

* getFrequ<strong>en</strong>cy() calculates the frequ<strong>en</strong>cy<br />

* from the data panel's period and hacks<br />

* it to return a decimal value<br />

* @return double frequ<strong>en</strong>cy in Hz<br />

*/<br />

private double getFrequ<strong>en</strong>cy() {<br />

double frequ<strong>en</strong>cy = 1000.0 / (double)(outputPanel.getPeriod());<br />

return Math.round(frequ<strong>en</strong>cy * 100.0) / 100.0;<br />

} // getFrequ<strong>en</strong>cy<br />

/**<br />

* createGUI() sets up the panels, sliders and buttons<br />

*/<br />

private void createGUI() {<br />

// Debug panel<br />

periodLabel = new JLabel("Period:");<br />

periodLabel.setLabelFor(periodSlider);<br />

periodSlider = new JSlider(SwingConstants.HORIZONTAL, PERIOD_MIN, PERIOD_MAX,<br />

PERIOD_INIT);<br />

periodSlider.setMajorTickSpacing(PERIOD_MAX-PERIOD_MIN);<br />

periodSlider.setPaintTicks(true);<br />

periodSlider.setPaintLabels(true);<br />

periodValueLabel = new JLabel("");<br />

periodUnitLabel = new JLabel("ms");<br />

DUTY_INIT);<br />

dutycycleLabel = new JLabel("Duty cycle:");<br />

dutycycleLabel.setLabelFor(dutycycleSlider);<br />

dutycycleSlider = new JSlider(SwingConstants.HORIZONTAL, DUTY_MIN, DUTY_MAX,<br />

68 Bilag D - Kildekode


dutycycleSlider.setMajorTickSpacing(25);<br />

dutycycleSlider.setPaintTicks(true);<br />

dutycycleSlider.setPaintLabels(true);<br />

dutycycleValueLabel = new JLabel("");<br />

dutycycleUnitLabel = new JLabel("%");<br />

lowContrastLabel = new JLabel("Low:");<br />

lowContrastLabel.setLabelFor(lowContrastSpinner);<br />

lowContrast = new SpinnerNumberModel(LOW_CONTRAST, COLOR_DEPTH_MIN,<br />

COLOR_DEPTH_MAX, COLOR_DEPTH_STEP);<br />

lowContrastSpinner = new JSpinner(lowContrast);<br />

highContrastLabel = new JLabel("High:");<br />

highContrastLabel.setLabelFor(lowContrastSpinner);<br />

highContrast = new SpinnerNumberModel(HIGH_CONTRAST, COLOR_DEPTH_MIN,<br />

COLOR_DEPTH_MAX, COLOR_DEPTH_STEP);<br />

highContrastSpinner = new JSpinner(highContrast);<br />

operateButton = new JToggleButton(" Turn On ");<br />

operateButton.setMnemonic(KeyEv<strong>en</strong>t.VK_T);<br />

periodPanel = new JPanel();<br />

periodPanel.setLayout(new FlowLayout());<br />

periodPanel.add(periodLabel);<br />

periodPanel.add(periodSlider);<br />

periodPanel.add(periodUnitLabel);<br />

dutycyclePanel = new JPanel();<br />

dutycyclePanel.setLayout(new FlowLayout());<br />

dutycyclePanel.add(dutycycleLabel);<br />

dutycyclePanel.add(dutycycleSlider);<br />

dutycyclePanel.add(dutycycleUnitLabel);<br />

contrastPanel = new JPanel();<br />

contrastPanel.setLayout(new FlowLayout());<br />

contrastPanel.add(lowContrastLabel);<br />

contrastPanel.add(lowContrastSpinner);<br />

contrastPanel.add(highContrastLabel);<br />

contrastPanel.add(highContrastSpinner);<br />

contrastPanel.add(operateButton);<br />

statusPanel = new JPanel();<br />

statusPanel.setLayout(new FlowLayout());<br />

statusPanel.add(periodValueLabel);<br />

statusPanel.add(dutycycleValueLabel);<br />

debugPanel = new JPanel();<br />

debugPanel.setLayout(new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLUMNS, 0, 0));<br />

debugPanel.setBackground(Color.LIGHT_GRAY);<br />

periodSlider.addChangeList<strong>en</strong>er ( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setPeriod(periodSlider.getValue());<br />

periodValueLabel.setText("Frequ<strong>en</strong>cy:" + getFrequ<strong>en</strong>cy() + "Hz ("<br />

+ outputPanel.getPeriod() + "ms)" );<br />

dutycycleSlider.setValueIsAdjusting(true);<br />

dutycycleSlider.setValueIsAdjusting(false);<br />

}<br />

} );<br />

dutycycleSlider.addChangeList<strong>en</strong>er ( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setDutycycle(dutycycleSlider.getValue());<br />

dutycycleValueLabel.setText("ON-time:" +<br />

outputPanel.getDutyHigh() + "ms OFF-time:" + outputPanel.getDutyLow() + "ms");<br />

}<br />

} );<br />

lowContrast.addChangeList<strong>en</strong>er( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setLowContrast( ((Integer)lowContrast.getValue()).intValue() );<br />

}<br />

} );<br />

highContrast.addChangeList<strong>en</strong>er( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

Bilag D - Kildekode 69


outputPanel.setHighContrast( ((Integer)highContrast.getValue()).intValue() );<br />

}<br />

} );<br />

operateButton.addChangeList<strong>en</strong>er( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

if(operateButton.isSelected()) {<br />

operateButton.setText(" Turn Off");<br />

outputPanel.setMode("debugmode");<br />

} else if(outputPanel.getMode() == "debugmode") {<br />

operateButton.setText(" Turn On ");<br />

outputPanel.setMode("idlemode");<br />

}<br />

}<br />

} );<br />

debugPanel.add(periodPanel);<br />

debugPanel.add(dutycyclePanel);<br />

debugPanel.add(contrastPanel);<br />

debugPanel.add(statusPanel);<br />

// Output panel<br />

outputPanel = new DataPanel(periodSlider.getValue(), dutycycleSlider.getValue(),<br />

((Integer)highContrast.getValue()).intValue(), ((Integer)lowContrast.getValue()).intValue());<br />

outputPanel.setBackground(Color.ORANGE);<br />

// Control panel<br />

controlPanel = new JPanel();<br />

controlPanel.setLayout(new BorderLayout());<br />

controlPanel.setBackground(Color.WHITE);<br />

if(getParameter("debug") != null)<br />

controlPanel.add(debugPanel, BorderLayout.NORTH);<br />

//controlPanel.add(userPanel, BorderLayout.CENTER);<br />

// Setup panels<br />

Container container = getCont<strong>en</strong>tPane();<br />

container.add(controlPanel, BorderLayout.NORTH);<br />

container.add(outputPanel, BorderLayout.CENTER);<br />

// Show default values<br />

periodSlider.setValueIsAdjusting(true);<br />

periodSlider.setValueIsAdjusting(false);<br />

dutycycleSlider.setValueIsAdjusting(true);<br />

dutycycleSlider.setValueIsAdjusting(false);<br />

looks = UIManager.getInstalledLookAndFeels();<br />

changeLookAndFeel(SYSTEM_LAYOUT);<br />

} // createGUI<br />

} // TestApplication<br />

D.1.2 DataPanel.java (version 1)<br />

package testapp;<br />

// Core packages<br />

import java.awt.*;<br />

// Ext<strong>en</strong>sion packages<br />

import javax.swing.JPanel;<br />

/**<br />

* 'DataPanel' is a JPanel used for transferring binary data<br />

* (and in the future also multiple color values) from a normal<br />

* computer scre<strong>en</strong> on to an electronic device. The panel is<br />

* used with the 'TestApplication' program.<br />

*<br />

* @author Hasse Bylov - hasse@bylov.com<br />

* @see http://www.micromedia.dk/wavecard/index.html<br />

70 Bilag D - Kildekode


*<br />

*/<br />

public class DataPanel ext<strong>en</strong>ds JPanel implem<strong>en</strong>ts Runnable {<br />

private static final long serialVersionUID = -2997949170529730708L;<br />

// off-scre<strong>en</strong> buffer<br />

private Image offscre<strong>en</strong>;<br />

// visual control<br />

private boolean bit;<br />

private int period;<br />

private int dutycycle;<br />

private int highContrast;<br />

private int lowContrast;<br />

// mode select<br />

private String mode;<br />

// panel constructor<br />

public DataPanel(int period, int dutycycle, int contrastHigh, int contrastLow) {<br />

super();<br />

}<br />

this.period = period;<br />

this.dutycycle = dutycycle;<br />

this.highContrast = contrastHigh;<br />

this.lowContrast = contrastLow;<br />

new Thread(this).start();<br />

/*<br />

* trivial getter/setter methods<br />

*/<br />

private boolean getBit() {<br />

return bit;<br />

}<br />

public void setBit(boolean value) {<br />

this.bit = value;<br />

repaint();<br />

}<br />

public int getPeriod() {<br />

return period;<br />

}<br />

public void setPeriod(int period) {<br />

this.period = period;<br />

}<br />

private int getDutycycle() {<br />

return dutycycle;<br />

}<br />

public void setDutycycle(int dutycycle) {<br />

this.dutycycle = dutycycle;<br />

}<br />

public int getDutyHigh() { // ON-Time = D*T<br />

return (getDutycycle() * getPeriod()) / 100;<br />

}<br />

public int getDutyLow() { // OFF-Time = (1-D)*T<br />

return ((100-getDutycycle()) * getPeriod()) / 100;<br />

}<br />

public int getHighContrast() {<br />

return highContrast;<br />

}<br />

public void setHighContrast(int high) {<br />

this.highContrast = high;<br />

}<br />

public int getLowContrast() {<br />

return lowContrast;<br />

Bilag D - Kildekode 71


}<br />

public void setLowContrast(int low) {<br />

this.lowContrast = low;<br />

}<br />

public String getMode() {<br />

return mode;<br />

}<br />

public void setMode(String mode) {<br />

this.mode = mode;<br />

}<br />

/**<br />

* dynamicDelay() holds the square wave signal<br />

* for a giv<strong>en</strong> time<br />

* @param int time<br />

*/<br />

private void dynamicDelay(int time) {<br />

long bitPeriod = System.curr<strong>en</strong>tTimeMillis();<br />

while((System.curr<strong>en</strong>tTimeMillis()-bitPeriod) < time) {<br />

try {<br />

Thread.sleep(1);<br />

} catch (InterruptedException e) {<br />

e.printStackTrace();<br />

}<br />

}<br />

} // dynamicDelay<br />

/**<br />

* scre<strong>en</strong>Binary() blinks the data panel according<br />

* to the debug controls. Besides the trivial methods<br />

* this is <strong>en</strong>ough to control the test-application<br />

*/<br />

private void scre<strong>en</strong>Binary() {<br />

if(getDutyHigh() > 0) {<br />

setBit(true);<br />

dynamicDelay(getDutyHigh());<br />

}<br />

if(getDutyLow() > 0) {<br />

setBit(false);<br />

dynamicDelay(getDutyLow());<br />

}<br />

} // scre<strong>en</strong>Binary<br />

/**<br />

* run() is the default Thread loop, from where<br />

* the program mode is controlled<br />

*/<br />

public void run() {<br />

while(true) { // forever...<br />

if(getMode() == "debugmode") { // test-application<br />

scre<strong>en</strong>Binary();<br />

} else { // to avoid CPU overload, system needs idle time<br />

dynamicDelay(50);<br />

}<br />

}<br />

} // run<br />

/**<br />

* invalidate() removes the off-scre<strong>en</strong> buffer<br />

*/<br />

public void invalidate() {<br />

super.invalidate();<br />

offscre<strong>en</strong> = null;<br />

} // invalidate<br />

/**<br />

* update() overrides the default update()<br />

* to NOT erase the background before painting<br />

* @param Graphics g<br />

*/<br />

public void update(Graphics g) {<br />

paint(g);<br />

} // update<br />

72 Bilag D - Kildekode


image<br />

/**<br />

* paint() puts everything in place in an off-scre<strong>en</strong> buffer and th<strong>en</strong> shows <strong>en</strong>tire<br />

* on scre<strong>en</strong> at once.<br />

* @param Graphics g<br />

*/<br />

public void paint(Graphics g) {<br />

Color highColor = new Color(getHighContrast(), getHighContrast(),<br />

getHighContrast());<br />

Color lowColor = new Color(getLowContrast(), getLowContrast(),<br />

getLowContrast());<br />

if(offscre<strong>en</strong> == null) {<br />

offscre<strong>en</strong> = createImage(getSize().width, getSize().height);<br />

}<br />

Graphics offscre<strong>en</strong>Graphics = offscre<strong>en</strong>.getGraphics();<br />

offscre<strong>en</strong>Graphics.setClip(0, 0, getSize().width, getSize().height);<br />

super.paint(offscre<strong>en</strong>Graphics);<br />

if(getBit()) {<br />

offscre<strong>en</strong>Graphics.setColor(highColor);<br />

offscre<strong>en</strong>Graphics.fillRect(0, 0, getSize().width, getSize().height);<br />

} else {<br />

offscre<strong>en</strong>Graphics.setColor(lowColor);<br />

offscre<strong>en</strong>Graphics.fillRect(0, 0, getSize().width, getSize().height);<br />

}<br />

g.drawImage(offscre<strong>en</strong>, 0, 0, null);<br />

offscre<strong>en</strong>Graphics.dispose();<br />

} // paint<br />

} // DataPanel<br />

D.1.3 index.html<br />

<br />

<br />

<br />

/><br />

Prevas &mdash; Scre<strong>en</strong> Transfer<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Bilag D - Kildekode 73


This browser does not have a Java Plug-in.<br />

Get the latest Java Plug-in here.<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

D.1.4 template.css<br />

* {<br />

}<br />

body {<br />

}<br />

margin: 0;<br />

padding: 0;<br />

font: 76%/1.3em "Trebuchet MS", Helvetica, Verdana, Arial, sans-serif;<br />

#cont<strong>en</strong>t {<br />

color: #333333;<br />

font-size: 1.1em;<br />

}<br />

#transmitter {<br />

border-top: 1px dashed #CCDDEE;<br />

border-left: 1px dashed #CCDDEE;<br />

position: absolute;<br />

bottom: 0;<br />

right: 0;<br />

}<br />

D.2 Modtager<br />

D.2.1 main.c<br />

#include <br />

#include "init.h"<br />

#include "picu<strong>til</strong>.h"<br />

// signal // defaults<br />

#define MEAN_SIGNAL_OFFSET_VALUE 15 // 15<br />

#define SIGNAL_TRIGGER_LEVEL_PCT 5 // 5<br />

#define PERIOD_READ_DIVIDER 2 // 2<br />

#define PROGRAMMER_MODE_TICKS 2<br />

// user interface<br />

#define NUMBER_OF_PERIODS 20<br />

#define TIMEOUT 3000<br />

#define NUMBER_OF_LEDS 7<br />

#define LED_SPEED 2<br />

// serial communication - 8N1<br />

#define START_BIT 1<br />

#define STOP_BIT !START_BIT<br />

#define DATA_BITS 8<br />

74 Bilag D - Kildekode


decode<br />

#define ASCII_OFFSET 32<br />

#define START_BYTE (128-ASCII_OFFSET)<br />

#define STOP_BYTE (129-ASCII_OFFSET)<br />

#define MODULO START_BYTE<br />

// eeprom<br />

#define DATA_BANK0 0x00<br />

#define DATA_BANK1 0x80<br />

#define DATA_BANK_EMPTY 0xFF<br />

#define CHECK_BYTE_ADR 1<br />

// statemachines<br />

<strong>en</strong>um operation{ OP_RESET, OP_NORMAL, OP_SIGNAL, OP_INIT,<br />

OP_READY, OP_DATA, OP_MODE, OP_FINISH };<br />

unsigned char operation = OP_RESET;<br />

<strong>en</strong>um mode{ MODE_NONE, MODE_RECEIVE };<br />

unsigned char mode = MODE_NONE;<br />

// normal<br />

unsigned char pulse_count = 0;<br />

// analog signal<br />

signed int mean_signal = 0;<br />

signed int mean_signal_old = 0;<br />

unsigned char edge_detected = false;<br />

// digital values<br />

<strong>en</strong>um digital_value{ LOW, HIGH };<br />

unsigned char digital_value;<br />

// digital controls<br />

unsigned char digital_value_ready = false;<br />

unsigned int period_detected = 0;<br />

unsigned int period_time = 0;<br />

unsigned char virtual_clock = false;<br />

unsigned int idle_time = 0;<br />

// data banks<br />

unsigned char bank_active;<br />

unsigned char bank_temp;<br />

// display & debugging<br />

unsigned char led_refresh = false;<br />

// function prototypes<br />

void square_wave(void);<br />

void bank_select(void);<br />

void display(unsigned char value);<br />

void main(void){<br />

unsigned char text_l<strong>en</strong>gth;<br />

unsigned char data_buffer_next;<br />

unsigned char data_buffer;<br />

unsigned int checksum;<br />

unsigned char data_byte;<br />

unsigned char read_char;<br />

unsigned char led_value;<br />

unsigned char led_unit;<br />

unsigned int period_prev;<br />

init(); // device setup<br />

for(;;){ // forever...<br />

square_wave();<br />

// square_wave2(mean_signal, mean_signal_old, &edge_detected, &digital_value);<br />

// g<strong>en</strong>erate square wave<br />

// program control<br />

switch(operation){<br />

case(OP_RESET): // system reset<br />

bank_select(); // choose data storage<br />

Bilag D - Kildekode 75


mode<br />

+read_char);<br />

// ** testing ** //<br />

// period_detected = 40;<br />

// operation = OP_INIT;<br />

// l<strong>en</strong>gth of text to display<br />

text_l<strong>en</strong>gth = eeprom_read(bank_active);<br />

virtual_clock = false;<br />

period_detected = 0;<br />

period_prev = !period_detected;<br />

data_buffer = 0;<br />

data_buffer_next = 0;<br />

data_byte = 0;<br />

led_refresh = true;<br />

led_value = 0;<br />

led_unit = 0;<br />

read_char = 0;<br />

operation = OP_NORMAL;<br />

break; // <strong>en</strong>d of OP_RESET<br />

case(OP_NORMAL): // programming mode NOT detected<br />

if(mean_signal_old && edge_detected){ // search for signal<br />

edge_detected = false;<br />

}<br />

if(++pulse_count == PROGRAMMER_MODE_TICKS){ // switch<br />

}<br />

idle_time = 0;<br />

operation = OP_SIGNAL;<br />

// simulate wavecard output<br />

if(led_refresh){<br />

led_refresh = false;<br />

if(read_char >= text_l<strong>en</strong>gth)<br />

read_char = 0;<br />

}<br />

led_value = eeprom_read(bank_active + CHECK_BYTE_ADR + +<br />

break; // <strong>en</strong>d of OP_NORMAL<br />

case(OP_SIGNAL): // measure signal's pulse period<br />

if(mean_signal_old && edge_detected){ // first edge detected<br />

edge_detected = false;<br />

}<br />

// find signal periods<br />

if(digital_value == LOW){ // falling edge<br />

if(period_time){ // digital high period available<br />

period_detected = period_time;<br />

period_time = 0;<br />

}<br />

} else if(digital_value == HIGH){ // rising edge<br />

if(period_time){ // digital low period available<br />

period_prev = period_time;<br />

period_time = 0;<br />

}<br />

}<br />

if(idle_time > TIMEOUT)<br />

operation = OP_RESET;<br />

// compare the low and high periods<br />

if(period_detected == period_prev) // signal period detected<br />

operation = OP_INIT;<br />

// indicate measuring<br />

led_value = led_refresh? 0b0000001 : 0b0000010;<br />

break; // <strong>en</strong>d of OP_SIGNAL<br />

76 Bilag D - Kildekode


full<br />

+;<br />

case(OP_INIT): // signal detected<br />

virtual_clock = period_detected/PERIOD_READ_DIVIDER;<br />

operation = OP_READY;<br />

idle_time = 0;<br />

break; // <strong>en</strong>d of OP_INIT<br />

case(OP_READY): // ready to receive data<br />

if(digital_value == START_BIT){<br />

digital_value_ready = false;<br />

period_time = virtual_clock; // synchronize period<br />

idle_time = 0;<br />

}<br />

operation = OP_DATA;<br />

if(idle_time > TIMEOUT)<br />

operation = OP_RESET;<br />

if(!mode)<br />

led_value = period_detected; // display period<br />

break; // <strong>en</strong>d of OP_READY<br />

case(OP_DATA): // serial data reception<br />

if(digital_value_ready){ // read and store data bit<br />

digital_value_ready = false;<br />

if(data_buffer_next != DATA_BITS){ // data buffer NOT<br />

idle_time = 0;<br />

// ** testing ** //<br />

eeprom_write(++data_byte, data_buffer);<br />

synchronize period<br />

reception<br />

initialize checksum<br />

number of data bytes received<br />

}<br />

// store bit value from LSB to MSB, ex. --101010<br />

data_buffer |= digital_value (int)(period_detected*NUMBER_OF_PERIODS)){<br />

idle_time = 0;<br />

mode = MODE_NONE;<br />

operation = OP_READY;<br />

}<br />

if(mode == MODE_RECEIVE)<br />

led_value = led_refresh? 0b0000001 : 0b0000010;<br />

else<br />

led_value = period_detected; // display period<br />

break; // <strong>en</strong>d of OP_DATA<br />

case(OP_MODE): // select program mode<br />

switch(mode){<br />

case(MODE_NONE): // no mode defined<br />

if(data_buffer == START_BYTE){ // start data<br />

}<br />

checksum = START_BYTE;//<br />

data_byte = 0; //<br />

mode = MODE_RECEIVE;<br />

Bilag D - Kildekode 77


eceived<br />

checksum byte<br />

with check byte in cell 1<br />

data_buffer + ASCII_OFFSET);<br />

eeprom_read(CHECK_BYTE_ADR + bank_temp)){<br />

data_byte-1); // activate temporary bank<br />

DATA_BANK_EMPTY); // inactivate other bank<br />

TIMEOUT/NUMBER_OF_LEDS*LED_SPEED;<br />

} // main<br />

} // operation<br />

operation = OP_READY;<br />

break; // <strong>en</strong>d of false mode<br />

case(MODE_RECEIVE): // receiving data<br />

if(data_buffer != STOP_BYTE){ // more text<br />

// calculate weighted sum - ignore<br />

checksum += data_byte * data_buffer;<br />

// store data in temporary bank starting<br />

eeprom_write(++data_byte + bank_temp,<br />

// wait for next byte<br />

operation = OP_READY;<br />

} else { // stop byte detected<br />

// calculate checksum from weighted sum<br />

checksum %= MODULO;<br />

}<br />

} // mode control<br />

// reset data buffer<br />

data_buffer_next = 0;<br />

data_buffer = 0;<br />

break; // <strong>en</strong>d of OP_MODE<br />

// check to see if checksum is valid<br />

if(checksum + ASCII_OFFSET ==<br />

// store data l<strong>en</strong>gth<br />

eeprom_write(bank_temp,<br />

eeprom_write(bank_active,<br />

// change bank<br />

bank_select();<br />

idle_time = 0;<br />

led_unit =<br />

operation = OP_FINISH;<br />

} else { // checksum not valid<br />

idle_time = 0;<br />

operation = OP_READY;<br />

}<br />

mode = MODE_NONE;<br />

break; // <strong>en</strong>d of MODE_RECEIVE<br />

case(OP_FINISH): // data successfully received<br />

if(idle_time >= TIMEOUT/2)<br />

operation = OP_RESET;<br />

led_value = (1 > 1;<br />

break; // <strong>en</strong>d of OP_FINISH<br />

// LED control<br />

display(led_value); // display status on wavecard<br />

// signal debugging - scope on port RA7<br />

RA7 = digital_value;<br />

} // forever...<br />

78 Bilag D - Kildekode


it-manipulated square wave g<strong>en</strong>eration<br />

void square_wave(void){<br />

value<br />

trigger value<br />

signed int signal_low_margin = 0;<br />

signed int signal_high_margin = 0;<br />

unsigned int trigger_low = 0;<br />

unsigned int trigger_high = 0;<br />

// define signal margins according to last measure<br />

signal_high_margin = mean_signal_old + MEAN_SIGNAL_OFFSET_VALUE;<br />

signal_low_margin = mean_signal_old - MEAN_SIGNAL_OFFSET_VALUE;<br />

// define wh<strong>en</strong> signal triggers the edge<br />

trigger_high = (signal_high_margin * SIGNAL_TRIGGER_LEVEL_PCT) / 100;<br />

trigger_low = (signal_low_margin * SIGNAL_TRIGGER_LEVEL_PCT) / 100;<br />

if(mean_signal >= (signal_high_margin+trigger_high)){ // signal above trigger<br />

if(digital_value != LOW){ // signal has changed<br />

edge_detected = true;<br />

digital_value = LOW;<br />

}<br />

} else if(mean_signal


BIT_CLR clears in 'obj', the bits that are specified by 'mask'.<br />

#define BIT_CLR(obj, mask) ((obj) &= ~(mask))<br />

// BIT_TGL toggles in 'obj', the bits that are specified by 'mask'.<br />

#define BIT_TGL(obj, mask) ((obj) ^= (mask))<br />

// BIT_CPY copies into 'obj', the bits in 'val' that are specified by 'mask'.<br />

#define BIT_CPY(obj, mask, val) ((obj) ^= (((obj) ^ (val)) & (mask)))<br />

typedef char* String;<br />

extern void delay(unsigned long delay_time);<br />

#<strong>en</strong>dif /*PICUTIL_H_*/<br />

D.2.3 picu<strong>til</strong>.c<br />

// U<strong>til</strong>ities for Microchip PIC<br />

#include <br />

// *** Pulling delay ***<br />

void delay(unsigned long delay_time)<br />

{<br />

delay_time *= 150;<br />

while (--delay_time) continue;<br />

}<br />

D.2.4 Init.h<br />

// Peripheral initialization function<br />

extern void init(void);<br />

D.2.4 init.c<br />

#include <br />

/* Program device configuration word<br />

* Oscillator = INTRC-RA6 is Port I/O<br />

* Watchdog Timer = Off<br />

* Power Up Timer = On<br />

* MCLR Select Bit = RA5 is MCLR<br />

* Brown Out Detect = Off<br />

* Low Voltage Program = Disabled<br />

* Data EE Read Protect = Disabled<br />

* Flash Program Write = Write Protection Disabled<br />

* Background Debug = Disabled<br />

* CCP1 Mux = RB2<br />

* Code Protect = Disabled<br />

*/<br />

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & BORDIS & LVPDIS & UNPROTECT & WRTEN & DEBUGDIS &<br />

CCPRB2 & UNPROTECT);<br />

// Peripheral initialization function<br />

void init(void){<br />

/***** Common Code ****<br />

* Timer 1 interrupt <strong>en</strong>abled.<br />

* A2D interrupt <strong>en</strong>abled<br />

*/<br />

PIE1 = 0b01000001;<br />

/*<br />

* Portbit7:4 interrupt-on-change disabled<br />

* Peripheral interrupts <strong>en</strong>abled<br />

* Global interrupt disabled during initialization<br />

*/<br />

80 Bilag D - Kildekode


INTCON = 0b01000000;<br />

/*<br />

* Weak pullup on PORT disabled<br />

*/<br />

OPTION = 0b10000000;<br />

/*<br />

* Port directions: 1=input, 0=output<br />

* A2D Converter input (AN0) on RA0<br />

*/<br />

TRISA = 0b00000001; // set AN0 as input to solar cells<br />

PORTA = 0b00000000; // reset port A<br />

/***** 16F819 Code ****<br />

* Internal oscillator set to 8MHz<br />

*/<br />

OSCCON = 0b01110000;<br />

/***** A2D Converter Code ****<br />

* A2D module powered up<br />

* Channel selected is AN3<br />

* conversion clock derived from internal A2D RC Oscillator<br />

*/ //port:___<br />

ADCON0 = 0b11000001; // NB: ADC not startet<br />

ADCON0 |= 0b00000100; // start ADC conversion<br />

/*<br />

* Analog/Digital ports using configuration 4<br />

* Format is right justified<br />

*/<br />

ADCON1 = 0b10000100;<br />

/***** EEPROM Code ****<br />

* EEPROM interrupt <strong>en</strong>abled.<br />

*/<br />

PIE2 = 0b00010000;<br />

/***** PortB Code ****<br />

* Port directions: 1=input, 0=output<br />

*/<br />

TRISB = 0b00000001; // digital out on bit 0<br />

// TRISB = 0b00000001; // LEDs on bits 7-1<br />

PORTB = 0b11111111; // reset LEDs<br />

}<br />

D.2.5 isr.c<br />

/***** Timer 1 Code ****<br />

* Timer is active and running<br />

* Timer derived from system clock<br />

* External clock input is not synchronized<br />

* T1 oscillator circuit (for external input) is inactive<br />

* Timer prescaler is 1:1<br />

*/<br />

T1CON = 0b00000101;<br />

// TMR1 Preset = 45541 - Freq = 999.50 Hz - Period = 0.001001 seconds<br />

TMR1H = 248; // preset for timer1 MSB register<br />

TMR1L = 47; // preset for timer1 LSB register<br />

ei(); // Global interrupts <strong>en</strong>abled<br />

// Interrupt service routines<br />

#include <br />

#include "picu<strong>til</strong>.h"<br />

#define RAW_SIGNAL_BUFFER_LENGTH 3 // 3<br />

#define SIGNAL_MEASURE_MS 10 // 10<br />

#define PROGRAMMER_TIMEOUT_MS 100<br />

#define LED_REFRESH_MS 250<br />

Bilag D - Kildekode 81


normal operation<br />

extern unsigned char pulse_count;<br />

// ADC manipulation<br />

extern signed int mean_signal;<br />

extern signed int mean_signal_old;<br />

// square wave detection<br />

extern unsigned int period_time;<br />

extern unsigned int period_detected;<br />

extern unsigned char virtual_clock;<br />

// digital values<br />

extern unsigned char digital_value_ready;<br />

extern unsigned int idle_time;<br />

// debugging<br />

extern unsigned char led_refresh;<br />

void interrupt my_isr(void){<br />

// ADC<br />

static unsigned int raw_signal;<br />

static unsigned int raw_signal_buffer[RAW_SIGNAL_BUFFER_LENGTH];<br />

static unsigned char raw_signal_buffer_next = 0;<br />

// Timer 1<br />

static unsigned char pulse_count_time = 0;<br />

static unsigned int led_delay = 0;<br />

static unsigned int signal_measure_time = 0;<br />

static unsigned char signal_measure_ready = false;<br />

unsigned int i,sum;<br />

if((ADIE)&&(ADIF)){ // ADC interrupted<br />

// read A/D-signal from scre<strong>en</strong><br />

raw_signal = (ADRESH


} // my_isr<br />

// detect programming mode<br />

if(++pulse_count_time == PROGRAMMER_TIMEOUT_MS){<br />

pulse_count_time = 0;<br />

pulse_count = 0;<br />

}<br />

period_time++;<br />

if(virtual_clock){ // period time detected<br />

if(period_time == period_detected) // define signal's period time<br />

period_time = 0;<br />

}<br />

} // Timer1<br />

idle_time++;<br />

if(period_time == virtual_clock) // read bit value<br />

digital_value_ready = true;<br />

// TMR1 Preset = 45541 - Freq = 999.50 Hz - Period = 0.001001 seconds<br />

TMR1H = 248; // preset for timer1 MSB register<br />

TMR1L = 47; // preset for timer1 LSB register<br />

// restart timer<br />

TMR1IF = 0; // clear ev<strong>en</strong>t flag<br />

TMR1IE = 1; // <strong>en</strong>able interrupt<br />

if((EEIE)&&(EEIF)){ // EEPROM interrupted<br />

WREN = 0; // disable EEPROM write<br />

EEIF = 0; // clear ev<strong>en</strong>t flag<br />

} // EEPROM<br />

D.3 S<strong>en</strong>der<br />

D.3.1 Transmitter.java<br />

package transmit;<br />

// Core packages<br />

import java.awt.*;<br />

import java.awt.ev<strong>en</strong>t.*;<br />

if(WRERR){ // errors occured<br />

WRERR = 0; // clear the flag<br />

// TODO...<br />

}<br />

// Ext<strong>en</strong>sion packages<br />

import javax.swing.*;<br />

import javax.swing.ev<strong>en</strong>t.ChangeEv<strong>en</strong>t;<br />

import javax.swing.ev<strong>en</strong>t.ChangeList<strong>en</strong>er;<br />

/**<br />

* 'Transmitter' is a web application for transferring<br />

* data from the scre<strong>en</strong> to an electronic device. It has<br />

* debugging facilities to control the duty cycle and<br />

* period of the digital signals.<br />

*<br />

* @author Hasse Bylov - hasse@bylov.com<br />

* @see http://www.micromedia.dk/wavecard/index.php<br />

* @see http://www.micromedia.dk/wavecard/index.php?debug<br />

*<br />

*/<br />

public class Transmitter ext<strong>en</strong>ds JApplet {<br />

Bilag D - Kildekode 83


private static final long serialVersionUID = 5811536125471100063L;<br />

private static final int PERIOD_MIN = 10;<br />

private static final int PERIOD_MAX = 1000;<br />

private static final int PERIOD_INIT = 50;<br />

private static final int DUTY_MIN = 0;<br />

private static final int DUTY_MAX = 100;<br />

private static final int DUTY_INIT = 50;<br />

private static final int HIGH_CONTRAST = 0;<br />

private static final int LOW_CONTRAST = 255;<br />

private static final int COLOR_DEPTH_MAX = 255;<br />

private static final int COLOR_DEPTH_MIN = 0;<br />

private static final int COLOR_DEPTH_STEP = 1;<br />

private static final int NUMBER_OF_ROWS = 4;<br />

private static final int NUMBER_OF_COLUMNS = 4;<br />

private static final int TEXT_FIELD_LENGTH = 15;<br />

private static final int SYSTEM_LAYOUT = 2;<br />

// System<br />

private UIManager.LookAndFeelInfo looks[];<br />

// Panels<br />

private JPanel periodPanel;<br />

private JPanel dutycyclePanel;<br />

private JPanel contrastPanel;<br />

private JPanel statusPanel;<br />

private JPanel debugPanel;<br />

private JPanel userPanel;<br />

private JPanel controlPanel;<br />

private DataPanel outputPanel;<br />

// Debugging<br />

private JLabel periodLabel;<br />

private JSlider periodSlider;<br />

private JLabel periodValueLabel;<br />

private JLabel periodUnitLabel;<br />

private JLabel dutycycleLabel;<br />

private JSlider dutycycleSlider;<br />

private JLabel dutycycleValueLabel;<br />

private JLabel dutycycleUnitLabel;<br />

private JLabel lowContrastLabel;<br />

private SpinnerNumberModel lowContrast;<br />

private JSpinner lowContrastSpinner;<br />

private JLabel highContrastLabel;<br />

private JSpinner highContrastSpinner;<br />

private SpinnerNumberModel highContrast;<br />

private JToggleButton operateButton;<br />

// User compon<strong>en</strong>ts<br />

private JTextField dataField;<br />

private JButton detectButton;<br />

private JButton transmitButton;<br />

/**<br />

* init() is the applet's main method where things are setup once<br />

*/<br />

public void init() {<br />

try { // Set up the user interface<br />

javax.swing.SwingU<strong>til</strong>ities.invokeAndWait(new Runnable() {<br />

public void run() {<br />

createGUI();<br />

}<br />

});<br />

} catch (Exception e) { // an unknown error occurred<br />

System.err.println("createGUI() didn't successfully complete");<br />

}<br />

} // init<br />

/**<br />

* changeLookAndFeel() makes the user interface look<br />

* like the user's operating system<br />

* @param int look number<br />

*/<br />

private void changeLookAndFeel(int value) {<br />

84 Bilag D - Kildekode


try {<br />

UIManager.setLookAndFeel(looks[value].getClassName());<br />

SwingU<strong>til</strong>ities.updateCompon<strong>en</strong>tTreeUI(this);<br />

} catch (Exception e) {<br />

e.printStackTrace();<br />

}<br />

} // changeLookAndFeel<br />

/**<br />

* getFrequ<strong>en</strong>cy() calculates the frequ<strong>en</strong>cy<br />

* from the data panel's period and hacks<br />

* it to return a decimal value<br />

* @return double frequ<strong>en</strong>cy in Hz<br />

*/<br />

private double getFrequ<strong>en</strong>cy() {<br />

double frequ<strong>en</strong>cy = 1000.0 / (double)(outputPanel.getPeriod());<br />

return Math.round(frequ<strong>en</strong>cy * 100.0) / 100.0;<br />

} // getFrequ<strong>en</strong>cy<br />

/**<br />

* createGUI() sets up the panels, sliders and buttons<br />

*/<br />

private void createGUI() {<br />

// Debug panel<br />

periodLabel = new JLabel("Period:");<br />

periodLabel.setLabelFor(periodSlider);<br />

periodSlider = new JSlider(SwingConstants.HORIZONTAL, PERIOD_MIN, PERIOD_MAX,<br />

PERIOD_INIT);<br />

periodSlider.setMajorTickSpacing(PERIOD_MAX-PERIOD_MIN);<br />

periodSlider.setPaintTicks(true);<br />

periodSlider.setPaintLabels(true);<br />

periodValueLabel = new JLabel("");<br />

periodUnitLabel = new JLabel("ms");<br />

DUTY_INIT);<br />

dutycycleLabel = new JLabel("Duty cycle:");<br />

dutycycleLabel.setLabelFor(dutycycleSlider);<br />

dutycycleSlider = new JSlider(SwingConstants.HORIZONTAL, DUTY_MIN, DUTY_MAX,<br />

dutycycleSlider.setMajorTickSpacing(25);<br />

dutycycleSlider.setPaintTicks(true);<br />

dutycycleSlider.setPaintLabels(true);<br />

dutycycleValueLabel = new JLabel("");<br />

dutycycleUnitLabel = new JLabel("%");<br />

lowContrastLabel = new JLabel("Low:");<br />

lowContrastLabel.setLabelFor(lowContrastSpinner);<br />

lowContrast = new SpinnerNumberModel(LOW_CONTRAST, COLOR_DEPTH_MIN,<br />

COLOR_DEPTH_MAX, COLOR_DEPTH_STEP);<br />

lowContrastSpinner = new JSpinner(lowContrast);<br />

highContrastLabel = new JLabel("High:");<br />

highContrastLabel.setLabelFor(lowContrastSpinner);<br />

highContrast = new SpinnerNumberModel(HIGH_CONTRAST, COLOR_DEPTH_MIN,<br />

COLOR_DEPTH_MAX, COLOR_DEPTH_STEP);<br />

highContrastSpinner = new JSpinner(highContrast);<br />

operateButton = new JToggleButton(" Turn On ");<br />

operateButton.setMnemonic(KeyEv<strong>en</strong>t.VK_T);<br />

periodPanel = new JPanel();<br />

periodPanel.setLayout(new FlowLayout());<br />

periodPanel.add(periodLabel);<br />

periodPanel.add(periodSlider);<br />

periodPanel.add(periodUnitLabel);<br />

dutycyclePanel = new JPanel();<br />

dutycyclePanel.setLayout(new FlowLayout());<br />

dutycyclePanel.add(dutycycleLabel);<br />

dutycyclePanel.add(dutycycleSlider);<br />

dutycyclePanel.add(dutycycleUnitLabel);<br />

contrastPanel = new JPanel();<br />

contrastPanel.setLayout(new FlowLayout());<br />

contrastPanel.add(lowContrastLabel);<br />

contrastPanel.add(lowContrastSpinner);<br />

contrastPanel.add(highContrastLabel);<br />

contrastPanel.add(highContrastSpinner);<br />

contrastPanel.add(operateButton);<br />

Bilag D - Kildekode 85


statusPanel = new JPanel();<br />

statusPanel.setLayout(new FlowLayout());<br />

statusPanel.add(periodValueLabel);<br />

statusPanel.add(dutycycleValueLabel);<br />

debugPanel = new JPanel();<br />

debugPanel.setLayout(new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLUMNS, 0, 0));<br />

debugPanel.setBackground(Color.LIGHT_GRAY);<br />

periodSlider.addChangeList<strong>en</strong>er ( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setPeriod(periodSlider.getValue());<br />

periodValueLabel.setText("Frequ<strong>en</strong>cy:" + getFrequ<strong>en</strong>cy() + "Hz ("<br />

+ outputPanel.getPeriod() + "ms)" );<br />

dutycycleSlider.setValueIsAdjusting(true);<br />

dutycycleSlider.setValueIsAdjusting(false);<br />

}<br />

} );<br />

dutycycleSlider.addChangeList<strong>en</strong>er ( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setDutycycle(dutycycleSlider.getValue());<br />

dutycycleValueLabel.setText("ON-time:" +<br />

outputPanel.getDutyHigh() + "ms OFF-time:" + outputPanel.getDutyLow() + "ms");<br />

}<br />

} );<br />

lowContrast.addChangeList<strong>en</strong>er( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setLowContrast( ((Integer)lowContrast.getValue()).intValue() );<br />

}<br />

} );<br />

highContrast.addChangeList<strong>en</strong>er( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

outputPanel.setHighContrast( ((Integer)highContrast.getValue()).intValue() );<br />

}<br />

} );<br />

operateButton.addChangeList<strong>en</strong>er( new ChangeList<strong>en</strong>er() {<br />

public void stateChanged(ChangeEv<strong>en</strong>t e) {<br />

if(outputPanel.isReady()) { // data panel is not transferring<br />

if(operateButton.isSelected()) {<br />

operateButton.setText(" Turn Off");<br />

outputPanel.setMode("debugmode");<br />

} else if(outputPanel.getMode() == "debugmode") {<br />

operateButton.setText(" Turn On ");<br />

outputPanel.setMode("idlemode");<br />

}<br />

} else { // data panel is busy<br />

operateButton.setSelected(false);<br />

}<br />

}<br />

} );<br />

debugPanel.add(periodPanel);<br />

debugPanel.add(dutycyclePanel);<br />

debugPanel.add(contrastPanel);<br />

debugPanel.add(statusPanel);<br />

// User panel<br />

userPanel = new JPanel();<br />

userPanel.setLayout(new FlowLayout());<br />

userPanel.setBackground(Color.WHITE);<br />

dataField = new JTextField("Greetings", TEXT_FIELD_LENGTH);<br />

detectButton = new JButton("Detect");<br />

detectButton.setMnemonic(KeyEv<strong>en</strong>t.VK_D);<br />

transmitButton = new JButton("Program");<br />

transmitButton.setMnemonic(KeyEv<strong>en</strong>t.VK_P);<br />

dataField.addKeyList<strong>en</strong>er( new KeyAdapter() {<br />

public void keyPressed(KeyEv<strong>en</strong>t e) {<br />

if (e.getKeyCode() == KeyEv<strong>en</strong>t.VK_ESCAPE) {<br />

86 Bilag D - Kildekode


} );<br />

}<br />

detectButton.doClick();<br />

}<br />

if (e.getKeyCode() == KeyEv<strong>en</strong>t.VK_ENTER) {<br />

transmitButton.doClick();<br />

}<br />

detectButton.addActionList<strong>en</strong>er( new ActionList<strong>en</strong>er() {<br />

public void actionPerformed(ActionEv<strong>en</strong>t e) {<br />

if(outputPanel.isReady()) {<br />

if(outputPanel.getMode() != "detectmode") {<br />

operateButton.setSelected(false);<br />

outputPanel.setMode("detectmode");<br />

} else {<br />

outputPanel.setMode("idlemode");<br />

}<br />

}<br />

}<br />

} );<br />

transmitButton.addActionList<strong>en</strong>er( new ActionList<strong>en</strong>er() {<br />

public void actionPerformed(ActionEv<strong>en</strong>t e) {<br />

if(outputPanel.isReady()) {<br />

operateButton.setSelected(false);<br />

outputPanel.setText(dataField.getText());<br />

outputPanel.setMode("programmode");<br />

}<br />

}<br />

} );<br />

userPanel.add(dataField);<br />

userPanel.add(detectButton);<br />

userPanel.add(transmitButton);<br />

// Output panel<br />

outputPanel = new DataPanel(periodSlider.getValue(), dutycycleSlider.getValue(),<br />

((Integer)highContrast.getValue()).intValue(), ((Integer)lowContrast.getValue()).intValue());<br />

outputPanel.setBackground(Color.ORANGE);<br />

// Control panel<br />

controlPanel = new JPanel();<br />

controlPanel.setLayout(new BorderLayout());<br />

controlPanel.setBackground(Color.WHITE);<br />

if(getParameter("debug") != null) // should be "!= null"<br />

controlPanel.add(debugPanel, BorderLayout.NORTH);<br />

controlPanel.add(userPanel, BorderLayout.CENTER);<br />

// Setup panels<br />

Container container = getCont<strong>en</strong>tPane();<br />

container.add(controlPanel, BorderLayout.NORTH);<br />

container.add(outputPanel, BorderLayout.CENTER);<br />

// Show default values<br />

periodSlider.setValueIsAdjusting(true);<br />

periodSlider.setValueIsAdjusting(false);<br />

dutycycleSlider.setValueIsAdjusting(true);<br />

dutycycleSlider.setValueIsAdjusting(false);<br />

looks = UIManager.getInstalledLookAndFeels();<br />

changeLookAndFeel(SYSTEM_LAYOUT);<br />

} // createGUI<br />

} // Transmitter<br />

Bilag D - Kildekode 87


8.2.1 D.3.2 DataPanel.java (version 2)<br />

package transmit;<br />

// Core packages<br />

import java.awt.*;<br />

// Ext<strong>en</strong>sion packages<br />

import javax.swing.JPanel;<br />

/**<br />

* 'DataPanel' is a JPanel used for transferring binary data<br />

* from a normal computer scre<strong>en</strong> on to an electronic device.<br />

* The panel is used with the 'Transmitter' web application.<br />

*<br />

* @author Hasse Bylov - hasse@bylov.com<br />

* @see http://www.micromedia.dk/wavecard/index.php<br />

* @see http://www.micromedia.dk/wavecard/index.php?debug<br />

*<br />

*/<br />

public class DataPanel ext<strong>en</strong>ds JPanel implem<strong>en</strong>ts Runnable {<br />

private static final long serialVersionUID = -2997949170529730708L;<br />

// off-scre<strong>en</strong> buffer<br />

private Image offscre<strong>en</strong>;<br />

// visual control<br />

private boolean bit;<br />

private int period;<br />

private int dutycycle;<br />

private int highContrast;<br />

private int lowContrast;<br />

// mode select<br />

private String mode;<br />

private boolean ready;<br />

// data to transfer<br />

private String text;<br />

// serial<br />

private static final boolean START_BIT = true;<br />

private static final boolean STOP_BIT = !START_BIT;<br />

// <strong>en</strong>coding options<br />

private static final char BYTE_LENGTH = 8;<br />

private static final char DATA_BYTE = 10;<br />

private static final char ASCII_OFFSET = 32;<br />

private static final char START_BYTE = (128 - ASCII_OFFSET);<br />

private static final char STOP_BYTE = (129 - ASCII_OFFSET);<br />

private static final char MODULO = START_BYTE;<br />

// panel constructor<br />

public DataPanel(int period, int dutycycle, int contrastHigh, int contrastLow) {<br />

super();<br />

}<br />

this.period = period;<br />

this.dutycycle = dutycycle;<br />

this.highContrast = contrastHigh;<br />

this.lowContrast = contrastLow;<br />

this.ready = true;<br />

new Thread(this).start();<br />

/*<br />

* trivial getter/setter methods<br />

*/<br />

private boolean getBit() {<br />

return bit;<br />

}<br />

public void setBit(boolean value) {<br />

this.bit = value;<br />

88 Bilag D - Kildekode


}<br />

repaint();<br />

public int getPeriod() {<br />

return period;<br />

}<br />

public void setPeriod(int period) {<br />

this.period = period;<br />

}<br />

private int getDutycycle() {<br />

return dutycycle;<br />

}<br />

public void setDutycycle(int dutycycle) {<br />

this.dutycycle = dutycycle;<br />

}<br />

public int getDutyHigh() { // ON-Time = D*T<br />

return (getDutycycle() * getPeriod()) / 100;<br />

}<br />

public int getDutyLow() { // OFF-Time = (1-D)*T<br />

return ((100-getDutycycle()) * getPeriod()) / 100;<br />

}<br />

public int getHighContrast() {<br />

return highContrast;<br />

}<br />

public void setHighContrast(int high) {<br />

this.highContrast = high;<br />

}<br />

public int getLowContrast() {<br />

return lowContrast;<br />

}<br />

public void setLowContrast(int low) {<br />

this.lowContrast = low;<br />

}<br />

public String getMode() {<br />

return mode;<br />

}<br />

public void setMode(String mode) {<br />

this.mode = mode;<br />

}<br />

public String getText() {<br />

return text;<br />

}<br />

public void setText(String text) {<br />

this.text = text;<br />

}<br />

public boolean isReady() {<br />

return ready;<br />

}<br />

private void setReady(boolean ready) {<br />

this.ready = ready;<br />

}<br />

/**<br />

* dynamicDelay() holds the square wave signal<br />

* for a giv<strong>en</strong> time<br />

* @param int time<br />

*/<br />

private void dynamicDelay(int time) {<br />

long bitPeriod = System.curr<strong>en</strong>tTimeMillis();<br />

while((System.curr<strong>en</strong>tTimeMillis()-bitPeriod) < time) {<br />

try {<br />

Thread.sleep(1);<br />

Bilag D - Kildekode 89


} catch (InterruptedException e) {<br />

e.printStackTrace();<br />

}<br />

}<br />

} // dynamicDelay<br />

/**<br />

* scre<strong>en</strong>Binary() blinks the data panel according<br />

* to the debug controls. Besides the trivial methods<br />

* this is <strong>en</strong>ough to control the test-application<br />

*/<br />

private void scre<strong>en</strong>Binary() {<br />

if(getDutyHigh() > 0) {<br />

setBit(true);<br />

dynamicDelay(getDutyHigh());<br />

}<br />

if(getDutyLow() > 0) {<br />

setBit(false);<br />

dynamicDelay(getDutyLow());<br />

}<br />

} // scre<strong>en</strong>Binary<br />

/**<br />

* detectMode() blinks the data panel with a period<br />

* defined by this.period<br />

*/<br />

private void detectMode() {<br />

// keep high for this.period<br />

setBit(true);<br />

dynamicDelay(getPeriod());<br />

// keep low for this.period<br />

setBit(false);<br />

dynamicDelay(getPeriod());<br />

} // detectMode<br />

/**<br />

* calculateChecksum() finds the checksum of a string<br />

* @param String text<br />

* @return char checksum<br />

*/<br />

private char calculateChecksum(String text) {<br />

int sum = START_BYTE;<br />

for(int i=1; i = 0 ; i--) {<br />

if(binary.charAt(i) == '0')<br />

setBit(false);<br />

else<br />

setBit(true);<br />

90 Bilag D - Kildekode


}<br />

dynamicDelay(getPeriod());<br />

// s<strong>en</strong>d stop bit<br />

setBit(STOP_BIT);<br />

dynamicDelay(getPeriod());<br />

} // transmit<br />

/**<br />

* programMode() handles each step in the <strong>en</strong>coding process<br />

*/<br />

private void programMode() {<br />

char checksum = calculateChecksum(getText()); // calculate<br />

the checksum<br />

transmit(START_BYTE);<br />

// s<strong>en</strong>d start byte<br />

transmit(checksum);<br />

// s<strong>en</strong>d checksum byte<br />

for(int i=0; i < getText().l<strong>en</strong>gth(); i++) // loop<br />

through characters in string<br />

transmit((char)((getText().charAt(i)) - ASCII_OFFSET)); // - and s<strong>en</strong>d each<br />

character<br />

transmit(STOP_BYTE);<br />

// s<strong>en</strong>d stop byte<br />

} // programMode<br />

image<br />

/**<br />

* run() is the default Thread loop, from where<br />

* the program mode is controlled<br />

*/<br />

public void run() {<br />

while(true) { // forever...<br />

if(getMode() == "debugmode") { // test-application<br />

scre<strong>en</strong>Binary();<br />

} else if(getMode() == "detectmode") { // blink for card detection<br />

detectMode();<br />

} else if(getMode() == "programmode") { // blink with data to program card<br />

setReady(false); // lock program<br />

// clear data panel<br />

for(int i=0; i < DATA_BYTE; i++){<br />

setBit(false);<br />

dynamicDelay(getPeriod());<br />

}<br />

programMode(); // s<strong>en</strong>d programming signals<br />

setReady(true); // release program lock<br />

setMode("idlemode"); // return to idle mode<br />

} else { // to avoid CPU overload, system needs idle time<br />

dynamicDelay(50);<br />

}<br />

}<br />

} // run<br />

/**<br />

* invalidate() removes the off-scre<strong>en</strong> buffer<br />

*/<br />

public void invalidate() {<br />

super.invalidate();<br />

offscre<strong>en</strong> = null;<br />

} // invalidate<br />

/**<br />

* update() overrides the default update()<br />

* to NOT erase the background before painting<br />

* @param Graphics g<br />

*/<br />

public void update(Graphics g) {<br />

paint(g);<br />

} // update<br />

/**<br />

* paint() puts everything in place in an off-scre<strong>en</strong> buffer and th<strong>en</strong> shows <strong>en</strong>tire<br />

* on scre<strong>en</strong> at once.<br />

* @param Graphics g<br />

*/<br />

public void paint(Graphics g) {<br />

Bilag D - Kildekode 91


Color highColor = new Color(getHighContrast(), getHighContrast(),<br />

getHighContrast());<br />

Color lowColor = new Color(getLowContrast(), getLowContrast(),<br />

getLowContrast());<br />

if(offscre<strong>en</strong> == null) {<br />

offscre<strong>en</strong> = createImage(getSize().width, getSize().height);<br />

}<br />

Graphics offscre<strong>en</strong>Graphics = offscre<strong>en</strong>.getGraphics();<br />

offscre<strong>en</strong>Graphics.setClip(0, 0, getSize().width, getSize().height);<br />

super.paint(offscre<strong>en</strong>Graphics);<br />

if(getBit()) {<br />

offscre<strong>en</strong>Graphics.setColor(highColor);<br />

offscre<strong>en</strong>Graphics.fillRect(0, 0, getSize().width, getSize().height);<br />

} else {<br />

offscre<strong>en</strong>Graphics.setColor(lowColor);<br />

offscre<strong>en</strong>Graphics.fillRect(0, 0, getSize().width, getSize().height);<br />

}<br />

g.drawImage(offscre<strong>en</strong>, 0, 0, null);<br />

offscre<strong>en</strong>Graphics.dispose();<br />

} // paint<br />

} // DataPanel<br />

D.3.3 index.php<br />

<br />

<br />

<br />

/><br />

Prevas &mdash; Scre<strong>en</strong> Transfer<br />

<br />

<br />

<br />

<br />


<strong>en</strong>dif; ?><br />

height=""><br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!