Schietspel met
Mindstorms NXT en RCX
Dit
is mijn eerste bouwwerk met de Lego Mindstorms NXT programmable brick (Oktober 2006).
Het programmeren is even wennen. Vooral omdat er nogal wat fouten in de LabView software zitten, die bij het maken van grotere programma’s aardig lastig kunnen zijn. Als je de NXT software eenmaal in de NXT hebt zitten werkt alles prima overigens! De mogelijkheden zijn enorm!
Het spel:
Een boevenbende heeft zojuist ingebroken in het huis van je overburen. Binnen doorzoekt iemand de kamers. Buiten houden 3 man de wacht op straat terwijl nog 2 andere boeven de auto uit de garage proberen te halen.
Jouw taak is de boeven zo snel mogelijk uit te schakelen met je rubber kogels! Maar de boeven lopen heen en weer! En als ze dan eindelijk eens stil blijven staan dan verschuilen zij zich achter een boom! Lukt het je om 2 wachters op straat uit te schakelen dan slaat de 3e wachter alarm. De boef in het huis probeert via de deur te ontsnappen terwijl de twee bij de garage de auto er uit halen. Dit is je kans om de boef in het huis uit te schakelen! Schiet je raak dan hoor je “Ahhhh” of “Oehhhh” en krijg je een flink aantal punten bij je score! Maar de boef die de auto bestuurt zit uitgerekend net achter een boom. Die krijg je nog steeds niet te pakken. Dan opeens probeert hij te vluchten en rijdt de auto de garage uit. Voor jou de kans om de laatste boef uit te schakelen! Hoe sneller je de boeven hebt uitgeschakeld, hoe meer punten je krijgt!
Pas op, je hebt maar 3 minuten de tijd! Maar als je de boef bij de garage èn die ene die in de deuropening verschijnt binnen 30 seconden uitschakelt, dan krijg je nog eens een extra bonus en extra speeltijd! De maximum score is 300 punten. Gaat je dat lukken?
Wat grotere foto’s van het spel aan de voorzijde en achterzijde. En voor de echte liefhebber: Shoot Out - The Movie.
En waar schiet je die boeven dan eigenlijk mee voor hun raap? Gewoon, met een politiepistool natuurlijk!
|
MiniFig
één keer vast, nooit meer los. De
boeven krijgen het flink voor hun kiezen! De MiniFigs moesten dus goed aan het
omval-detectie-mechanisme vast zitten. Het zou vervelend zijn als je de
MiniFigs om de haverklap weer op hun voetstuk terug zou moeten zetten. Door
een |
|
Omval-detectie-mechanisme. Om
het omvallen van de MiniFigs te kunnen detecteren heb ik rotatiesensors
gebruikt… In theorie kan je op deze wijze een onbeperkt aantal poppetjes in
de gaten houden.
Het
“wegdek” onder de MiniFigs beweegt mee zodat ze niet over de grond schuren
als ze omgevallen zijn. |
|
Een
RCX aan een NXT gekoppeld. Bij
LabView zat wel helptekst over
het gebruik van RCX Rotatiesensors op de NXT maar de programmeer blokken
ontbraken. Dat is balen, helemaal voor niets die converter kabeltjes gekocht?
Ik e-mails gestuurd naar Lego waarom ze wel kabeltjes verkopen maar niet de
programmeerblokken voor RCX sensors in LabView meeleveren? Ik kreeg een vaag
antwoord wat er op neer kwam dat oude sensors niet ondersteund werden in de
software… Juist… wat nu? Ik
kwam op het idee om de rotatiesensors gewoon op de RCX aan te sluiten en de
motoruitgangen van de RCX als Tast Sensor te laten werken op de Touch Sensor
input poorten van de NXT. Met die speciale kabeltjes dus. Dit werkt! Als de
rotatiesensoren merken dat er een MiniFig wordt neergeschoten krijgt de NXT
een “Touched” signaal en gaat punten tellen… Overigens
is er begin november 2006 een LabView Update verkrijgbaar waarmee je nieuwe
NXT programmablokken kan downloaden en in je LabView bibliotheek kan opnemen!
En laten toen ook die RCX
sensorblokken te downloaden zijn! Als je de “Legacy Block Library” hebt
geïnstalleerd kan je de RCX dus achterwege laten! |
|
Precisiepositionering
van de MiniFigs Met
de Servo Motoren van de NXT is het mogelijk precies te bepalen waar de
MiniFigs komen te staan. De rotatiesensor van de RCX kent maar 16 “stappen”
bij één volledige omwenteling.
|
|
Verstevigde
bomen en hekwerk Op
deze foto kan je zien dat de bomen aan de achterzijde over de lengte van de
boom verstevigd zijn met een Lego Technic balk. Deze is met enkele pinnen in
de boom verankerd en loopt tot onder de grond door. Onder de grond, onder de
stoep eigenlijk, is de Technic Balk van de boom verankerd in het frame van
het hele bouwwerk. Je zou het spel aan de bomen kunnen optillen. Nu is dat
niet de bedoeling, maar de bomen blijven zo wel heel als je er op schiet! Hetzelfde
geldt voor de hekjes die op de stoep staan. Eigenlijk staan de hekjes niet op
de stoep. Maar de rode paaltjes (Technic Liftarms) steken door de stoep heen
en zijn verankerd in het onderliggende frame van de spelconstructie. Zo
verschuilen de MiniFigs zich achter objecten die nooit van hun plaats zullen
wijken! En heb je de lantarenpalen al eens goed bekeken?!
Die klappen om als je ze raakt! Een geweldig idee van Tim (7jr) dat hij zelf
gebouwd heeft. |
|
Speciaal
autootje Het
wagentje dat uit de garage rijdt is aan de achterzijde opengewerkt zodat de
MiniFig er zonder hindernissen uit kan vallen als het geraakt wordt. Het
wagentje is vrijwel massief gebouwd om er voor te zorgen dat het ook na een
intensieve beschieting gewoon heel blijft. Ook het wagentje is verankerd
gemonteerd op de onderliggende bewegende delen. |
MLCAD-file: MiniFig montage-instructies
RIS 2.0 : RCX verbinding met NXT v03
NXT : ShootOut programma v12
Pas op als je de LabView file “ShootOut-12.rbt” wilt bewerken. In de oktober 2006 release van LabView zitten bugs die het bijzonder lastig maken delen van een groot programma als dit te “verplaatsen”. Ook bij het tussenvoegen van blokken kunnen er vreemde zaken gebeuren. Zo kan je bijvoorbeeld opeens je blok “kwijt” zijn. Het is er wel maar je ziet het nergens meer, erg lastig. Zorg dat je altijd een vorige versie opgeslagen hebt voordat je gaat schuiven met blokken!
RCX programma (klik
op plaatje voor groter afbeelding):
De hoofdstapel
zet de variabelen op nul en reset de rotatiesensors automatisch als deze de
verkeerde kant op worden bewogen wanneer de MiniFigs rechtop worden gezet. De
sensors blijven zo op scherp staan waardoor de Sensorstapels altijd goed
reageren as er een MiniFig omvalt.
De twee sensorstapels (één achter, één voor) zijn elk in staat twee direct achter elkaar omvallende MiniFigs in dezelfde rij te registreren. Dit komt zelfden voor… maar toch. De RCX genereert een “Tast Sensor Ingedrukt” signaal door de motor poort (A en B) van “stationair” op “remmen” te zetten. “Stationair” ziet de NXT als “niet ingedrukt”. “Remmen” ziet de NXT als “Ingedrukt”. Als er een MiniFig omvalt houdt de RCX desbetreffende NXT tastsensor poort 0,2 seconden “ingedrukt”.
De voorste rij Minifigs = RCX Rotatiesensor 1 = Motor A = NXT Tast Sensor 1. Het display laat de waarde van de rotatiesensor zien die op dat moment in beweging is.
Display op “0” wil zeggen “alles in rust”. Display op “-4” wil zeggen dat een MiniFig is omgevallen. De rotatiesensor wordt direct daarna weer op “0” gezet. De RCX moet overigens worden gestart voordat de NXT start. Je kan ‘m verder met rust laten.
NXT programma (klik
op plaatje voor grotere afbeelding):
De NXT Software is wat ingewikkelder. Wat me deze eerste keer direct opvalt is dat het programmeren in LabView vaak omslachtiger is dan voor de RCX in RIS 2.0. De NXT-blokken staan “dichter bij de machinetaal”. Dit blijkt bijvoorbeeld uit het volgende :
Een waarde van een variabele op het display laten zien is in RIS 2.0 met één blok geprogrammeerd;
In LabView heb je voor precies dezelfde handeling drie programmeerblokken nodig;
Hierbij moet je dan ook de nodige dataverbindingen maken zodat de blokken onderling de juiste gegevens uitwisselen… behoorlijk wat werk dus.
Het leuke van
LabView is dat de Sensorstapels van RIS plaatsgemaakt hebben voor meerdere
“ketens” van programmablokken. Deze
ketens starten allemaal tegelijk, zonder dat er een sensor voorwaarde voor
nodig is. Je kan dus diverse programma’s tegelijk door de NXT uit
laten voeren! Dat biedt geheel nieuwe mogelijkheden, maar het kan elkaar
ook dwarszitten bijvoorbeeld als de programma’s tegelijk één motor besturen en
daarbij “elkaar” niet in de gaten hebben. Communicatie tussen de
programmaketens kan niet door het maken van dataverbindingen! Je kan de
dataverbinding proberen te leggen maar dat geeft vervelende foutmeldingen die
niet of lastig weg te krijgen zijn (oktober 2006). Communicatie tussen de
ketens kan wel met variabelen, zogenaamde “vlaggen” die aangeven wat de status
van de andere programmaketen is.
In de NXT code zien we 4 hoofdketens met als voornaamste taak:
Keten 1: Standaard waarden in variabelen zetten
Keten 2: Motoren aansturen en positie-commando’s in display laten zien
Keten 3: Spelsituaties bepalen
Keten 4: RCX signalen opvangen, score tellen en laten zien, geluiden maken
Eerste keten (bovenste):
Initialisatie van benoemde variabelen
zoals de plaatsen waar de MiniFigs moeten komen te staan tijdens het spel.
Tweede keten:
Initialisatie van het display en de motoren zodat de MiniFigs in de start positie terecht komen en het spel kan beginnen. Het display (links hieronder) laat zien welke rij MiniFigs al in de startpositie staat. In dit geval is de achterste rij al gereed, de voorste beweegt nog naar de startpositie. Omdat je bij het inschakelen van de NXT niet weet in welke positie de motoren staan draait de software “voorzichtig” aan de motoren en zet ze elk direct uit als blijkt dat er geen beweging meer in zit. Op dat moment is de startpositie dus bereikt en is de positie “bekend”. Zijn beide motoren in startpositie dan wordt het spel klaar gezet in de eerste speelbare posities: Voor op 1850 graden, achter op 155 graden.
Het display laat zien hoeveel graden de motoren heen of terug moeten draaien om de gewenste positie te bereiken. Programmaketen 2 heeft zich inmiddels gesplitst in twee gelijkertijd lopende programmaketens met elk een permanente loop. Eén voor het continu aansturen van de voorste rij, de ander voor de achterste rij. De NXT Motorblokken werken met commando’s waarin je aangeeft hoe ver de motor moet draaien. Dit spel werkt met absolute MiniFig posities. De loops in keten 2 vertalen permanent de gewenste absolute MiniFig positie naar een hoeveelheid “nog te draaien” graden voo betreffende motor ten opzichte van de vorige opgegeven positie. Keten 2 is in staat een nieuw positie-commando vanuit een andere programmaketen te ontvangen en te onthouden terwijl het oude positie-commando verder uitgevoerd word. De beweging wordt dus niet afgebroken. Op het moment dat het spel begint, lopen de voorste MiniFigs naar links. De auto staat nog in de garage. En de MiniFig in het huis komt precies achter het raam te staan. Knap als je ‘m nu al kunt raken!
Derde en Vierde keten:
Start tegelijk met de vierde programmaketen, maar pas als programmaketen 2 heeft aangegeven dat de game kan starten. Keten 3, de keten die de spelsituaties bepaalt, begint met fase 1 van het spel waarin de MiniFig in het raam gewoon blijft staan terwijl de voorste MiniFigs op willekeurige momenten heen en weer lopen (om de 3 tot 10 seconden, Timer 1). De score is nog nul. De voorste MiniFigs lopen inmiddels weer naar rechts (-1192 graden). Als het display “OK” laat zien staan de MiniFigs in gewenste positie.
De eerste MiniFigs worden geraakt. De score begint op te lopen. Deze wordt berekend door programmaketen 4 die inmiddels ook loopt en de signalen vanuit de RCX in de gaten houdt. De score is afhankelijk van het tijdstip waarop de MiniFig geraakt is (Timer 2). De achterste rij MiniFigs krijgt bovendien een dubbele score omdat deze MiniFigs veel moeilijker te raken zijn. Keten 4 geeft ook de “Ahhh” en “Oehhhh” geluiden als een MiniFig is geraakt en laat de score op het display zien. Daarnaast heeft programmaketen 4 nog een vertakking die Timer 2 permanent in de gaten houdt. Als deze de 3 minuten overschrijdt dan signaleert keten 4b “GameOver = Goed”. Dit zal keten 3 naar het einde van het spel leiden. Maar zover is het nu nog niet…
Als in de voorste rij tenminste 2 MiniFigs uitgeschakeld zijn wordt de eerste loop in programmaketen 3 beëindigd. De speler hoort “Good Job” als aanmoediging. Keten 3 stuurt nu nieuwe motorposities voor de achterste rij MiniFigs naar keten 2 en start ook de BonusTimer (Timer 3). Als de MiniFig achter het raam nog niet geraakt was zie je ‘m nu in de deuropening staan. Tegelijk komt de auto half uit de garage maar de bestuurder zit nog veilig achter de boom. De voorste MiniFig beweegt nu “zenuwachtig” elke 3 seconden tussen twee nieuwe posities heen en weer als deze tenminste nog niet is geraakt. Zijn alle drie de voorste MiniFigs geraakt dan valt Motor A stil. Is binnen 30 seconden de MiniFig in de deuropening geraakt terwijl de MiniFig voor de auto ook is geraakt dan noteert keten drie een extra bonus van 30 punten in de score (gedisplayed door keten 4) en de speler hoort “You’re good!”. Timer 2 wordt op nul gezet zodat met het neerschieten van de laatste MiniFigs maximale score gehaald kan worden (en je extra speeltijd hebt).
In de laatste fase laat programmaketen 3 de auto uit de garage rijden door opnieuw een nieuwe motor-B-stand naar programmaketen 2 te sturen. Heb je de man in de deuropening niet binnen 30 seconden geraakt? Geen nood. Programmaketen 3 laat deze MiniFig sowieso naar buiten lopen. Deze komt links van het huis te staan zodat je ‘m makkelijker kan raken. Nadat alle MiniFigs zijn geraakt of als GameOver op “Goed” blijkt te staan (een signaal vanuit keten 4b), komt keten 3 in de laatste fase. Je hoort “Game over” door het speakertje van de NXT. Je kan je eindscore aflezen.
Keten 3 stuurt ter afsluiting nieuwe positie-commando’s naar keten 2 (alle MiniFigs naar rechts) om de spelpositie vlot in de startpositie voor de volgende game te krijgen. Keten 4 is inmiddels afgesloten als gevolg van het “GameOver=Goed” signaal waardoor er niet meer gescoord kan worden, ook al geeft de RCX weer een nieuw signaal af bij het neervallen van resterende MiniFigs.
Je kan het spel nu opnieuw starten!