KUNGL. TEKNISKA HÖGSKOLAN Introduktion i programmering med språket NXC Oliver Bogren Medlaborant: Gabriel Tigerström 2013-09-06 obogren@kth.se II1310 Introduktionskurs i datateknik
Sammanfattning Laborationen har gått ut på att på ett enkelt och roligt sätt få en Lego NXT Robot att följa en svart linje som går i en halvcirkel och träffar en vägg vilket medför att laboranternas namn visas på robotens display samt att en melodi spelas. När laborationen är slut har man då samlat på sig lite kunskap om programmering och datastruktur. En kod var redan färdig men det fanns ett antal fel i den som därför skulle finna åtgärda. Och det gjordes det. Alla fel hittades, vilka var nio stycken, och åtgärdades, varav en onödig funktion som inte behövdes. Dessutom lades en ny melodi in som senare spelades upp till allas förtjusning. Slutsatsen blev att denna laboration är en erfarenhet man kan dra nytta av i fortsatta studier och i yrkeslivet som ingenjör, både genom de misstag man gjorde men också genom samarbete. Innehållsförteckning 1. Inledning... 3 1.1 Bakgrund... 3 1.2 Syfte och målsättning... 3 2. Genomförande... 4 3. Resultat... 4 4. Analys... 5 5. Diskussion... 5 Referenser... 6 Bilagor... Fel! Bokmärket är inte definierat. kommunikationsteknologi, ICT Kungl. Tekniska Högskolan Sida 2 av 7
1. Inledning Programmering är grundpelaren inom IT. Det är genom programmering som IT-system och elektronik kan fungera. Många vet inte om hur en iphone eller dator fungerar, de bara använder dessa produkter utan att tänka på hur mycket kod, och möda, det har lagts i dessa system som får dem att fungera. Därför är det viktigt att så många som möjligt har kunskap om programmering inför framtida projekt. Denna laboration hade som syfte och mål att man tar del av och lär sig lite mer om programmering, genom att göra det på ett roligt sätt. Ett roligt sätt är då att få en robot att kunna göra en uppgift, och det blir roligare och mer lärorikt genom parprogrammering där man turas om att programmera och vara kontrollant. Det blir då lättare att finna fel i koden och laborationen kan avklaras snabbare än om man var ensam. 1.1 Bakgrund Inom informations- och kommunikationsteknologi samt andra ingenjörsjobb, är programmering en mycket viktig del. Utan programmeringsspråk som Java, C, Assembly, PHP m.m., skulle det vara ganska tråkigt. Man skulle inte kunna göra så mycket med våra datorer då. Programmeringsspråk av olika typer är det som bygger upp hela mjukvaran (och nära hårdvaran) i all elektronik man kan tänka sig. Därför är det bra att man tidigt i utbildningen börjar lära sig programmering, för det kommer man verkligen ha nytta av i yrkeslivet som ingenjör. Lego NXT är inte som vanlig Lego, där man bygger föremål med olika plastbitar som passar ihop. Med Lego NXT kan man göra så mycket mer. Genom programmering är det möjligt att få en Lego-robot att göra det den programmerad till att göra, vilket kan vara att dansa med en melodi som den spelar, tävla mot en annan robot i sumobrottning, eller varför inte bygga en Lego-bil? Bara fantasin sätter gränser. 1.2 Syfte och målsättning Syftet med laborationen är som titeln antyder, nämligen att bli introducerad i programmering. Att programmera i NXC och få en Lego NXT robot att göra något, är därför ett väldigt bra och roligt sätt att fatta tycke för programmering. Genom att programmera i par genom parprogrammering blir också felmarginalerna förmodligen mindre samt att man blir bättre på att samarbeta. Och när det kommer till samarbete, kommer det bli mycket av det i livet som ingenjör eftersom det är genom bra samarbete som resultaten blir bra. Givetvis kommer man dessutom ha nytta av detta projekt i fortsättningen av utbildningen. Dels för att man har tagit del av systemet Bilda och lärt sig hur det fungerar och dels rapportskrivning för det kommer det bli mycket av, för att inte prata om programmering. När laborationen väl är genomförd, skall man ha lite förståelse för hur man programmerar i NXC och testar program i en Lego NXT robot. Detta är bra för kommande programmeringskurser, då alla programmeringsspråk är ganska lika varandra. Dessutom har man då tränat på att felsöka och rätta till kod, vilket bidrar till ens noggrannhetstänk. Huvudmålet med laborationen är att lyckas med att få roboten att följa en svart halvcirkel som går från en vägg tillbaka till samma vägg, och när dess trycksensorer aktiverats skall laboranternas namn visas upp på robotens display och en liten melodi spelas. kommunikationsteknologi, ICT Kungl. Tekniska Högskolan Sida 3 av 7
2. Genomförande Laborationen inleddes med att noga undersöka vad själva uppgiften var, både i labb-pm och det som var skrivet på tavlan. Först och främst laddades drivrutinen för Lego NXT ner till medlaborantens Linux-dator. Drivrutinen fanns att ladda ner under kursmaterial på KTH Bilda. Därefter laddades Bricx Command Center ner, vilket är programmet för att redigera källkod samt kompilera koden och flasha roboten. BricxCC fungerar inte på Linux-datorer, men medlaboranten löste detta genom att följa instruktionerna på en hemsida 1 specialiserad på Lego NXT. När alla förberedelser var klara var det bara att börja analysera koden. Olika typer av fel i kod hittades, såsom fel sensor inställd, onödig dance -funktion som får roboten att dansa, fel hjul inställda för att köra samt mindre simpla fel som integer istället för string när namn ska hanteras. Genom parprogrammeringen blev det lättare för båda parter att hitta kod som är skriven fel. Medlaboranten började först då han har mer erfarenhet, men sen turades det om och båda fick på så vis känna på parprogrammering som fungerar. Som en liten extrauppgift lades en ny melodi in i koden, vilket var melodin för Nyan Cat. Bara att få det att fungera tog lite tid. Efter all kodändring testkördes roboten och den följde linjen bra och träffade väggen. Inställningen för min- och maxfart ändrades för att göra körningen så jämn som möjligt, detta genom att sätta min-fart ganska nära max-fart. 3. Resultat Laborationen lyckades. Roboten lyckades följa den angivna linjen, som bildade en halvcirkel efter väggen, och vid träff mot vägg visade robotens display laboranternas namn. Fem sekunder efter träff spelades melodin i Nyan Cat upp. I tabellen nedan visas var i koden som ändringar gjordes. Radnumret säger var koden skrevs i den ursprungliga koden, inte den nya. Radnummer Ny kod Kommentar 34 String groupmembers[]= { Från int till String, för att vi måste hantera namn och inte tal 35 Oliver, Gabriel Lägger in våra namn i groupmembers 76 lightintensity = SensorRaw(IN_3) IN_1 till IN_3 (IN_1 är trycksensorn) 45 TextOut(0, LCD_LINE2 (8*I + 16)), names[i]; 8*i 16 8*i + 16 Skriver ut namnen 16 pixlar från gruppmedlemmar 93 OnFwd(Out_B, SpeedSlow); Ändrar från hjul A till hjul B 97 OnFwd(Out_A, SpeedFast); Ändrar från hjul B till hjul A 114 //dance(); Kommenterade bort dance - funktionen. Detta bidrog till en mjukare start. 2 #define SpeedSlow 30 Lägsta hastighet 3 #define SpeedFast 50 Högsta hastighet I readtouchsensors() Wait(SEC_5); Väntar 5 sekunder tills melodin spelas upp 32 248 Void nyan() { Programmet för Nyan Cat melodin. Krävde drygt 200 rader bara det. 1 BricxCC running on Linux, http://www.rjmcnamara.com/lego-minstorms/bricxcc-running-linux-2/, hämtad 29/8 kommunikationsteknologi, ICT Kungl. Tekniska Högskolan Sida 4 av 7
PlayTone(1480,240); Wait(200); : :. 4. Analys Analysera kort resultatet av laborationen. Varför gick det som det gick? Vad gick bra/dåligt? Vilka funktioner/loopar/variabler/villkor låg bakom robotens beteende? Det mesta gick bra på laborationen, men det finns små fel som kan korrigeras så att roboten kan bete sig bättre. Ett exempel är att roboten gick lite hackigt fram på tejpen. Detta beror på att det var en för stor skillnad mellan inställningarna för lägsta och högsta hastighet, 30 (enhet?) för lägsta och 50 för högsta. Dessa finns definierade i början av koden. Och när det kommer till koden finns det en del som kan vara bra att känna till. En viktig funktion i koden är void -funktionen. Det är en funktion som inte returnerar något värde. I koden ligger den bakom melodin för Nyan Cat, visning av text på display, den onödiga dance -funktionen samt för ljussensorn när värdet läses av. Det är lite paradoxalt att säga att en funktion som inte returnerar ett värde ändå är så viktig. Andra viktiga delar i koden för att roboten ska bete sig som önskat, är loopar. En if- och while - loop kollar igenom villkor och ser om de är sanna. Om det är så, loopar den om igen och gör en ny koll igen. Detta upprepas tills de villkor och/eller variabler som står under if eller while inte stämmer med det faktiska, då loopen kan brytas och processen fortsätter i resten av programmet. I detta fall används detta i funktionerna för avläsning av sensorvärden, alltså ljus- och trycksensorn, vilka är task readtouchsensors() samt task followline(). I funktionen task followline() avläses ljussensorns värden, int lightintensity (heltal), som den svarta tejpen ger och om värdena uppfyller olika villkor som ligger inom ramen för tejpen, kan då robotens hastighet och riktning justeras. (Kolla rad 2, 3, 93 & 97 i koden) 5. Diskussion Man kan med all säkerhet konstatera att man verkligen haft nytta av parprogrammering. Arbetet gick smidigt till bortsett från krånglet med BricxCC för Linux. Om utvecklarna kunde göra BricxCC kompatibel med Linux, skulle det uppskattas av många trots att det finns lösningar på detta. När det kommer till NXC, är det ett helt okej programmeringsspråk då den är nästan precis som C och därför någorlunda bekant om man har erfarenhet av C sedan tidigare. Det första man tänker när man har gjort denna laboration är att man är glad att det lyckades samt att det var roligt göra. Sen vet man inte om man har lärt sig jättemycket, då det var första gången man gjorde detta och att laborationen inte varade jättelänge. Men man har faktiskt lärt sig en del om man verkligen tänker efter. Man har samarbetat genom parprogrammering vilket gynnar samarbete med andra och man har dessutom fått en insyn i hur en kod och vissa funktioner fungerar. I framtida studier kommer man ha nytta av detta, för det kommer bli en del kod att skriva med många loopar, men det kommer vara mycket mer att lära sig. Genom att börja med något enkla koder, som i laborationen, kommer det bli mycket lättare att ta sig an större utmaningar i framtiden istället för att hoppa på en stor uppgift direkt. kommunikationsteknologi, ICT Kungl. Tekniska Högskolan Sida 5 av 7
Båda laboranter är nöjda över arbetet i laborationen, men det hade ju alltid kunnat gå bättre. Om dance -funktionen hade hittats tidigare hade det flutit på ännu bättre. Det hade gått att förhindra detta misstag genom att noga kolla igenom koden innan man testkörde roboten, för det blev många testkörningar. Raderna som krävdes för att skapa melodin för Nyan Cat hade möjligtvis kunnat gå att korta ner, genom att kanske skapa en array, men i överlag blev resultatet lyckat. Slutsatsen är att lösningsmetoden inte var optimal, men det var också första laborationen och man kan dra nytta av sina misstag i framtiden. Det går också att konstatera att samarbete är A och O här, och det kommer bli mycket mer av det framöver. Referenser 1. Labb-PM 2. D. Benedettelli, Programming Lego NXT Robots using NXC, 2007, sida 5-27 3. BricxCC running on Linux, http://www.rjmcnamara.com/lego-minstorms/bricxcc-runninglinux-2/, hämtad 29/8 kommunikationsteknologi, ICT Kungl. Tekniska Högskolan Sida 6 av 7
Bilagor Bild: Skärmdump från dagboksinlägget som skrevs under laborationstillfället. kommunikationsteknologi, ICT Kungl. Tekniska Högskolan Sida 7 av 7