Optisk dataoverførsel til en microcontroller - Danmarks Tekniske ...
Optisk dataoverførsel til en microcontroller - Danmarks Tekniske ...
Optisk dataoverførsel til en microcontroller - Danmarks Tekniske ...
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 — 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 — Scre<strong>en</strong> Transfer<br />
<br />
<br />
<br />
<br />
<strong>en</strong>dif; ?><br />
height=""><br />