Till KTH:s startsida Till KTH:s startsida

Introduktion till Lego Mindstorms

Introduktionsföreläsningen

Lego Mindstorms, intro.pdf

Hämta ut robot, depositionsavgift

Byggsatsen för roboten hämtas ut på studerandeexpeditionen, plan 4, måndag 17/11.
Gruppen måste betala en depositionsavgift på 2 500 kr för en robot. 

Information om hur utlämnandet av roboten går till finns på sidan "Kvittera ut robot och projektskåp".

Roboten, Lego Mindstorms NXT

http://cache.lego.com/bigdownloads/buildinginstructions/4589647.pdf - en teknisk beskrivning av robot, motor, sensorer m.m. Den byggbeskrivning som finns i början av dokumentet (steg 1-20) används som utgångspunkt för de enkla programexempel som presenteras längre ned.

Notera att ni kommer att använda er av programmeringsspråket NXC (Not eXactly C), inte det språk som anges i dokumentet ovan.

Programmeringsspråket Not eXactly C och utvecklingsmiljön Brix Command Center

http://bricxcc.sourceforge.net/ - utvecklingsmiljö, installationsinstruktioner

http://bricxcc.sourceforge.net/nbc/ - språket NXC, dokumentation och kodexempel
http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/ - dokument om syntax och alla fördefinierade funktioner

Komma igång

Alla exempel nedan utgår från en robot byggd enligt steg 1-20 i beskrivningen ovan.

Koppla in den påslagna roboten till datorn med den medföljande USB-kabeln innan du startar BrixCC. När du startar BrixCC försöker utvecklingsmiljön kontakta roboten väljer du inställningarna nedan (för att kontakta en robot när BrixCC redan är igång väljer du Tools > Find Brick från menyn).
None

Kommandon för att kompilera kod, ladda ned kod till roboten samt exekvera kod finns på menyn Compile.

Om du har en dator med Windows och en 64-bitars processor och Brixcc inte "hittar" roboten trots att den är påslagen och inkopplad med USB-kabeln behöver du förmodligen installera en speciell driver. Följ instruktionerna på http://nxtemplar.blogspot.se/2009/09/connecting-to-nxt-on-windows-7-64-bit.html.

Syntax

Syntaxen för NXC liknar till stora delar C, men är något begränsad. Det finns dessutom ett stort antal fördefinierade funktioner för att t.ex. styra motorer eller läsa av sensor-värden.
Det går att definiera funktioner och funktionsprototyper (dock inget stöd för separata header-filer). NXC skiljer på procedurer, som inte returnerar något (d.v.s. void), respektive funktioner, som returnerar något.

Några enkla kodexempel

Kodexemplen hittar du undersidor till denna sida samt i denna zip-fil: NXC-examples.zip

Hello World

Alla NXC program börjar startar med "task main()". 
helloWorld.nxc spelar upp en ljudsekvens. 

Sensorer samt funktioner och procedurer

Notera att om läsa av en sensor kontinuerligt, i en loop, måste vi lägga in en kort fördröjning mellan anropen (funktionen Wait). I annat fall kommer vi att sluka all processor kraft i denna loop ("busy polling"). Om jag t.ex. vill vänta på att en trycksensor kopplad till ingång 1 trycks in kan jag skriva så här:

          while(SENSOR_1 != 1)
          {
               Wait(20);
          }

amoebaWithFunctions.nxc innehåller några korta procedurer (svänga, backa) samt ett main. Programmet läser av ultraljudssensorn. Om avståndet till ett hinder är < 15 cm backar roboten, svänger och försöker ta sig fram i den nya riktningen.

throwDice.nxc innehåller en enkel funktion (returnerar ett tal i intervallet 1-6) och en enkel procedur.. Huvudprogrammet läser av en trycksensor (som en knapp); om man trycker på sensorn slumpas ett tal 1-6 och visas på displayen.

Exempel med färgsensorn

colorSensorRaw.nxc läser rådata från färgsensorn i form R, G och B-värden.
colorSensor.nxc läser data med en funktion, ReadSensorColorEx, som  matchar sensorns värde mot en uppsättning färger.

Multitasking

Det är möjligt att köra flera uppdrag, tasks, parallellt. Du definierar nya uppdrag/tasks som:

task someTask()
{
   // uppdraget
}

Man kan schemalägga nya tasks med funktionen Preceds på detta sätt:

task main()
{
     Precedes(someTask, someOtherTask); 
     ...
}

När aktuellt task, i detta fall main, har avslutats startas de två nya tasks som angetts som argument. Dessa exekveras sedan parallellt.
helloMultiTasking.nxc är ett enkelt exempel där ett task spelar upp ljud och ett annat task parallellt roterar roboten.

Förväxla inte ett task med en funktion; en funktion som anropas (i ett task, t.ex. main) exekveras sekventiellt.

Skydda data vid multi tasking - mutex

Det kan uppstå problem om parallella uppdrag/tasks accessar samma data (eller resurs som t.ex. en motor). Vi måste förhindra att ett task läser ett data samtidigt som ett annat task skriver i detta data (eller båda skriver samtidigt).
Vi kan förhindra detta genom att "låsa" det aktuella datat/resursen när ett task accessar detta. Andra tasks som vill ha tillgång till samma resurs får då vänta tills det låset, även kallat mutex, släpps.

Exempel...

Lärare Anders Lindström skapade sidan 2 oktober 2013

Lärare Magnus Brenning ändrade rättigheterna 11 november 2013

Kan därmed läsas av studerande och lärare och ändras av lärare.

Lärare Anders Lindström ändrade rättigheterna 25 november 2013

Kan därmed läsas av alla och ändras av lärare.