KUNGLIGA TEKNISKA HÖGSKOLAN Programmera en NXT Robot Med hjälp utav NXC Peyman Torabi 2012-09-03 E-post: peymant@kth.se Introduktionskurs i datateknik (II1310) Sammanfattning Uppgiften var att analysera samt korrigera den felaktiga koden som kommer med en liten Lego NXT robot. Målet är att få roboten att följa ett svart streck med hjälp av sin sensor.
Innehållsförteckning 1. Inledning... 3 1.1 Bakgrund... 3 1.2 Syfte och målsättning... 3 2. Genomförande... 3 3. Resultat... 3 4. Analys... 4 5. Diskussion... 5 Referenser... 6 Bilagor... 6 Institution KTH Sida 2 av 6
1. Inledning Målet var att få en liten NXT robot att följa en svart linje med hjälp ut av en sensor som satt på den. För att kunna få roboten att fungera använde vi oss av NXC som programmeringsspråk samt BricxCC som kompilerings program. Vi ska då kunna korrigera /lägga till, samt testa den nya koden på roboten och då lära oss om processen av att utveckla enkla program. 1.1 Bakgrund Att kunna skriva, analysera, samt korrigera kod är något som är något som alla ingenjörer borde kunna och denna uppgift låter oss prova på just detta. 1.2 Syfte och målsättning Att komma igång med att programmera lite grundläggande kod i NXC samt lära sig hur man ändrar och lägger till sin egen kod till befintlig kod. 2. Genomförande Vi laddade ned de nödvändiga programmen och drivrutinerna för att få allt att fungera. Vi testade sedan snabbt genom att kompilera koden och skicka det till roboten för att se att allt var i sin ordning. Efter detta så påbörjade vi arbetet. Vi spenderade en stor del tid med att gå igenom koden steg för steg och följa den för att få en bild av hur allt fungerar och vad allt gör. För att få en klar bild över hur allt är uppbyggt av den som skrev koden till att börja med. Det visade sig att vi inte behövde ändra så mycket kod som vi först trott men det började med att jag programmerade om en del samtidigt som min kompis kollade på och gav sin egen åsikt om det hela. Vi båda testade en del olika saker innan vi kom fram till den lösning som vi ansåg att vara bäst. Vi testkörde programmet gång på gång för att försäkra oss om att det inte är en tillfällighet att koden fungerar och att inga buggar finns närvarande som vi annars skulle missat. En detaljerade överblick av hur vi fixade koden kommer i resultatet nedan. 3. Resultat Vilka resultat gav laborationen? Redovisa med en tabell som innehåller radnummer från orginalkoden, ändringar av koden/ny kod och kommentarer. Institution KTH Sida 3 av 6
Rad Orginal Kod Modifierad Kod Kommentar 115 dance(); //dance(); Kommenterade bort Dance från main klassen som gjorde så att roboten inte 69 lightintensity = SensorRaw(IN_1); 87 OnFwd(OUT_A, SpeedSlow); 91 OnFwd(OUT_B, SpeedFast); 34 string groupmembers[] = "Person" ; lightintensity = SensorRaw(IN_3); OnFwd(OUT_B, SpeedSlow); OnFwd(OUT_A, SpeedFast); string groupmembers[] = "Peyman", "Svante" ; följde några andra kommandon. Ändrade så att roboten läser in data från Input port nummer 3 och inte 1. Sensorn är kopplad till 3. Bytade motor från A till B. Detta ändrar robotens kontroll då den följer den svarta linjen. Bytade motor från B till A. Detta ändrar robotens kontroll då den följer den svarta linjen. La till våra namn i arrayen som håller namn 4. Analys Vi hittade en väldigt snabb lösning till problemet. Genom att snabbt ändra vilka motorer som aktiveras när så lyckades vi få fram ett bra resultat. Tydligen var vår metod inte den eftersökta metoden som man skulle använt sig av men det fungerade minst lika bra. Institution KTH Sida 4 av 6
while(true) if(finished == true) Off(OUT_AB); break; readlightsensor(); if(lightintensity < TopThreshold) OnFwd(OUT_A, SpeedSlow); else OnFwd(OUT_B, SpeedSlow); readlightsensor(); if(lightintensity > BotThreshold) OnFwd(OUT_A, SpeedFast); else OnFwd(OUT_B, SpeedFast); I början så aktiverades samma motor, motor A i första if satsen, om ljusets intensitet är under TopThreshold, även om det var sant eller falskt. Vi ändrade så att Motor A aktiveras om det är sant men annars aktiveras motor B om det är flaskt. Vilket får roboten att svänga åt andra hållet, i hopp om att hitta strecket. Om ljusets intensitet är däremot större än bottom threshold så kommer A att gasa på men annars tar B över igen i hopp om att finna linjen igen. Resultatet är att roboten går i princip i sicksack och håller sig då på linjen utan problem och korrigerar sig automatiskt då lightintensity går upp. (alltså ser sensorn då det ljusa golvet och inte den mörka tejpen) Sensorn var ju givetvis också kritisk för att roboten skulle fungera så det var nödvändigt att kontrollera att roboten får in datan från sensorn som var kopplad till Input 3, i koden togs data in från Input 1 från början, vilket var en motor och inte sensorn. Institution KTH Sida 5 av 6
5. Diskussion I detta fall så lärde jag mig att inte överanalysera koden och försöka tänka enkelt, för då hittar man även en enkel lösning på problemet. Vi hade endast några små problem med koden och löste dessa relativt snabbt. Jag fick en bra överblick över hur labbar kommer att vara längre in i min utbildning, samt komma igång med att skriva rapporter igen. NXC och lego NXT var ett roligt sett att prova på något praktiskt utan att ha en bakgrund inom programmering. (Jag har en grundläggande bakgrund i Java dock) Vi hade gott om tid och det som kanske saknades var en längre och mer utmanande bana för robotarna att följa, men annars var det väldigt bra. Jag trodde att vi skulle få programmera mer och inte bara ändra ett fåtal stycken av koden, men som sagt, så löste vi problemet på ett enklare sätt än det som förväntades. (Tydligen I alla fall) Referenser Vi använde oss av det material som gavs på bilda: https://bilda.kth.se/courseid/8498/content.do?id=19121762 Samt lego NXC API: http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/index.html Bilagor Institution KTH Sida 6 av 6