Shoot Out!

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!

 

 

Enkele details over de constructie:

 

 

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  en een  haaks aan elkaar te monteren met een asje kan de MiniFig niet meer los. Inmiddels zijn die beste boeven wel honderden keren omvergeschoten en met geweld tegen de grond geslagen maar kwamen nimmer los!

 

 

 

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.

 

Een MiniFig slaat achterover als hij aan de voorzijde wordt geraakt door een rubber kogel uit het politiepistool. Hij draait daarbij om de lange as, die alle poppetjes met elkaar verbindt, precies 90 graden achterwaarts. In zijn val haakt een palletje achter het 16-tands tandwiel dat een kwartslag wordt meegedraaid. De andere tandwielen op de lange as draaien natuurlijk ook mee maar deze slippen onder hun palletje door waardoor die MiniFigs gewoon blijven staan. De rotatiesensor detecteert 4 tikken. Dit is voor de software het teken dat er 1x gescoord is! Een hefboompje met een elastiekje zorgt er voor dat het palletje tegen het tandwiel gedrukt blijft, ook als de MiniFig met hoge snelheid naar achteren wordt geschoten. Bij het volgende poppetje dat achteromvalt detecteert de sensor opnieuw 4 tikken. Zo houdt de software bij hoeveel MiniFigs er in betreffende rij zijn omgevallen.

 

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.

De rotatiesensoren in de NXT Motoren kennen 360 “stappen” per omwenteling. Deze nauwkeurigheid is ruim voldoende om de MiniFigs precies achter een boom te plaatsen, achter het raam van het huisje of bijvoorbeeld in de deuropening. De snelheid van de motoren is beperkt en zijn meer gebouwd op het leveren van kracht. Er is daarom geen extra tandwielcombinatie nodig om de MiniFigs rustig over straat heen en weer te bewegen. De NXT Motor zit direct met een 8T-Tandwiel op het tandrek dat het wegdek heen en weer beweegt.

 

 

 

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.

 

 

 

Downloads (rechter muisknop)

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!

 

 

 

Samenhang tussen de 2 programma’s;

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

 

Beschrijving van het SHOOT OUT spelverloop en programmering;

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!

 

 

Terug naar de TOP