Introduktion till Lego Mindstorms
Introduktionsföreläsningen
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).
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...