Labb rapport - NXT Lego Robot programmering

KTH - KISTA
Programmering av NXT
lego robot
Peter Yakob
2015-08-29
[email protected]
Introduktionskurs i datateknik (H15) II0310
Sammanfattning
Den här rapporten handlar om hur två personer med grundläggande kunskaper inom programmering
testade att programmera en lego robot med hjälp av program språket NXC (Not eXactly C). Du
kommer få läsa om vilka steg vi följde för att programmera roboten, vilka problem vi stötte och hur vi
löste de som t.ex. hur programmet skulle hantera robotens motorer. Syftet med denna laboration
var att introducera par programmering på ett enkelt med ändå roligt sätt. Målet var att rätta till fel i
en kod som vi hade blivit tilldelade och sedan se till så att roboten kunde följa en svart linje med
hjälp av en ljussensor, den skulle också kunna skriva ut gruppmedlemmarnas namn på sin LCD skärm
samt spela upp en ton när den träffade väggen.
Innehållsförteckning
Sammanfattning ...................................................................................................................................... 2
Innehållsförteckning ................................................................................................................................ 2
1. Inledning .............................................................................................................................................. 3
1.1 Bakgrund ....................................................................................................................................... 3
1.2 Syfte och målsättning .................................................................................................................... 3
2. Genomförande .................................................................................................................................... 3
3. Resultat................................................................................................................................................ 4
4. Analys .................................................................................................................................................. 6
5. Diskussion ............................................................................................................................................ 6
Referenser ............................................................................................................................................... 6
Bilagor...................................................................................................................................................... 7
1. Inledning
Den här rapporten kommer att handla om hur jag och min labbpartner programmerade vår första
robot med hjälp av NXC. Jag kommer gå igenom varför vi utförde denna laboration samt problem
som vi stötte på.
1.1 Bakgrund
I laborationen så fick vi använda oss av grundläggande programmerings kunskaper för att hitta och
lösa problem som fanns i robotens kod. Dessa grundläggande kunskaper är väldigt viktiga och är
något som vi i framtiden kommer använda oss mycket av när vi programmerar mjuk & hårdvara.
1.2 Syfte och målsättning
Syftet med laboration var att introducera grundläggande programmering i par på ett roligt med
samtidigt enkelt sätt. Målet var då att hitta fel i robotens kod och rätta till den så att den kunde följa
en svart linje med hjälp av en ljussensor.
2. Genomförande
Innan laboration så laddade vi ner BricxCC och robotens drivrutiner, BricxCC användes för att
programmera och kompilera koden medan robotens drivrutiner behövdes för att koppla upp den till
våra datorer.
Det första vi gjorde var att starta & koppla roboten till datorn med hjälp av en USB sladd, efter det så
tog vi en titt på koden i BricxCC. Vi skummade igenom koden och sedan testade vi att kompilera den,
då stötte vi på vårt första problem laborationen.
Det första problemet vi hade var en datatyp som inte var kompatibel, problemet var att en integer
användes istället för en string när programmet skulle skriva ut namn ur en lista, detta problem löste
vi ganska snabbt och vi fortsatte därefter med att testa roboten genom att ladda upp vår
modifierade kod så att vi kunde test köra den. Det första jag märkte efter vårt första test var att
roboten spelade upp en ton och skrev ut text på LCD skärmen när sensorerna kom i kontakt med
väggen därefter så stängde den av sig själv en kort stund senare. Texten som skrevs ut var
”PeterGruppmedlemmar:” det som borde ha skrivits ut var ”Gruppmedlemmar: Peter, Simon” d.v.s.
texten som skrevs ut hamnade i fel ordning och bara en gruppmedlems namn skrevs ut på skärmen.
När det här problemet dök upp så blev vi lite förvirrade över varför bara ett namn ur vår lista skrevs
ut på robotens skärm. Vi satt och analyserade koden som hanterade utskrivningen av namn och
försökte hitta problemet, det vi kom fram till var att koden som hanterade vilken rad som namnen
skulle skrivas ut på var fel. Koden skrev ut ”Gruppmedlemmar.” på rad 56 och skrev ut det första
namnet ur listan på rad 64 och det andra namnet i listan skrevs också ut på rad 56. Detta var troligen
varför det andra namnet i listan inte dök upp, så vi gjorde en väldigt liten modifiering i koden som
skrev ut namnen ur listan, detta löste problemet och vi kunde nu börja fokusera oss på robotens
ljussensor och motorer.
3. Resultat
Koden ovan försöker skriva ut namnen från listan ”groupMembers” på robotens skärm.
Men vi stötte på ett fel som sa ”Error: Datatypes are not compatible”
Om vi tar en titt på koden ovanför så ser vi att listan har en integer som datatyp, vi ändrade den till
en string eftersom integer kan inte hantera text och samtidigt så skrev vi in våra namn i listan istället
för siffrorna.
Det andra problemet vi stötte på var att namnen i listan inte skrevs ut korrekt på robotens LCD
skärm.
Vi löste detta genom att ändra värdet 16 på rad 46 till 6, och detta gjorde vi för att minska värdet på
LCD_LINE2 så att texten inte skulle hamna före LCD_LINE1 eller på samma rad som var fallet med det
andra namnet i listan.
Lite enkel matematik visar oss varför vi gjorde denna ändring.
LCD_LINE1 = rad 56
(detta är definierat på rad 10 i koden)
LCD_LINE2 = rad 48
(detta är definierat på rad 11 i koden)
(LCD_Line2 - (8*i-16))
(rad 46)
När i = 0 d.v.s. när det första namnet i vår lista ska skrivas ut så skrivs den ut på:
(LCD_Line2 - (8*i-16)) => 48 – (8 * 0 – 16) => 48 + 16 = 64 (rad 64 på robotens skärm)
Och när i = 1 så skrivs det andra namnet ut på:
(LCD_Line2 - (8*i-16)) => 48 – (8 * 1 – 16) => 48 + 8 = 56 (rad 56 på robotens skärm)
Genom att ändra värdet 16 till 6 så får LCD_LINE2 aldrig samma värde som LCD_LINE1 i det är fallet.
Om vi tar en titt på koden som skriver ut ”Gruppmedlemmar:” på rad 42, så ser vi att den skrivs ut på
LCD_Line1 d.v.s. rad 56 vilket är samma värde som det andra namnet skrivs ut på. Detta var då
problemet som orsakade att texten skrevs inkorrekt.
Nästa problem vi stötte på var att Ljussensorn inte verkade fungera korrekt, vi märkte att koden läste
av fel sensor.
Koden läste av värdet från sensor 1 som inte var en ljussensor (IN_1) så vi ändrade till den korrekta
sensorn IN_3.
Här så hade vi problem med att få roboten att följa den svarta linjen, det tog oss ett bra tag innan vi
löste problemen i kod stycket ovanför. Vi fick testa oss fram genom att ändra vilken motor som skulle
köras i olika situationer. Till slut så kom vi fram till denna lösning.
Nästa gång vi testade roboten så lyckades den följa den svarta linjen och åka in en halv cirkel, när den
träffade väggen så skrevs namnen i listan ut på robotens skärm.
4. Analys
Anledningen till att vi behövde testa oss fram på olika moment var för att vi inte tog oss tiden och
läste igenom hela koden ordentligt, vi skummade bara igenom den lite snabbt och satte igång direkt
med att testa hur roboten fungerade. Detta ledde till lite strul i slutet av laborationen när vi skulle få
roboten att följa den svarta linjen, vi kom fram till en lösning efter ett bra tag. När vi gjorde ändringar
i if-satsen som hanterade motorerna så blev det ganska uppenbart att vi inte riktigt tänkte igenom
hur den biten av koden fungerade. Men för det mesta så var det inte för mycket svårigheter. Vi tog
även och minskade variablerna för SpeedSlow & SpeedFast för att vi trodde att om roboten var för
snabb så skulle den inte hinna med att svänga i linjens kurvor, men det påpekades senare när vi var
klara med uppgiften att vi kunde ha höjt hastigheten eftersom roboten skulle varit snabbare på att
svänga om hastigheten var högre.
5. Diskussion
Syftet med laborationen var att vi skulle få testa på att programmera en robot i par och lösa problem
som vi hittade i koden. Målet var då att lösa alla problem och få roboten att följa den svarta linjen i
en halv cirkel, för att sedan träffa väggen och spela upp en ton samt skriva ut text på LCD skärmen
och sedan stänga av programmet ett kort stund därpå.
Det jag har lärt mig är lite grundläggande om hur man programmerar robotar, detta kommer vara
väldigt bra inom den närmaste framtiden när vi ska bygga och programmera våra egna robotar i
kursen ingenjörsmetodik.
När det gäller lösningsmetoder så skulle jag säga att vi för det mesta testade oss fram speciellt när vi
skulle se till så att roboten följde linjen korrekt, personligen gillade jag denna metod eftersom det var
roligt att se hur de olika ändringarna fick roboten att fungera, men detta är nog inte det optimala
sättet att lösa problem och är något som jag kommer försöka undvika i framtiden om det är möjligt.
Referenser
”Labb-PM” Från II0310 Introduktionskurs i datateknik (H15) - Bilda
Bilagor
Kommentarsblad för laborationsuppgift i
II0310 Introduktionskurs i
datateknik
Radnu
mmer Ny Kod
34-36
46
Kommentar
String
groupMembers[] =
{
”Peter”,
”Simon”
Ändrade datatypen från en integer till en string samt ersatte
};
siffrorna i listan med gruppmedlemmarnas namn.
TextOut(0,
Ändrade värdet 16 till 6 så att det andra namnet I listan inte ska
(LCD_LINE2 –
hamna på rad 56 som LCD_LINE1 skrivs ut på. Har även sett till så
(8*i-6)), names[i]); att det första namnet i listan inte har ett värde som är högre än 56.
92
lightIntensity =
Ändrade så att lightIntensity läser av värdet från rätt sensor (IN_1
sensorRaw(IN_3); är ingen ljussensor)
Har inte mycket att kommentera på dessa, kan bara säga att vi
testade oss fram och denna lösning är den som fungerade för oss.
Man skulle antagligen kunna byta plats på B & A eftersom det inte
OnFwd(OUT_B,
borde spela någon roll, det viktigaste är att man har en Fast & en
SpeedFast);
Slow för både B & A samt att de är i samma if-sats.
93
OnFwd(OUT_B,
SpeedSlow);
98
OnFwd(OUT_A,
SpeedFast);
99
OnFwd(OUT_A,
SpeedSlow);
2
Vi ändrade hastigheterna på SpeedSlow och SpeedFast eftersom vi
#define SpeedSlow trodde att roboten skulle ha det lättare att följa den svarta linjen om
40
den inte gick för snabbt.
3
#define SpeedFast
60
76