KUNGLIGA TEKNISKA HÖGSKOLAN LEGO Mindstorm-robot Programmering av LEGO Mindstorm-robot i språket NXC Kim Hammar 2/6-2013 Kimham@kth.se Introduktionskurs i Datateknik 1311
Sammanfattning En viktig del av att vara ingenjör är att kunna arbeta med projekt och i grupp, som student på ICT skolan krävs det även datatekniska kunskaper. Laborationen är en introduktion till ingenjörstänk, parprogrammering och språket NXC, Uppgiften är att felsöka och modifiera en färdig kod för att få roboten att följa instruktionerna, som just i detta fall var: Följa den svarta tejpen tills den går emot något, då ska roboten stanna, spela upp en melodi samt skriva ut gruppmedlemmarnas namn på skärmen. Vi fick fram en lösning för att få roboten att gör som vi ville. Eftersom att vi i labbgruppen endast programmerat enstaka gånger tidigare så använde vi oss av metoden testköra robot, analysera, modifiera kod. Denna metod var väldigt givande då man kunde se effekten av kodändringar i praktiken. Laborationen var väldigt intressant och gav mig och min labbpartner ett smakprov på vad som komma skall i våra utbildningar. Innehållsförteckning 1. Inledning... 3 1.1 Bakgrund... 3 1.2 Syfte och målsättning... 3 2. Genomförande... 3 3. Resultat... 4 4. Analys... 5 5. Diskussion... 6 Referenser... 6 Bilagor... 7 Datateknik Kungliga Tekniska Högskolan Sida 2 av 7
1. Inledning Uppgiften var att programmera en LEGO Mindstorm-robot. Färdig kod var given och uppgiften var att felsöka och modifiera koden för att få roboten att göra det som var bestämt, dvs. följa en den svarta tejpen tills den går emot något och då stanna och spela upp en melodi samt skriva ut gruppmedlemmarnas namn på skärmen. Laborationen är en introduktion till programmering samt ingenjörs-tänkande. 1.1 Bakgrund Laborationen utfördes i par, detta för att vi skulle få testa på par-programmering men också för att kunna ta hjälp av varandra. Både jag och min labb-partner var väldigt nyintroducerade till programmering, därför hjälpte det att kunna diskutera de problem vi stötte på med varandra och sedan genom logiska metoder lösa uppgiften. Att få pröva på att programmera i NXC samt att samarbeta i parprogrammering är en erfarenhet vi kommer att ha stor nytta av i fortsättningen av vår utbildning. 1.2 Syfte och målsättning Syftet med uppgiften är att på ett roligt och relativt enkelt sätt introducera programmering i form av parprogrammering. Syftet är också att introducera arbetsgången vid ingenjörsarbete samt ge träning och arbetsvana i de IT-system för utbildning som finns vid ICT-skolan. Uppgiften syftar även till att ge träning i felsökning och testning och därmed ge en grund till effektivt parprogrammeringsarbete i framtiden. Förhoppningen är även att studenterna ska få en förståelse för hur små enkla fel i koden kan ge oväntade resultat vid körning, och på så sätt bidra till en nogrannhetstänk. För mig personligen var målet att få ett bättre grepp om programmering och lära mig ett nytt språk NXC (Not exactly C). 2. Genomförande Hur genomfördes laborationen och med vilka metoder? Beskriv olika praktiska moment så som genomgång av Lab-PM, nedladdning och installation av programvara, kodgranskning, hur parprogrammeringen gick till, lösandet av uppgiften, testkörning osv. Innan laborationstillfället läste vi labb-pm och fick förbereda oss med att ladda ner och installera de program som skulle användas (drivrutin till Lego NXT för Windows och Bricx command center), läsa Datateknik Kungliga Tekniska Högskolan Sida 3 av 7
en nybörjar guide för programmering med språket NXC ( Programming Lego NXT Robots using NXC ) samt studera NXC programmer s guide (API). Vid labbtillfället fick vi en färdig kod som vi kopierade över till Bricx. Vi visste redan innan vi test körde roboten att koden skulle behöva modifieras, därför satte vi oss direkt för att granska koden och kunde tidigt upptäcka tydliga fel som ändrades till, dock hjälpte det till vår förvåning inte speciellt mycket när vi test körde roboten som inte alls gjorde som vi ville. Resterande del av laborationen gick ut på den enkla metoden att: 1 - Ändra i den färdiga koden, 2- Test köra roboten, 3 - Analysera hur roboten reagerar på den nya koden, och tillbaks till 1: ändra i den färdiga koden Denna metod gav oss väldigt lyckade och snabba resultat. Eftersom att vi parprogrammerade så var det en som programmerade och en som kollade på för att sedan byta, detta skedde flera gånger under laborationen tills uppgiften var löst. 3. Resultat Kommentarsblad för laborationsuppgift i II1310 Introduktionskurs i datateknik Radnummer Ny kod 94 Onfwd(Out_A, SpeedFast) Kommentar Vi ville att A-hjulet skulle hålla en konstant hastighet och låta B-hjulet styra roboten rätt på tejpen. 96 76 46 115 If (lightintensity >= botthreshold) Sensorraw(IN_3); +(8*i-16)); //dance(); Detta blev en nyckelförändring för att få roboten att göra som den ska även när den når botthreshold, vi satte vi dit ett = tecken för att få roboten att gör som vi ville. Ändrade koden så att den stämde överens med hur ljussensorerna var kopplade på roboten Ändrade tecknet till + tecken framför parentesen för att det skulle stämma. Senare kom vi på att vi även kunde ha tagit bort (-16) och haft kvar -tecknet Kommenterade bort dance från main aktiviteten, roboten ska inte dansa. 35 Kim La till våra namn i String groupmembers för att de skulle skrivas ut när roboten stannar Datateknik Kungliga Tekniska Högskolan Sida 4 av 7
36 Felix La till våra namn i String groupmembers för att de skulle skrivas ut när roboten stannar 2 #Define speedslow 20 Ändade koden för att göra roboten långsammare och lättare att jobba med 3 #Define speedfast 40 Ändade koden för att göra roboten långsammare och lättare att jobba med 34 String groupmembers Vi såg direkt när vi försökte compile att det fanns ett error här, ändrade int till string. 66 Printnamestoscreen (name) Ändrade namn 90 If(lightintensity <= topthreshold) Detta blev en nyckelförändring för att få roboten att göra som den ska även när den når topthreshold, vi satte vi dit ett = tecken för att få roboten att gör som vi ville. Resultatet blev att roboten följde den svarta tejpen (som just i detta fall var formad som en halvmåne) tills den stötte emot något, då stannade roboten, spelade upp en melodi och skrev ut Gruppmedlemmar Kim Felix 4. Analys De största problemet som vi stötte på under laborationen var att vi missat att kommentera bort dance(); i main aktiviteten. Eftersom dance fanns med i main aktiviteten så var roboten kodad till att dansa det första den gjorde när man körde koden, detta försvårade modifieringen av koden avsevärt eftersom att hur mycket vi än rättade till och ändrade i koden så fick vi samma praktiska resultat av roboten. Men när vi väl hittat och kommenterat bort dancefunktionen så kunde vi genast se resultat av våra ändringar i koden. Datateknik Kungliga Tekniska Högskolan Sida 5 av 7
Att få roboten att skriva ut rätt saker på skärmen gick väldigt enkelt då vi bara ändrade en int funktion till en string funktion och sedan var det bara att föra in den text vi önskade skulle skrivas på robotskärmen. Att få roboten att följa den svarta tejpen med hjälp av ljus-sensorer var lite utmanande och krävdes ett antal testkörningar innan vi hittade rätt, att sänka speedfast och SpeedLow till väldig låg hastighet hjälpte en hel del p.g.a. att om hjulen på roboten körde för snabbt så var det lätt att den körde ut från tejpen trots att sensorerna skulle motverka detta. För att få sensorerna att funka som vi ville krävdes att ändra funktionen Sensorraw(IN_1); till Sensorraw(IN_3); eftersom att det var i port 3 som sensorerna var inkopplade, när väl koden stämde överens med hur sensorerna var inkopplade så var det lätt att se vad som behövde ändras med hjälp av att testköra roboten ett antal gånger. Slutligen kunde vi med logiskt tänkande koda om roboten till att reagera som vi ville på sensorerna, vi ändrade t.ex. If(lightintensity < topthreshold) och If (lightintensity > botthreshold) till if(lightintensity <= topthreshold och och If (lightintensity >= botthreshold), samt att hjulen skulle ändra från speedfast/speedslow till speedfast/speedslow om roboten var på väg utanför tejpen. 5. Diskussion Laborationen var väldigt intressant och givande för mig och min labbpartner som nybörjar programmerare, men trots detta lyckades vi lösa uppgiften och få det önskade resultatet väldigt snabbt. Laborationen gav oss båda ett smakprov på vad som komma skall i våra utbildningar till dataingenjörer, vi lärde oss grundläggande kunskaper inom programmering och språket NXC som vi med all säkerhet kommer ha nytta av i framtida kurser och kanske även jobb. I.om. Att vi inte fick speciellt mycket instruktioner på hur vi skulle handskas med problemen så ledde det till att vi fick diskutera mycket i labbgruppen. Den metod vi använde för att lösa uppgiften var att testköra roboten och sedan analysera vad roboten gör för fel och var vi behöver ändra i koden. Att ha möjligheten till att just testköra roboten många gånger var väldigt nyttigt och nödvändigt för oss som var väldigt oerfarna med språket NXC. Jag lärde mig mycket av laborationen och fick ett väldigt positivt intryck av språket NXC samt programmering i allmänhet, jag ser framemot att jobba mer med NXC och tampas med nya utmaningar. Referenser Labb-PM https://bilda.kth.se/courseid/10164/content.do?id=21060042 Datateknik Kungliga Tekniska Högskolan Sida 6 av 7
Bilagor Datateknik Kungliga Tekniska Högskolan Sida 7 av 7