RoboCup Junior Räddning Introduktionskompendium Ett kompendium för mentorer till lag som deltar i RoboCup Junior Sverige. Förklarar vanliga problem och hur man ska tackla dem. Går även igenom tre olika sätt att följa en svart linje, samt lite fler nyttiga programmeringstekniker. Fredrik Löfgren juli 2012 www.robocupjunior.se
Förord Detta material sammanställdes inför den svenska uttagningen till RoboCup Junior 2013 som Föreningen för intelligenta autonoma system vid Linköping Universitet ska arrangera. Jag vet att det kan vara svårt för lärare att hjälpa sina elever med robotar, då det även är ett nytt område för dem. Så för att det ska vara enklare för er att komma igång skriver jag ett introduktionskompendium som visar lite exempellösningar på vanliga problem. Förhoppningsvis får eleverna det roligare och kan fokusera mer på sina egna idéer än att lösa standardproblem. Det är inte meningen att du ska dela ut det här materialet till dina elever. Jag skriver det för att du som mentor ska ha lite grundkunskaper och jag litar på att du som pedagog kan förmedla kunskapen till dina elever. Sist en liten ansvarsfriskrivning Jag reserverar mig för eventuella fel. Tack! Fredrik Löfgren Juli 2012 1
Innehåll Förord... 1 Innehåll... 2 Om kompendiet... 4 Upphovsrätt och varumärken... 4 Feedback... 4 Tack till... 4 Riktlinjer för mentorer... 5 Kommunikation... 6 Robotkampen... 6 Creationary... 6 Läsa ritning och konstruera... 6 Duellen... 7 Tillverka tävlingsarenan... 7 Lego i mörkret... 7 Hur gör man en vinnande robot?... 8 Reglerna... 8 Bryt ned problemet... 9 Konstruktion... 10 Rampen & Farthinder... 10 Släpskor eller Glidpluttar... 11 Länkhjul... 11 Larvband... 12 Följa linje... 12 En ljussensor... 12 Två Sensorer... 17 Två Ljussensorer Alternativ... 20 Hinder... 23 Hitta hinder med Trycksensor... 24 Hitta offer... 26 Fördjupning... 27 Händelser & parallella tidsaxlar... 27 Mina Ikoner... 34 Vanliga fel... 37 Ljusvärdena!... 37 2
Batterierna!... 37 Inga fler portar!... 38 Flera processorer... 38 Bluetoothkommunikation... 38 Inget Lego?... 39 Lego med fördelar... 40 Hårdvara... 40 Mjukvara... 40 Experimentera!... 41 3
Om kompendiet Upphovsrätt och varumärken Innehållet i detta dokument är licenserat under Public Documentation License, Version 1.0 ("Licensen"); Ni får bara använda denna dokumentation om Ni följer villkoren i Licensen. En kopia av Licensen hittar Ni på: http://www.openoffice.org/licenses/pdl.html Originaldokumentet heter "Introduktion till RoboCup Junior". Författaren till originaldokumentet är Fredrik Löfgren 2012. All Rights Reserved. Författarkontakt: fredrik@eaproduktion.se Alla varumärken i detta dokument tillhör dess rättmätige ägare. Feedback Jag tar tacksamt emot fler tips och idéer på hur detta material kan förbättras. Har ni någon speciell kommunikationsövning eller programmeringsidéer får ni väldigt gärna kontakta mig! Antingen via mail eller på någon tävling! Skicka alla kommentarer och förslag till fredrik@eaproduktion.se Tack på förhand! Tack till Greig Tardiani Ordförande för kommittén som arrangerar RoboCup 2013 i Nederländerna. Författare till en introduktion för RoboCup Junior i Australien, som jag har använt som referens. Sebastian Gustafsson / Rasmus Andersson Studerar till civilingenjörer i Linköping. Har bland annat deltagit i First Lego League och RoboCup Junior. De har gett mig mycket input för detta arbete. Angelina Gordér Arbetar som matematik och NO lärare på galären i Karlskrona. Våra sponsorer: 4
Riktlinjer för mentorer "A large number of the teams will try to win, even that [sic!] using not correct behaviour. Many time the team mentors force the students to do that..." - Tiago Docilio Caldeira, ordförande för den internationella tekniska kommittén för RCJ Rescue Eleverna lär sig bäst på egen hand genom att försöka komma på lösningar på problemen! Det är aldrig roligt att ha någon lutande över axeln som hela tiden berättar vad man ska göra. Eftersom ett av RoboCup's huvudsakliga mål är utbildning så ges eleverna möjlighet att diskutera med andra deltagare på det internationella communityt (www.rcjcommunity.org). Uppmuntra hellre dem att ta hjälp av varandra än att fråga dig! Vi tror på ett elev-till-elev-lärande i dessa ämnen! Det ingår som en del av tävlingen att redovisa sin robot och dess funktionalitet. Så tipsa lagen om att dokumentera hur de arbetar. Dels är det värdefullt att kunna utvärdera vad man kan göra bättre till nästa år, och dels så är det alltid roligt med dokumenterade minnen! Jag vet att det kan vara svårt att hålla händerna ifrån roboten och datorn, men snälla försök! Se tävlingen som ett matteprov där eleverna får chansen att visa vad de lärt sig under arbetet med robotarna. Skulle du sätta dig ned med dina elever och visa hur man räknar mitt under ett prov? Under tävlingen ska det vara helt otänkbart för mentorer att hjälpa sina elever med roboten. De kan sina grejer nu, annars finns det många andra hjälpsamma lag i närheten! Med detta sagt menar jag inte att mentorn ska gå till personalrummet och ta en kaffe varje gång ni arbetar med robotarna (Det har hänt!). Mentorn ska hela tiden finnas där som ett stöd och komma med uppmuntrande tillrop! Ibland kan det uppstå tekniska problem, som att datorn låser sig eller att programmet kraschar, då ska mentorn finnas där och lösa problemen. Eleverna ska kunna fokusera på sin uppgift och utveckla sina egna färdigheter! Uppmuntra eleverna och ge dem beröm när de gjort något bra! Det viktiga är inte om ni vinner eller förlorar, det viktigaste är hur mycket ni har lärt er på vägen dit! 5
Kommunikation Inom alla lagidrotter är det viktigt med kommunikation. För att lyckas måste lagmedlemmarna kunna prata med varandra. Kan man föra fram sin idé och samtidigt lyssna för att ta till sig de andras idéer, kommer det att gå mycket bättre för laget! Det går inte att vinna RoboCup på egen hand. Jag har märkt att ju mer tid man spenderar tillsammans desto bättre blir samspelet och kommunikationen. I mitt lag kan vi säga Ge mig den där biten, du vet! eller Ge mig en sån där böj! och jag får direkt rätt legobit. När man känner varandra väldigt väl så behövs det inte så många ord. Vi kan läsa av varandras tankar. Hur mycket lagmedlemmarna än kan läsa tankar så uppstår det ändå situationer när laget inte kommer överens. Mitt tips är att tidigt prata igenom vad laget ska göra i sådana situationer. Innan de uppstår. Då vet alla vad som gäller och man kan gå vidare utan tjafs. I de lag som jag har deltagit i har vi utsett en person som vi litar på, som har rätt att fälla det avgörande ordet. Om det uppstår meningsskiljaktigheter så får den personen ta ett beslut för att arbetet ska fortsätta. Skulle detta visa sig vara fel beslut i ett senare skede så ska inte den personen få någon skit, laget har varit överens om att han har rätt att ta beslut. Jag ger detta som en idé, ert lag kan mycket väl ha en bättre strategi! Om laget inte tidigare samarbetat med varandra så tror jag att teambuilding kan öka sammanhållningen innan de börjar med den riktiga uppgiften! Här har jag samlat några förslag på övningar som jag gillar: Robotkampen Delta i Robotkampen som är en endagarstävling i Borlänge och arrangeras av Framtidsmuseet (www.framtidsmuseet.se). Det är en mycket uppskattad tävling där alla åldrar får vara med! Alla får uppgiften på morgonen och har 6 timmar på sig att bygga och programmera en robot som ska lösa så mycket som möjligt. På eftermiddagen blir det tävling och alla är nervösa inför hur det ska gå! Det är en mycket bra introduktion i hur det är att tävla med robotar! Kräver dock att man är lite bekant med Lego Mindstorms sedan tidigare. Creationary Dela ut en hög med kort med ord till lagen och massa lego. Eleverna jobbar i mindre grupper. En elev tar ett kort och ska med hjälp av legot visa för de andra vad det står. Det är enklast med substantiv, t.ex. ett hus, en blomma eller en kommunalgubbe. Men det går även att illustrera verb eller adverb med lego, t.ex. gult, kärlek eller spränga. Blir alltid mycket skratt!! Läsa ritning och konstruera Testa att bygga någon av standardrobotarna som det finns byggbeskrivning till. Fast kruxet är att den som bygger inte får se ritningen. Om man är två i laget kan en läsa ritningen och beskriva hur delarna ska monteras medan den andra bygger. Är man tre kan den som läser ritningen även beskriva hur delarna ser ut och be den tredje personen leta upp dem! 6
Duellen Detta är en variant av leken ovanför, fast kräver inga ritningar eller legolådor med lösa bitar. Dela in eleverna i par som sätter sig mitt emot varandra, fast med en skärmvägg mellan dem. Den ena eleven får en konstruktion framför sig, medan den andra har delarna till konstruktionen framför sig. Uppgiften är att den första personen ska beskriva hur konstruktionen ser ut för den andre som ska bygga ihop dem. När båda tror att de har samma konstruktion framför sig tas skärmväggen bort och de kan jämföra dem. Vill man tävla så kan alla börja samtidigt, och den som först är klar är vinnare. Tillverka tävlingsarenan Ska man delta i Rescue B så är det väldigt bra att ha en labyrint att träna i. Att tillverka den kan vara ett utmärkt sätt för alla eleverna att arbeta tillsammans. Du kan själv välja hur mycket de ska göra. Planering, tillverka CAD ritning, prata med företag om materialsponsring, såga ut alla delar, montera ihop det Detta gäller naturligtvis också Rescue A. Lego i mörkret Det här kanske inte är så mycket av en kommunikationsövning, men rolig att leka ändå. En elev går in i ett mörkt rum (eller tar på sig en ögonbindel) där de får känna på en legokonstruktion (av standardklossar eller DUPLO). Uppgiften är att eleven ska använda känseln och memorera konstruktionen. Sedan får eleven komma ut i ljuset där hen ska återskapa konstruktionen med lika uppsättning klossar. Går att tävla i lag om det är mer uppskattat av eleverna. Du kan även göra svårare och mer komplexa konstruktioner om eleverna är duktiga! 7
Hur gör man en vinnande robot? Många har frågat mig hur man gör en vinnande robot, eftersom jag har vunnit en mängd olika tävlingar. Tyvärr finns det inget bra svar. Jag har dock sett ett tydligt samband mellan nedlagd tid och erhållen placering. Ju mer tid du lägger ned på förberedelse desto bättre resultat blir det! Låter rätt logiskt, men det finns många otåliga elever som inte förstår det. Jag har lagt ned otaliga timmar på att läsa på Internet om programmering och konstruktion. Och även med kunskap så tar det många månader att bygga och programmera en robot, följt av mycket testande! Hur som helst så har jag bestämt mig för att skriva några rader om hur man kommer igång och löser några av standardproblemen som många lag stöter på i RoboCup Junior Rescue A! Jag gör detta med utgångspunkt ifrån Lego Mindstorms och programmeringsspråket NXT-G, men det är naturligtvis upp till er att välja vad ni vill använda. De bästa lagen internationellt sett har egenbyggda robotar som de programmerar i textuella språk. Men det är svårt att ge praktiska råd om något sådant eftersom det finns oändligt med möjligheter! RoboCup Junior är skapat så att alla lag ska lyckas med någonting. Du behöver inte ha en robot som klarar alla uppgifter för att få poäng. Därför kan man sätta upp delmål: Du kan följa en linje? Jättebra, nu kan du försöka klara av avbrott i linjen! Okej, du klarar av avbrott utan problem? Låt oss ställa dit ett hinder på linjen som roboten ska ta sig runt! Nu klarar du allting som har med linjen att göra! Försök att få roboten att söka efter ett offer i ett område utan linjer. Reglerna Börja med att läsa igenom de officiella reglerna noga. De hittas via www.robocupjunior.se. Det är viktigt att du som mentor kan reglerna om det skulle uppstå oklarheter. Vi har medvetet låtit bli att översätta reglerna till svenska för vi vill att eleverna tränar sin engelska, det är viktigt att kunna sätta sig in i en text på ett främmande språk. Men det är inte alltid så enkelt för t.ex. en sjätteklassare att förstå sig på alla reglerna och då är det din uppgift att förklara. Det är även dessa regler som gäller på VM. Skulle ni fortfarande ha funderingar kring reglerna så finns det internationella communityt www.rcjcommunity.org där ni kan ställa en fråga och få svar från de som skrivit reglerna. Läs gärna igenom de viktigaste reglerna tillsammans med klassen så att du försäkrar dig om att de förstått dem. När jag var yngre hade jag missförstått reglerna i en tävling och fick reda på att min robot inte uppfyllde kraven när jag var framme på tävlingen i Stockholm. Det är inte roligt för någon. 8
Bryt ned problemet Försök dela upp uppgiften i olika moment. Ett förslag på uppdelning: Följa en linje Roboten måste kunna följa en linje som är både rak och kurvig. Roboten måste klara av kurvor utan att tappa bort linjen. Klara farthinder Längsmed banan kan det finnas små hinder som roboten måste ta sig över. Hitta tillbaka till linjen efter avbrott Vissa sektioner av linjen saknas och då måste roboten klara att navigera på egen hand tills linjen kommer tillbaka. Upptäcka stort hinder När det finns ett stort hinder framför roboten så måste den navigera runt det. Köra uppför rampen Roboten måste ta sig upp för en 25 graders brant ramp utan att välta. Hitta offret När roboten kommer in i sista rummet måste den kunna hitta offret. Rädda offret Roboten måste även klara av att flytta offret till den säkra zonen, som för de äldre eleverna är en upphöjd plattform. Ramp Offer Plattform Avbrott Hinder Farthinder Figur 1: Bana från RoboCup 2012 i Mexico. Riktigt såhär svårt tror jag inte att det kommer vara i Sverige. 9
Konstruktion För att vinna behöver laget inte bara kunna programmera bra, de måste även ha en bra konstruktion. Det finns flera saker på banan som innebär konstruktionssvårigheter för både Rescue A och Rescue B. Farthinder Pinnar med en diameter på max 1 cm som sitter fast på marken. Småskräp Tandpetare och annat smått som inte sitter fast på marken. Används sparsamt i Sverige. Hinder Större saker som kan stå på eller bredvid linjen och som roboten måste köra runt. Ramp Roboten måste ta sig upp för en ramp för att komma till området med offret. Rampen & Farthinder Detta är huvudsakligen ett konstruktionsproblem. Det gäller att placera tyngdpunkten rätt för att både orka ta sig över farthinder och ta sig upp för rampen. Många robotar fastnar på farthindren eller tappar linjen när de är på väg över hindret. Det kan bero på en rad olika saker och jag tror att eleverna måste testa sig fram för att hitta en bra konstruktion! Många robotar skakar till när de stöter i farthindren och tappar då linjen. Försök att variera hastigheten som roboten kör med. Roboten måste fortfarande ha tillräcklig kraft för att orka över hindret. Robotar med längre hjulbas tenderar att klara av hindren bättre än de med kort hjulbas. Bredden mellan robotars hjul verkar inte påverka robotens förmåga att ta sig över hinder, men däremot gör en bredare hjulbas att roboten är mer stabil och inte hoppar i sidled lika lätt. Experimentera med olika sorters däck i olika material så att roboten inte slirar. Håll också koll på markfrigången så att inte roboten kan få ett farthinder under sig och fastna med hjulen i luften. Farthinder behöver inte alltid vara vinkelräta mot linjen som roboten följer. Försök att hålla ljussensorerna nära marken och skyddade från omgivningen även när roboten kör uppför rampen. Det är även viktigt när roboten kommer högst upp för rampen, ljussensorerna ska aldrig hamna för långt ifrån marken! Får ni problem med rampen så kan ni testa att backa upp för den istället. Men då måste roboten ha något som avgör att ni är framme i rampen så att roboten kan vända sig om. Det går också att sätta på vikter. Ta lite stål eller annat tungt material och tejpa fast på lämpliga ställen på roboten! Det kan hjälpa att öka vikten över däcken. 10
Släpskor eller Glidpluttar Släpskor fungerar bra om de är vinklade på rätt sätt. Annars tar de i farthindren och slits antingen loss eller förhindrar roboten från att röra sig. Figur 2: Släpsko Denna släpsko kan möjligtvis fungera om hjulen sitter längst fram på roboten. Men olyckligtvis så tyder placeringen av ultraljudssensorn och ljussensorerna på att den är designad att röra sig åt höger. Denna släpsko kommer naturligtvis att fastna på farthindret. Länkhjul Ett bakre länkhjul, eller så kallat kundvagnshjul, kan användas om dess diameter är tillräckligt stor för att inte fastna på farthindren. Emellertid är det största problemet med länkhjul att de brukar hamna snett när roboten vinglar fram och tillbaka över linjen, vilket gör att roboten uppträder oförutsägbart. Det kan också innebära stabilitetsproblem när du försöker ta dig över farthindren med en triangulär robotbas. Figur 3: TriBots Länkhjul Det fungerar halvbra. Du kan dock få problem med att L balken tar i farthindret och eftersom hjulet är litet är det svårt att ta sig över större farthinder. 11
Larvband Denna form av drivning klarar nästan alla underlag och klarar farthinder enkelt. De är dessvärre långsamma, men det viktigaste är säkerhet. Tiden spelar endast roll om två lag har samma poäng, eller om roboten överstiger maxtiden såklart. Jag vet flera lag som haft problem med att banden slirar i rampen, men får man till bra grepp är detta ett riktigt bra alternativ! Följa linje För att en robot ska följa en linje måste den ha en sensor som kan upptäcka linjen. De bästa sensorerna för detta är en färgsensor eller en ljussensor. Jag kommer nedan endast skriva ljussensor, för det är den sensor jag arbetat med, men det fungerar lika bra med en färgsensor. För att följa en linje behöver roboten åtminstone en ljussensor. Med bara en ljussensor kan roboten följa en kant av linjen. En bättre lösning är att använda två eller fler ljussensorer, då kan roboten hålla linjen mellan sensorerna. Att använda tre ljussensorer är en mer avancerad metod för att följa linjen och gör att roboten kan hålla den tredje sensorn ovanför linjen hela tiden medan de två andra avgör åt vilket håll roboten ska svänga. Genom att använda smart matematik kan roboten programmeras att svänga snabbare eller långsammare beroende på hur dessa tre sensorer ser linjen. Tre sensorer gör det också enklare att upptäcka när roboten befinner sig vid ett hål i linjen. En ljussensor Vi börjar med att skriva ett program som bara använder en sensor. Tricket för att få en robot att följa en linje är att hela tiden sikta mot dess kant. Här har jag valt den vänstra sidan, men testa gärna att följa höger kant sen! Figur 4: Följer vänster sida Ljussensorn är ovanför vänster kant av linjen när man programmerat den att följa vänster sida. 12
Om roboten startar på linjen ser ljussensorn svart underlag. Då vet vi att linjens vänstra kant är till vänster och roboten bör svänga åt vänster. Vi vill samtidigt att roboten ska ta sig framåt längsmed linjen, så för att svänga vänster kör vi bara höger hjul framåt. Figur 5 Ljussensorn ser mörkt Roboten är på mörkt underlag. Vänstra kanten är till vänster om roboten. Figur 6: Sväng vänster Därför ska roboten svänga vänster. Enda gången som roboten bör se ljust underlag är när vi har kört av linjen åt vänster. Eftersom vi hela tiden strävar efter att följa linjens vänstra kant så behöver roboten svänga höger för att hitta tillbaka till kanten. Då gör vi alltså en sväng till höger genom att köra framåt med vänster hjul. Tillslut kommer den se mörkt igen! Figur 7: Ljussensorn ser ljus Roboten är nu ovanför ljust underlag. Vänstra sidan av linjen måste vara till höger. Figur 8: Sväng höger Därför måste roboten svänga höger till kanten av linjen 13
Genom att sätta dessa två beteenden i en loop kommer roboten studsa fram och tillbaka mellan ljusa och mörka områden. Roboten kommer wobbla sig fram längsmed linjen. Figur 9: Följer linjen Roboten kommer följa linjen tills den tar slut. Nu när du förstår algoritmen så kan vi börja skapa programmet i NXT-G. Figur 10: Börja med ett nytt rent program! 1. Välj Arkiv > Ny 2. Ett nytt Untitled-1 arbetsbord skapas 3. Välj Arkiv > Spara 4. Skriv in ett lämpligt namn på programmet, t.ex. LineTrack1.rbt 14
Figur 11: Nu kan vi börja skriva ett program. 1. Dra ett loop-block till tidsaxeln. Detta block kommer göra att sväng höger respektive vänster upprepas om och om igen så att roboten följer linjen för evigt. 2. Låt inställningarna vara, den ska loopa (upprepas) för evigt. Figur 12: Placera ett förgrenings-block i loop-blocket 1. Sätt kontroll inställningen till sensor 2. Ändra sensor till ljussensor 3. Ändra port till port 1. 4. Ändra jämför till mindre än (<) 45 och lämna generera ljus på. 15
Figur 13: Placera fyra motor-block inuti förgrenings-blocket för att styra robotens rörelser. 1. Kontrollera att du använder motor-block med ett kugghjul och inte kör-block som har två. Motor-blocken är bättre när vi vill kontrollera motorerna separat. 2. På förgrenings-blockets övre gren låter du motorn på port B rotera framåt medan motor C är avstängd. 3. På den nedre grenen ställer du in motorerna på motsatt sätt. Se bild ovan. Figur 14: Testa programmet! 1. Kontrollera så att roboten är på och ansluten med USB till datorn innan du klickar på nedladdningsknappen. 2. Kolla så att du har anslutit motorerna och ljussensorn till rätt portar innan du startar programmet. 3. När du har laddat ned programmet kan du antingen koppla loss den från datorn och välja ditt program i NXTn eller så kan du behålla den ansluten och starta det från datorn med hjälp av körknappen. Om roboten tappar linjen betyder det troligtvis att tröskelvärdet för ljussensorn är fel. Roboten tror att den ser mörkt fast den är på ljust underlag, eller ljust även om den är på mörkt underlag. Roboten letar efter ännu ljusare eller ännu mörkare, men kommer antagligen aldrig hitta det eftersom tröskelvärdena är fel. Om du ser att roboten "studsar" fram och tillbaka längs med linjen så fungerar programmet korrekt, och vi kan gå vidare till ett mer avancerat program! 16
Två Sensorer Nu ska vi skriva ett program som använder två ljussensorer. Det finns många sätt att följa linjen med två ljussensorer, jag beskriver nu ett ganska primitivt sätt eftersom jag vill att lagen själva ska utveckla bättre sätt! Roboten bör hålla linjen mellan dess bägge ljussensorer hela tiden. För att göra det så bör höger ljussensor följa linjens högra kant medan den vänstra följer linjens vänstra kant. För att detta ska fungera måste ljussensorerna sitta på ungefär samma avstånd mellan varandra som linjen är bred. Figur 15: Robot med två ljussensorer Metoden går ut på att ingen ljussensor vill se mörkt. Roboten kommer läsa av en sensor i taget. Skulle höger sensor se mörkt så ska roboten svänga åt höger för att komma bort från linjen igen. Skulle vänster sensor se mörkt så svänger roboten vänster för att flytta tillbaka sensorn utanför linjen igen. Roboten kommer även nu att åka zick-zack längs med linjen, men eftersom vi har koll på både vänster- och högerkanten så kommer roboten klara tvära svängar på ett bättre sätt! Börja med ett nytt program. Gör som vi gjorde tidigare för att skapa en ny tom arbetsyta och spara den som t.ex. LineTrack2.rbt 17
Figur 16: Dra in en evighetsloop till tidsaxeln. Lämna precis som tidigare kontroll på obegränsad. Figur 17: Placera två förgrenings-block i loop-blocket 1. Ställ in dem som ljussensorer, som vi gjorde tidigare. 2. Men konfigurera det första förgrenings-blocket till port 1 och det andra till port 2. 3. Sätt compare värdet till mindre än (<) 40 och lämna generate light på. Observera att dina ljussensorer kan behöva olika tröskelvärden även fast de sitter på samma robot! 18
Figur 18: Placera ett motor-block på vardera grenen av varje förgrenings-block. Stoppa den övre motor och låt den andra köra framåt obegränsat. Figur 19: Kontrollera så att alla ljussensorerna är anslutna till rätt portar och att roboten är ansluten till datorn innan du laddar över programmet. Som jag skrev ovan kan du starta programmet via datorn eller i NXTn. Ta dig tid att läsa igenom hela programmet och se till att du förstår det. Skulle roboten inte följa linjen alls så är det mest troligt ljusvärdenas fel. För att förbättra linjeföljaren kan du tänka på följande: Lägg de två sensorerna i parallella tidsaxlar så roboten kollar dem samtidigt. Mer om parallella tidsaxlar kommer senare. Försök göra så att roboten inte stannar när båda sensorerna ser svart. 19
Två Ljussensorer Alternativ För att visa att det går att göra många olika linjeföljare tar jag upp en till variant. Det är viktigt att eleverna får försöka på egen hand och utveckla egna algoritmer för att följa linjen. Det finns betydligt fler än de metoder jag tar upp här, och många som är bättre! Programmet nedan gör att roboten rör sig jämnare längsmed linjen. Båda sensorerna läses av innan roboten väljer åt vilket håll den ska svänga. Denna linjeföljare kommer alltså veta vilket håll den behöver svänga och fortsätta att svänga när den stöter på skarpa svängar. Figur 20: Alternativ metod att följa linje Det är oftast smart att skriva ned ljusvärdena i en tabell för att få överblick. Speciellt om man skapar en lite större tabell där man kan ha med historik över hur ljusvärdena förändras. Vit Svart Höger ljussensor 62 30 Vänster ljussensor 53 26 Figur 21: Vi börjar med att placera ett loop-block från flödes-paletten på tidsaxeln. Loopen fyller vi med två förgrenings-block enligt bilden ovan. Ändra inställningarna i förgrenings-blocket till ljussensorer, med den första på port 2 och den andra på port 1. 20
Figur 22: Lägg till ett kör-block från Standard-Paletten. Använd bara motorn på Port B. Sätt riktning till framåt och kraft till 50%. Figur 23: Placera ett vänta-block efter kör-blocket. Sätt sensor till ljussensor, port till 1 och tills till mindre än ett värde mellan svart och vitt för sensor 1 (för denna robot 50). 21
Figur 24: Nu lägger du till ett kör-block efter vänta-blocket som stoppar båda motorerna. Figur 25: Lägg in ett kör-block på den övre grenen i första förgrenings-blocket. Ställ in den på port B och C, riktning framåt, svänga åt höger, kraft 50 % och varaktighet till obegränsat. Detta är första halvan av programmet. Du bör nu kunna bygga upp den andra halvan på egen hand. Kom ihåg att roboten ska svänga åt andra hållet och få information från den andra ljussensorn. 22
Figur 26: Det kompletta programmet ska se ut såhär. Ladda över och testa programmet som tidigare! Sådär! Nu har du ytterligare ett sätt att följa linjen. Experimentera med parametrarna tills din robot följer linjen utan att tappa den. Försäkra dig om att du förstår programmet. Hinder Hinder består av stora, tunga föremål som roboten måste ta sig förbi. Till exempel en 1,5 liters PET-flaska med vatten eller en tegelsten. Lagen vet inte på förhand hur stora hindren är, men de är inte jättestora. Roboten måste upptäcka att det är något i vägen och sedan navigera runt hindret för att kunna fortsätta att följa linjen på andra sidan. Roboten får inte medvetet flytta något hinder. Dessutom kan hindren stå nära en vägg så ibland går det bara att ta sig runt hindret åt ett håll. Hinder kan dock aldrig förekomma i korridoren eller på ställen där båda sidorna är blockerade. För att upptäcka hinder kan man bland annat använda Ultraljud Trycksensorer IR-ljus Ultraljud fungerar ganska bra, men om hindren är runda kan ultraljud ge osäkra resultat då ljudvågorna studsar tillbaka från hindren med en vinkel istället för rakt tillbaka till sensorn. Jag ska visa en lösning som använder en trycksensor. 23
Hitta hinder med Trycksensor Att upptäcka hinder med trycksensor är ett av de enklare sätten och eftersom hela uppdraget är rätt svårt är det bra att hålla varje del så enkel som möjligt. Roboten måste konstrueras så att trycksensorn sitter längst fram på roboten, utan att påverka ljussensorerna eller sensorerna för att upptäcka offret. Figur 27: Jag monterade lego-trycksensorn längst fram på TriBot så att den sticker ut framför ljussensorerna. Jag har nedan ersatt algoritmen för att följa linje med en raksträcka, eftersom sättet att följa linje är oväsentligt här. Det är bra att bygga sina program i delar och nu vill vi bara utveckla den del som tar sig runt hinder. Figur 28: Placera ett loop-block på tidsaxeln med ett kör-block inuti som körs obegränsat långt. 1. Ändra inställningarna för loop-blocket till en trycksensor. 2. Se till att du väljer rätt port för din trycksensor, min sitter på port 4. 3. Sätt åtgärd till intryckt. 24
Ladda ned programmet och placera roboten framför ett hinder, när du startar programmet bör roboten köra framåt tills den krockar i ett hinder. Som du märker så tvärstannar inte roboten när trycksensorn aktiveras. Kör-blocket försöker inte bromsa motorn när loopen tar slut, den rullar med friläge tills friktionen bromsar den. Eftersom vi vill att roboten inte välter eller flyttar hindren måste vi omedelbart stoppa båda motorerna. När roboten har hittat ett hinder ska vi skriva en rutin som navigerar runt det. Du kan använda flera metoder för att ta dig runt hinder, t.ex. genom att montera en annan trycksensor på sidan av roboten som gör att roboten kan känna sig runt hindret. Det är ett bra sätt att ta sig runt hinder, eftersom ni inte vet hur stora hindren är. Tyvärr kräver det en till sensor och det brukar vara brist på ingångar till NXTn. Nedan använder jag mig av rotationsräkning för att ta mig runt hindret, eftersom det är relativt enkelt. Figur 29: Programmet ovan är bara en skiss och du behöver experimentera och justera parametrarna för att din robot ska ta sig runt specifika hinder på ett bra sätt. Lägg märke till att jag använder motor-block istället för kör-block i mitten av programmet. Detta gör jag för att roboten ska stanna direkt ljussensorn på port 3 upptäcker linjen. Var uppmärksam på denna skillnad mellan blocken när du programmerar din robot! Genom lite experimenterande kan du snart programmera din robot att ta sig förbi allehanda hinder och hitta tillbaka till linjen på andra sidan! Naturligtvis måste ditt program även klara av att följa linjen och klara sig förbi avbrott, men det är bra att dela upp programmet i separata delar. Klarar eleverna av att dela upp ett komplext problem i mindre delar blir de duktiga problemlösare! 25
Hitta offer När roboten har tagit sig upp för rampen så återstår det att hitta och leverera offret till det säkra området. Det finns flera sätt att söka efter offret: Slumpvis sökning: Roboten kör framåt och bakåt medan den svänger lite vid varje vändning för att genomsöka hela rummet och förhoppningsvis hittar roboten offret med t.ex. en trycksensor. Ljussensor och lampa Denna metod fungerar väldigt bra om det inte vore för plexiglasväggarna som används i vissa arenor. Dessutom kräver den en ljuskälla, t.ex. en ficklampa som måste vara tillräckligt liten för att få plats på roboten, men samtidigt tillräckligt stark för att något ljus ska reflekteras tillbaka till en ljussensor. Laser har används förr, men är nu inte tillåtet på grund av säkerhetsaspekter. Ultraljud Ultraljudssensorn kan också användas för att upptäcka offret. Som jag tidigare nämnt har den problem med att se runda föremål, men jag vet många lag som lyckats använda ultraljud för att hitta offret utan några problem! Två avståndssensorer Genom att ha två riktade avståndssensorer på olika höjd kan roboten dra slutsatsen att offret finns framför sensorerna när de läser av olika avstånd. Nedan är ett enkelt program som använder en ultraljudssensor för att hitta offret. Roboten åker in i övre rummet en bit och gör därefter en långsam sväng samtidigt som den läser av ultraljudssensorn. Eftersom ultraljudssensorn inte ser hur långt som helst, är det inte säkert att roboten hittar offret på första vridningen. Då måste roboten köra fram lite till och göra en ny sökning efter offret. Figur 30: Ett enkelt sökprogram 1. Första kör-blocket kör roboten in i rummet några decimeter. 2. Andra kör-blocket svänger roboten till vänster lite mindre än 90 grader. 3. Tredje kör-blocket svänger roboten åt andra hållet tills ultraljudssensorn, fjärde blocket, ser något närmare än 50cm. 4. På grund av att ultraljudssensorn har ett så brett synfält kommer roboten stanna innan den pekar rakt mot offret. För att kompensera för detta la jag in det femte blocket som vrider roboten lite till mot offret innan den kör fram till offret med det sjätte blocket. Att använda Ultraljud för att hitta offret är inte jätteenkelt eftersom den har ett brett synfält och ljudvågorna studsar lite snett tillbaka från offret. Du kan försöka att smalna av sensorns synfält med ett rör av kartong eller liknande. Eller försöka använda en annan metod att upptäcka offret? När roboten har lokaliserat offret ska den köra fram för att flytta det till det säkra området. Först då är en säker räddning genomförd! 26
Fördjupning För att klara hela banan måste roboten programmeras på ett sätt som gör att den kan agera i en okänd miljö. För att klara detta måste roboten konstant övervaka sensorerna för att se om en viss situation uppstår och i sådana fall reagera på rätt sätt. När en händelse sker så aktiveras ett speciellt beteende. Det kan liknas vid med mänskliga reflexer. Till exempel behöver roboten hela tiden vänta på att hindret kanske hamnar i robotens väg, samtidigt som den följer linjen. Om roboten upptäcker hindret måste den snabbt sluta att följa linjen och istället navigera runt hindret. Programmet behöver en simultankapacitet för att övervaka vissa händelser, hinder, avbrott, ramp etc. samtidigt som det gör något annat som att följa linjen. Händelser & parallella tidsaxlar NXT-G klarar att köra olika delar av programmet simultant med hjälp av något som kallas parallella tidsaxlar. Till exempel kan två motor-block köras samtidigt. Figur 31: Parallella tidsaxlar För att lägga till en axel som körs samtidigt som huvudprogrammet måste vi dra ut en ny lego-balk från startpunkten. Klicka och dra med musen ifrån den nedre delen av startpunkten, dra nedåt och sedan till höger, liknande bilden ovan. Dubbelklicka för att avsluta dragningen. Du kan även skapa parallella tidsaxlar mitt i programmet med hjälp av shift-tangenten, men jag tycker att programmet kan bli rörigt då. 27
Figur 32: Dessa program kan vid första anblicken verka vara identiska. Programmet till vänster har två motorer som kör i en sekund vardera. Programmet till höger har två motorer med exakt samma inställningar. Programmen är dock inte likadana, om du kör det vänstra programmet kommer motor B att rotera i en sekund och sedan stanna, därefter kommer motor C att köra en sekund och sedan stanna. I programmet till höger kommer båda motorerna köras samtidigt i en sekund eftersom de ligger på parallella tidsaxlar. Som jag tidigare nämnde måste vår robot klara av att Vänta på att händelser ska triggas, t.ex. en trycksensor som känner av hinder. Byta från ett beteende till en annan när roboten kräver det, t.ex. byta från linjeföljning till att navigera runt hindret. Roboten behöver veta vilket beteende den ska utföra. Om vi tilldelar varje beteende ett nummer kan vi spara dem i en variabel som kan ändras när olika händelser upptäcks av robotens sensorer. Vi kan skapa en lista med beteenden och dess nummer 0. Linjeföljning 1. Hinder 2. Avbrott 3. Söka och rädda offer Nu behöver vi en kontrollstruktur som kan hantera flera händelser. Det första som dyker upp i huvudet (åtminstone för mig) är en switch-sats som väljer ett bland flera alternativ. Lyckligtvis har NXT-G ett flervals-block! Förgrenings-blocket kan ställas in så att det klarar fler än två olika val och därmed skapas något som motsvarar en vanlig switch-sats. Programmet nedan har ett förgrenings-block som jag har ändrat till kompakt läge (genom att bocka ur rutan platt vy ) med kontrollparametern satt till värden. Om du sedan väljer typ till nummer kan du lägga till fler alternativ genom att trycka på den lilla + symbolen i villkors-rutan. Jag la in fyra olika val som dyker upp som olika flikar, en för varje beteende. Figur 33: Multi-val-block med fyra alternativa sekvenser Du kan hålla musen över varje flik för att se vilket värde som är tilldelat till den, och genom att klicka på den så ser du de programmeringsblock som kommer köras när det värdet är uppfyllt. 28
En fördel med denna metod är att lagen kan dela upp arbetsuppgifterna mellan sig och medlemmarna kan lösa olika problemen separat. När ett beteende fungerar så behöver det bara inkluderas i huvudprogrammet. Multi-Tasking Algoritm funktion Beteende1: { // Programmet följer linjen och tar // sig över farthinder } funktion Beteende2: { // Programmet tar sig runt hindret } funktion Beteende3: { //... } funktion Beteende4: { //... } funktion Huvudprogram: { kontrollera(beteendenummer): { om 1: anropa Beteende1 om 2: anropa Beteende2 om 3: anropa Beteende3 om 4: anropa Beteende4 } } Så här kan algoritmen se ut i ett textuellt språk. Nu ska jag visa hur du kan byta mellan olika beteenden med NXT-G block. Vi behöver ett sätt att generera och spara ett värde när en händelse inträffar. För att spara ett värde ska vi använda en variabel. För att skapa värdet behöver vi block som konstant kontrollerar om en specifik händelse inträffar och när den gör det, sparar rätt värde i variabeln. 29
Först skapar (deklarerar) vi en variabel, alltså en plats där vi kan spara värden. Figur 34: Skapa ett nytt program och kalla det t.ex. HittaHinder.rbt. Figur 35: Nu väljer du Redigera och sedan Definiera variabler Figur 36: Välj Skapa. Skriv in namnet på variabeln i Namn fältet och ändra Datatyp till Nummer. Därefter klickar du Stäng. 30
Figur 37: Lägg in ett förgrenings-block i en yttre evighetsloop Loopen lämnar vi på för evigt eftersom vi hela tiden vill leta efter hinder. Kom ihåg att det kan förekomma fler än ett hinder. Kolla så att porten är till den trycksensor som du använder för hinder. Figur 38: Placera ett Matematik-block och ett Variabel-block på båda grenarna i förgrenings-blocket. Dessa block hittar du under data-panelen. Ta fram data-hubbarna genom att klicka på fliken längst ned till vänster i blocken. Där kan du ansluta datakablar som skickar information mellan olika block. 31
Figur 39: Välj det översta matematik-blocket och sätt Funktiom till Addition och B till 1. Sedan väljer du även det nedre matematik-blocket och sätter Funktion till Addition samt B till 0. Figur 40: Ändra variabelblocken så de skriver till den variabel, BeteendeNummer, som du nyss skapade. Det tillåter oss att ändra värdet av variabeln. Figur 41: Om du håller musen över #-anslutningen från matematik-blocket så kommer musen ändras till en trådrulle. Du ska klicka och dra ut en sladd därifrån till variabel-blockets #-anslutning. Ledningen som binder samman dessa ska vara gul. Gör detta för båda grenarna i förgrenings-blocket. 32
I vårt program vill vi att variabeln ska ändras till 1 om trycksensorn trycks in. Men hur ska vi veta att det fungerar!? Genom att sätta in block för felsökning i programmet kan vi se att värdet av variabeln ändras när vi trycker in sensorn. NXT-G har möjlighet att skriva ut text och grafik till skärmen. Därför kommer vi att skriva ut värdet av BeteendeNummer till skärmen så att vi kan se att värdet ändras korrekt. När du programmerar är det bra att på det här sättet verifiera att ditt program fungerar som du har tänkt dig. Figur 42: Placera ett variabel-block, ett Nummer till Text -block och ett NXT-Fönster-block på tidsaxeln efter förgrenings-blocket. Figur 43: Ändra inställningarna som ovan. Detta variabel-block kommer hämta det värde som vi sparar i förgrenings-blocket. Om trycksensorn är intryckt bör detta värde vara 1, annars bör det vara 0. Låt inställningarna för Nummer till Text -Blocket vara. Figur 44: Ändra NXT-Fönster-blockets åtgärd till text, låt allting annat vara. Dra datakablar mellan blocken som Figur 42 visar och ladda över programmet till din robot. Se till att du har en trycksensor ansluten till rätt port på din robot innan du startar programmet. Om allting fungerar ska skärmen visa en 1 när du trycker på trycksensorn. När du släpper ut trycksensorn så ska den återgå till en 0. 33
När du väl vet att allting fungerar som det ska, kan du ta bort felsökningsblocken från ditt program. Ju färre block NXTn behöver bearbeta, desto snabbare och resurssnålare kommer ditt program bli på din NXT. Mina Ikoner För att ditt huvudprogram ska bli mer kompakt och överskådligt kan du skapa hemgjorda block, så kallade Mina Ikoner. Dessa är egentligen minimerade program som du kan öppna och modifiera om du behöver. En annan fördel med Mina Ikoner är att utvecklingsverktyget du programmerar i inte behöver ladda in alla block på en gång och därför går snabbare att arbeta med. Om ni har problem med att programmeringsmiljön laggar eller kraschar kan Mina Ikoner hjälpa er! Figur 45: För att skapa Mina Ikoner behöver ni markera er färdiga "hitta hinder"-rutin genom att dra musen runt alla blocken på skärmen. Figur 46: Under Redigera menyn väljer du "Skapa en ny Min ikon-fil". 34
Figur 47: Följande fönster kommer dyka upp. Döp blocket till någonting meningsfullt, t.ex. HittaHinder. Skriv in en beskrivning om du vill, och välj sedan Nästa. Figur 48: Välj en beskrivande ikon att ha på ditt egna block och välj sedan Slutför. Du kan läsa mer om Mina Ikoner (My Blocks) på NXT Programs http://www.nxtprograms.com/help/myblocks/tutorial.html 35
Nu kan vi använda vårt HittaHinder-block i vårt huvudprogram. Figur 49: Här ser vi ett räddningsprogram under utveckling! HittaHinder-blocket har placerats på en parallell tidsaxel så att programmet kollar efter den händelsen simultant. Jag tänker inte visa innehållet i de andra hemgjorda blocken, det klurar ni nog ut på egen hand! Huvudprogrammet kommer hela tiden övervaka variabeln BeteendeNummer som vi läser med det första blocket i loopen. Värdet skickas vidare med en datakabel till förgrenings-blocket och beroende på vilket värde det är körs olika delar av programmet. Fall 0 = Linjeföljning Fall 1 = Ta sig runt hindret Etc. 36
Vanliga fel Ljusvärdena! Så fort roboten tappar linjen utbrister lagen Det är de där jävla ljusvärdenas fel! Därefter springer de till datorn för att justera dem, det är ett evigt justerande upp och ned. En ljussensor klarar enkelt av att se en svart linje i ett ljust klassrum, men tävlingsarenan kanske har dålig belysning och skuggor vilket ställer till problem för sensorn. Mitt råd är att bygga en robot som inte påverkas av de yttre ljusförhållandena. Kapslar ni in ljussensorerna så att inget yttre ljus kan nå dem, kommer ljusvärdena hålla sig stabila. Försök också att montera ljussensorerna så nära marken det bara går. Om de sitter de för långt ifrån marken studsar för lite ljus tillbaka in i sensorn som mäter det reflekterade ljuset. Var beredd på att justera ljusvärdena vid tävlingen. Antingen kan ni kalibrera robotarna manuellt genom att läsa av extremvärdena, eller kan ni skriva en kalibreringsrutin i ert program så att roboten automatiskt kalibrer sig när du startar programmet. Men kom ihåg att ni inte alltid har tillgång till tävlingsbanan för att ta sensoravläsningar. Läs mer om hur du undviker problem med ljusvärdena på www.robocupjunior.se Batterierna! Roboten drar snett! Det måste bero på batterierna! Det hör jag inte lika ofta längre. Förr när alla använde Lego Mindstorms RCX så hade inte motorerna inbyggda rotationssensorer och då var det vanligt att motorerna gick olika snabbt, vilket fick till följd att roboten drog snett. Det ligger en del sanning i påståendet. Roboten kan fortfarande bete sig märkligt när batterierna håller på att ta slut. Men om NXTn har mer än 7V tror jag på andra orsaker. Testa att para ihop bra däck med varandra? Skiljer det bara någon mm i diameter så gör det stor skillnad på långa raksträckor. Värt att notera är också att olika programmeringsspråk har olika algoritmer för att synkronisera hastigheten på motorerna. Min erfarenhet säger att LeJOS pilot går rakare än NXT-Gs kör-block. I Rescue A så är inte detta ett så stort problem eftersom den enda gången roboten manövrerar fritt är i offer-rummet, och där är precisionen inte jätteviktig. 37
Inga fler portar! Åhnej, vi har inte plats att ansluta fler sensorer/motorer! Det är lite tråkigt att NXTn bara har fyra ingångar och tre utgångar. Som tur är finns det flera sätt att lösa detta på! Flera processorer Robotar kan byggas med fler än en processor. Genom att använda två NXTs kan du kontrollera upp till 6 motorer och 8 sensorer. Med detta kan du skapa väldigt coola konstruktioner med många typer av rörelser. Programmen på varje NXT kommer köras oberoende, men kan synkroniseras vid vissa ställen i programmet genom att använda sensorer eller Bluetooth. Ett primitivt sätt att kommunicera mellan två NXTs är genom att ansluta en ljussensor till en NXT och en lampa till den andra. Då kan du skicka över meddelanden genom att blinka med lampan och räkna längden eller antalet blink. Bluetoothkommunikation Ett modernare sätt är att skicka trådlösa meddelanden via Bluetooth. Det kan vara ett bra sätt för att synkronisera de olika programmen. En NXT kanske sköter mekanismen för att lyfta burken medan den andra har koll på drivhjulet. Då kan den senare NXTn skicka ett kommando när den har hittat burken så att den första vet att den ska lyfta. En NXT måste agera master och den kan hantera upp till tre slavar. Mastern kan skicka och ta emot meddelanden från alla slavarna. En slav kan bara skicka och ta emot meddelanden från mastern, inte mellan varandra. Observera att du kommer behöva åtminstone 1 sekunds marginal innan du skickar meddelanden till andra NXTs för att processorn tar tid på sig att byta Bluetoothkanal. Innan programmet som använder Bluetooth startas måste varje NXT paras ihop med sin master för att tilldelas ett anslutningsnummer. Kom ihåg att ge varje NXT ett unikt namn, eftersom du behöver kunna referera till dem när du försöker para och ansluta dem. Exempel på hur man kan använda Bluetooth i NXT-G finns på www.robocupjunior.se 38
Inget Lego? Vad gör man om man inte har Lego? Många skolor har inte Lego Mindstorms, FischerTechnik, RoboRobo, VEX Robotics eller något annat kommersiellt kit för att konstruera robotar. Detta är inget hinder för att delta i RoboCup Junior! Det finns inga begränsningar på vilka delar man får använda på sin robot. Internationellt sett så är det väldigt vanligt att lag bygger sina robotar från grunden, det vill säga av elektronik. Viktigt att poängtera är att det inte är omöjligt! Har du understimulerade elever eller elever som älskar utmaningar tycker jag att de ska få testa att bygga sin egen robot! Det är otroligt lärorikt och samtidigt roligt! Eleverna kommer lära sig mer om de är med och planerar allt från sensorer, processorer och kretskort från grunden. Jag känner till skolor som tycker att det passar perfekt att bygga robotar i kursen Teknik 1! Kursen skulle passa bra för legorobotar, ännu bättre för egenutvecklade robotar! Jag tror att RoboCup täcker in väldigt många (alla?) av målen för kursen! Kom ihåg att det kan krävas en hel del av eleverna, men det är långt ifrån omöjligt! Jag vet att högstadieelever skulle fixa det om man inte bygger alltför avancerade robotar! 39
Lego med fördelar Hårdvara Om man inte riktigt är redo för att bygga en helt egen robotplattform men ändå vill ta det ett steg längre så rekommenderar jag att behålla NXTn och bygga egna sensorer till den. Det gjorde jag i en övergångsfas och det ger nya möjligheter till era NXT robotar! Bygg era egna sensorer eller testa att ansluta en Arduino som co-processor till din robot! Lego uppmuntrar "hackare" att förbättra deras produkter. All dokumentation går att ladda hem gratis från Mindstorms hemsida. NXTn går enkelt att bygga ut med hjälp av standardprotokoll, såsom I 2 C. Vill man inte bygga egna sensorer så finns det flera företag som redan tillverkar tredjepartssensorer för NXT. Värt att nämna är HiTechnic, Mindsensors och Dexter Industries som alla tillverkar väldigt bra sensorer för Lego Mindstorms. Även detta utvecklar elevernas kunskap eftersom de måste läsa på om ny hårdvara och skriva program som kan hantera mer indata. Mjukvara NXT-G som jag har visat här hur man programmerar i kan vara bra för nybörjare och är relativt lätt att komma igång med, men när man vill göra mer avancerade program så känns det väldigt begränsat. Då kan man istället programmera NXTn textuellt, och släppa lös oanade möjligheter! De mest populära textuella språken för NXTn är NXC (Not exactly C) och LeJOS, som är baserade på C respektive Java, men sedan finns det en hel uppsjö av olika språk anpassade för NXTn! Både NXC och LeJOS är gratis att använda och är lätta att komma igång med, speciellt för någon som har programmerat textuellt tidigare. Personligen så föredrar jag LeJOS, då det är ett kraftfullt språk och har en aktiv community. Det inkluderar ett stort bibliotek med färdig kod som underlättar mycket när man vill göra mer avancerade saker. Och så är det open-source, så all källkod finns fri tillgänglig så man kan se hur allting fungerar (eller varför det inte fungerar). 40
Experimentera! Även du som mentor får leka med lego! Om alla elever koncentrerar sig på sina problem kanske du har lite tid över att pilla på en egen robot? Jag tror att det är inspirerande för eleverna att se att även du kan arbeta med samma verktyg som dem. Ofta är det bästa sättet, eller till och med enda sättet, att hitta lösningen på problem genom att testa sig fram! NXT är ett bra verktyg att experimentera med, eftersom det är enkelt, snabbt och inte farligt att göra fel. Om du undrar vad ett speciellt block gör, eller vad som händer om du använder det på ett speciellt sätt Skriv ett enkelt testprogram och se vad som händer med en lämplig robot! Gör en ändring av blockets inställningar och se vad skillnaden blir! En generell regel när du testar dig fram är att hålla allting så enkelt som möjligt. Gör ditt testprogram så simpelt som möjligt och testa endast en ny sak i taget. Få den saken att fungera innan du lägger till någonting nytt, och när du testar olika inställningar är det bäst att bara variera en sak i taget. Tack! Hoppas vi ses på någon tävling i vår! Fredrik Löfgren 41