Kungliga Tekniska Högskolan
Programmering av NXTrobot
Niklas Lindqvist 30/815 nlindqv@kth.se
Introduktionskurs i datateknik II0310
Sammanfattning
Programmeringskunskap är idag en eftertraktad kunskap som är viktig för en civlingenjör inom data och IT att kunna. Ett första steg till att lära sig programmera kan vara att med hjälp av en halvfärdigt skriven kod programmera en NXTrobot till att följa en linje följt av att skriva ut önskad text på robotens skärm vilket denna rapport kommer att handla om. Syftet med laborationen är att
introduceras till programmering på ett roligt och lärorikt sätt. Resultatet blev en programkod som fick en NXTrobot att följa en linje samt skriva ut önskad text på skärmen när den krockade i en vägg. Det var både utmanade och roligt att lösa uppgifterna och det var väldigt lärorikt för någon som knappt eller aldrig har programmerat förut.
Innehållsförteckning
1. Inledning………...2
1.1 Bakgrund………...2
1.2 Syfte och målsättning………....2
2. Genomförande………..2
3. Resultat……….2
4. Analys………...3
5. Diskussion………4
Referenser……….5
Bilagor………...5
1. Inledning
Denna rapport kommer att handla hur en NXTrobot ska programmeras till att följa en linje.
Programmeringen kommer att ske i programmeringsspråket NXC som är ett språk bra tillämpat för denna typ av uppgift då det finns många inbyggda funktioner och moduler som kommer att användas.
1.1 Bakgrund
Programmering är idag ett redskap som är mycket eftersökt i vårt samhälle som är så ITbaserat som det faktiskt är och det är idag inte mindre än ett måste för en civilingenjör inom informations och datateknik att kunna. I denna laboration kommer programmeringsspråket NXC användas. NXC är ett programmeringsspråk som är en begränsad version av C men där även flera funktioner och moduler finns inbyggda som är fördelaktigt vid programmering av t ex NXTrobotar.
1.2 Syfte och målsättning
Syftet med denna laboration är att introduceras till programmering på ett roligt sätt genom att
analysera, felsöka och redigera i en förskriven NXCkod. Där målet var att få NXTroboten att kunna följa en linje på golvet samt att den ska skriva ut önskad text (i det här fallet våra namn) på displayen, när NXTroboten går emot en vägg eller annat föremål. Ytterligare ett syfte är att få förståelse för hur en liten felskrivning i koden kan ge stora konsekvenser på programmet när det sedan exkveteras och därmed redan från början få ett noggrannhetstänk som krävs vid mer avancerad programmering.
Ytterligare mål jag har med denna laboration är att få en grundläggande förståelse över hur
programmeringkod kan användas för att kontrollera och styra hårdvara i form av t ex en NXTrobot.
2. Genomförande
Laborationen börjades med att LabPM:et lästes igenom och material i form av programvara
installerades på en datorn med operativsystemet Windows 8.1. Sedan studerade vi roboten och såg till så att alla sladdar satt som de skulle. Detta gjordes genom att se till att de kopplades enligt mallen som fanns i en förinstallerad fil på NXTroboten. Därefter skumlästes programkoden igenom för att få en överblick av hur programmet bör fungera. Efter det testkördes programmet och eventuellt
felmeddelande kunde läsas och åtgärdas.
När programmet sedan kunde köras utan felmeddelanden kopplades roboten in i datorn.
Programkoden överfördes till roboten för att kunna testköras och se vad som fungerade som det skulle och vad som måste ändras för att nå det givna målet att roboten ska kunna följa en linje.
3. Resultat
Resultatet av denna laboration blev en NXTrobot som vid start av programmet satte igång båda motorerna och körde rakt fram tills det att den korsade en linje på golvet. Då började roboten istället
följa linjen tills dess att den åkte in i väggen. När den åkte in i väggen reagerade touchsensorerna och texten “Gruppmedlemmar: Harald, Niklas” skrevs ut på skärmen.
För att åstadkomma detta resultat gjordes följande ändringar i originalkoden:
Tabell 1
Radnummer Ny kod Kommentar
34 string groupMembers[] = { Vi ändrade ”int” till ”string”, eftersom printNamesToScreenfunktionen vill ha en string som argument och inte en int.
35, 36 35. ”Harald”
36. ”Niklas”
Vi ersatte 1 och 2 med våra namn.
46 TextOut(0, (LCD_LINE2 i), names[i]);
För att namnen ska printas på rätt rad.
76 lightIntensity = SensorRaw(IN_3);
Tidigare stod det ”(IN1)” istället för
”(IN_3)”. Ljussensorn var kopplad på input 3 på LEGOroboten.
94 OnFwd(OUT_A, SpeedFast); Motor A blev starkare vid elsevillkoret.
98 OnFwd(OUT_B, SpeedSlow); Motor B blev svagare
108 Precedes(readTouchSensors, followLine);
denna rad flyttades ner till rad 115
Utöver de ändringar som angivits i Tabell 1 togs funktionen dance(); bort samt rad 116 kunde tas bort då dessa funktioner ej hörde till den givna uppgiften.
4. Analys
Vid en analys av resultatet kan man se att ingen ändring som gjorts har upprepats flera gånger på olika ställen. Ändringen på rad 34 gör så att funktionen returnerar en lista av strängar istället för en lista av integers. Detta var fördelaktigt i denna situation för att funktionen printNamesOnScreen som senare printar ut namnen på skärmen tar in listan groupMembers som argument men förväntar sig att listan ska innehålla strängar och inte integers. På rad 35 och 36 gjordes en ändring från 1 och 2 till “Harald”
och “Niklas”. Det som eventuellt kunde blivit fel är om man missat att sätta namnen inom citationstecken då namnen istället hade blivit tomma, odefinierade.
Ändringen i koden på rad 46 gjorde vi för att få roboten att skriva ut gruppmedlemmarnas namn på skärmen. Vi ändrade från (LCD_LINE2 (8*i16)), names[i]) till (LCD_LINE2 i), names[i]) vilket blev en lösning. Men med tanke på att LCD_LINE2 har värdet 48 (som är angivet högst upp i koden)
och LCD_LINE3 värdet 40 bör lösnigen istället varit (LCD_LINE2 8*i), names[i]) då varje nytt namn i listan skulle skrivits 8 (1 rad) under föregående. Min hypotes till att det trots detta fel fungerade är att varje LCD_LINE har ett intervall på 8 vilket gör att LCD_LINE2 har värdet 4855, dvs att allt som skrivs ut på rad 4855 hamnar på andra raden på robotens skärm. Med denna hypotes får LCD_LINE3 intervallet 4047 och då andra namnet i listan gavs av (LCD_LINE2 1 = 47 stämmer det. Hade vi däremot haft tre namn i listan hade namn nr 3 då fått värdet 46 och antagligen också hamnat på LCD_LINE3.
På rad 76 ändrade vi så att roboten skulle läsa av lightIntesity:n från input 3 istället för input 1 då lightSensorn var inkopplad till input 3 på roboten. Sedan på rad 94 respektive 98 ändrade vi så att om roboten är på väg ut från linjen på höger sida så kommer höger motor att gå på speedFast medan om den är på väg ut på vänster sida kommer vänstra motorn att gå på speedFast.
Den sista ändringen som gjordes var att flytta ner raden där funktionen followLine låg så att kalibreringen av de olika sensorerna görs innan roboten börjar åka.
Då laborationen bestod av två uppgifter och vi löste båda blev resultatet som vi hade hoppats och trott på, en robot som kunde följa en linje och skriva ut en viss text på skärmen efter att den krockat i väggen.
Generellt gick allt bra med laborationen trots att allt inte var självklart från början med hur man skulle göra, vilket gjorde det till en mycket rolig utmaning. Genom att arbeta sig igenom koden systematiskt och samarbeta fick vi en fungerande programkod och en full förståelse över vad allt i programkoden hade för funktion.
5. Diskussion
Laborationen var mycket lärorik och har uppfyllt både syfte och mål då jag i början av laborationen inte förstod någon större del av programkoden, men när båda uppgifterna var lösta tittade jag igenom hela koden igen och har nu full förståelse för vad alla olika funktioner gör och står för. Däremot tror jag inte att jag har fått tillräcklig kunskap för att kunna göra ett liknande program helt på egen hand, då jag inte riktigt vet hur kommandon som “SetSensorMode” & “SetSensorType” fungerar och ska användas.
De lösningsmetoder vi använde oss av var att först av allt skumläsa programkoden för att försöka få en bild av hur programkoden var uppbyggd. Därefter testkörde vi programmet i datorn för att se om något felmeddelande skulle dyka upp, vilket det gjorde. Sedan felsökte vi koden tills det att programmet gick att köra utan felmeddelanden. Därefter synkade vi programkoden till NXTroboten och testkörde den där. Därefter turades vi om att läsa igenom koden och föreslå ändringar som vi då samtidigt kunde motivera för varandra, hur vi tänkte med den eventuella ändringen. Ett problem som däremot uppstod var att vi från början tänkte att “SpeedSlow” och “SpeedFast” inte spelade någon större roll utan vi tänkte oss att roboten skulle köra på ‘AB’ när den gick längs linjen och sen antingen ‘A’ eller ‘B’ när den höll på att avvika från linjen, dvs att en motor skulle slå av och roboten skulle vrida sig helt. Men när vi gjort ett antal försök med den idén utan önskat resultat fick vi tänka om. Nu i efterhand var det självklart att endast kraften i robotens motorer skulle justeras vid avvikelse från linjen.
Jag tror definitivt att jag kommer ha användning av de kunskaper jag fått under laborationen och tillsammans med de förkunskaper jag hade i programmering tror jag att jag har en väldigt bra grund för fortsatta studier och redan nu ser jag mycket fram emot att lära mig mer och i framtiden även kunna jobba med något som i någon form rör programmering.
Referenser
LabPM https://bilda.kth.se/courseId/12708/content.do?id=23767349
Bilagor