LEGO NXT – INTELLIGENTE TESTWAGEN

Als voorloper op de 4WD Off Roader!

 

Een uitgebreide beschrijving van de functies van deze test-auto vind je op de pagina voor de 4WD Off Roader. De Off Roader is gebaseerd op de techniek die je hier op eenvoudige wijze ziet toegepast.

 

In tegenstelling tot de definitieve Off Roader heeft deze test-auto:

·        Aandrijving met een NXT Motor ipv 2 XL motoren.

·        Alleen achterwielaandrijving.

·        Tandwielloze stuurinrichting.

·        Meesturende Ultrasonische Sensor.

·        Licht gewicht dus gebouwd op snelheid ipv kracht.

·        Snelheidsmeting met TachoMeter in NXT Motor ipv extra RCX Rotatie Sensor.

 

Deze snelle test-auto is met Bluetooth proportioneel bestuurbaar zodat je nauwkeurig kunt sturen, gedoceerd gas kan geven en echt kan remmen als dat nodig is.

 

De functies Auto Distance Control” met “Emergency Braking“ en “Collision Prevention Assistance” komen bij deze snelheidsduivel echt goed van pas. Op de dashboards zie je de rij-gegevens van de auto zoals motor-power, snelheid, overgebleven brandstof (batterij) en stand van de (fictieve automatische) versnellingsbak.

Automatische Bluetooth Set-Up!

De twee NXT’s zijn in NXC  geprogrammeerd. De belangrijkste reden was omdat ik nu eindelijk eens een automatische Bluetooth verbinding wilde opzetten. Dat wil zeggen dat je de slave NXT (de Auto in dit  geval) alleen maar hoeft aan te zetten, verder niets… niet eens een programma starten… Vervolgens zet je het pistool aan, start het programma en de rest gaat vanzelf. Je hoeft zelf geen Bluetooth verbinding op te zetten, dat doet het Pistool zelf. Ook het programma in de Auto wordt vanzelf opgestart zodra de Bluetooth verbinding vanzelf tot stand is gekomen! Dit klinkt heel eenvoudig maar geloof mij, dat heeft een paar avonden puzzelen gekost. Zie de technische beschrijving over hoe je die problemen kunt voorkomen, zou je het ook eens willen proberen…

 

Bekijk in dit filmpje  hoe de NXT 4WD Off Roader  werkt!

Of bekijk de detailfoto.

 

 

Details over de bouw en werking:

Zie de 4WD Off Roader  voor meer details.

 

 

Comfortabele Remote Control…

Het was de bedoeling een zo lichtgewicht mogelijke afstandsbediening te bouwen met toch alle bedieningscomfort. Nou, dat is deels gelukt. Echt lichtgewicht is hij niet geworden. De NXT alleen al is toch aardig zwaar aan zo’n pistool. Om het gewicht verder te beperken heb ik geen NXT Motoren gebruikt als sensoren voor het indrukken van het gaspedaal en de precieze stuurverdraaiing. In plaats daarvan zijn twee lichtgewicht RCX Rotatiesensoren toegepast.

 

De omvang van het geheel is toch nog aardig opgelopen (ik had ‘m kleiner willen hebben) doordat ik alle draden netjes weggewerkt wilde hebben terwijl de asjes vrijuit moeten kunnen bewegen.

 

Uiteindelijk is het geheel door de afwerking toch nog aardig zwaar geworden. Een neefje van 6 jaar had er duidelijk moeite mee… (En hij wou zou graag…!) Maar door het stuur vast te pakken heb je natuurlijk ook nog wat steun.

 

Het pistool is gemaakt om met de linkerhand te worden vastgehouden. Ik stuur nu eenmaal het liefst met m’n rechterhand. De greep vereist wat instructie zodat je gas kan geven met de wijsvinger aan de trekker (en eventueel de middelvinger er bij) terwijl je tegelijkertijd de rempedaal kunt bedienen met de duim. De duim druk je gewoon naar beneden.

 

Deze wijze van bedienen is mij goed bevallen. Met weinig bewegingen kan je in rap tempo remmen, schakelen en gas geven tegelijk.

 

Het aangrijpingspunt van het handvat is zodanig ten opzichte van de NXT geplaatst dat het pistool in balans op de hand rust. Hij blijft op de hand liggen als je het handvat los zou laten…  (wel de hand horizontaal houden hè!).

 

Analoge klokjes op het display.

Met RICedit-2 kan je intelligente .ric files editen. Dat wil zeggen dat je “commando’s” kan inbouwen die in de .ric file opgeslagen “objecten” op een gewenste positie plaatsen. Erg aardig, maar vereist weer een studie over die .ric file commando’s. Lui als ik ben heb ik deze klokjes dus gewoon in NXC gemaakt. Belangrijkste reden was dat in de .ric files geen commando’s bestaan om wijzers langs een cirkel te laten bewegen. Die Cirkelbeweging kan alleen gemaakt worden door de wijzer coördinaten vooraf te bepalen. Je zou dat door de NXT kunnen laten berekenen maar dan zal je goniometrische berekeningen moeten uitvoeren op de NXT, hetgeen een programma op zich zou worden en dus veel te traag.

De benodigde coördinaten voor de bewegende wijzers heb ik dus vooraf berekend in een spreadsheetje.  De coördinaten voor de stappen die de wijzerpunt kan maken zijn als een matrix in de programma code ingevoerd. Elk klokje heeft een eigen wijzer-coördinaten-matrix.

De wijzerplaat (achtergrond) wordt als eerste getekend. Daarna worden de wijzers er op geplaatst in de stand zoals berekend. Daarna worden variabele objecten op de wijzerplaat aangebracht. Denk bijvoorbeeld aan de richtingaanwijzers en de PRND-Status van de versnellingsbak. De wijzerplaat en overige objecten zijn in aparte .ric files gedefinieerd.

 

 

 

Gecomprimeerde data-transfers tussen beide NXTen

Tijdens de programmeersessies bleek de respons van de auto op mijn stuurbewegingen steeds trager te worden naarmate ik meer Display variabelen over en weer ging sturen. Bovendien kreeg ik synchronisatie problemen bij hoge uitwisselsnelheden. Variabelen werden niet overgestuurd omdat de ene NXT ze sneller wilde aanbieden dan dat de ander deze ontvangen kon.  Omdat de communicatie tussen master en slave a-synchroon is kan je deze problemen ondervangen door verdergaande Hand-Shakes in te bouwen. De master NXT moet de Slave NXT informatie ophalen en krijgt alleen maar die informatie als de slave dit vooraf had “klaar gezet” in een outbox. Voordat je dit doet kan je testen of er informatie beschikbaar is. Maar daarmee werd de informatieoverdracht aanzienlijk trager. De stuurbewegingen kwamen daardoor “schokkerig” over op de auto. Ook de wijzers op het pistool reageerden traag op het gedrag van de wagen.

Daarom een snelle data-overdracht:

Zowel de informatie van Pistool naar Auto als terug wordt in één keer verzonden door alle gegevens in één 32-bits variabele te stoppen. De minst significante bits van deze variabelen worden als volgt gebruikt:

 

20 bits van pistool naar Auto zien er als volgt uit.

18 bits die vanuit de Auto terug worden gestuurd zijn:

Op deze wijze worden in twee stappen 8 variabelen uitgewisseld en blijft de auto zeer adequaat op de bestuurdersbewegingen reageren.

Kijk in de programmacode om te zien hoe dit verder is gedaan.

 

Automatisch een Bluetooth verbinding opzetten.

Dat ging niet zo eenvoudig, eigenlijk omdat de informatie daarover versnipperd te vinden is en soms tegenstrijdig. Hieronder een uitleg van de manier waarop ik het werkend heb gekregen. Mogelijk zijn er inmiddels weer betere manieren, maar alleen het gebruik van wat oudere commando’s bleek voor mij uiteindelijk de oplossing te zijn… Ik sta open voor suggesties overigens!

 

De NXT in het Pistool is als Master gekozen. Vanuit deze NXT wordt daarom de verbinding opgezet. De NXT in de Auto behoeft geen speciale aandacht behalve dan dat het programma netjes moet wachten op een BT-Kanaal indien het handmatig zou worden gestart voordat het Pistool de verbinding tot stand heeft gebracht.

 

Voorbereiding (alléén voor gevorderden) voor de NXT die als Bluetooth Master werkt:

 

Nu kan je starten met het laden van de code in de Remote NXT. Je kan natuurlijk een kijkje nemen in de sourcecode van de programma’s, maar hieronder alvast een korte uitleg hoe ik tot een oplossing gekomen ben:

 

Declareer eerst een SystemCall commando-structuur waarmee je bluetoothcommando’s gaat geven, de mijne heet “CmdStruct”:

    struct CmdStruct {                    

           unsigned int Result;

           byte Cmd;             

           byte Param1;        

           byte Param2;

           byte Param3;

           string Name;

           unsigned int RetVal;

           };

 

Verbind een variabele aan deze commandostructuur, in dit geval de variabele “Args”:

            CmdStruct Args;

 

Vul deze variabele met de waarden die je nodig hebt om het “Connect” commando te kunnen geven:

            Args.Cmd      = INTF_CONNECT;   // Command=BT-Connect

            Args.Param1 = 0;                          // BT-Device Nr. 0 in Device Table

            Args.Param2 = 1;                          // BT-Channel 1 for communication with Slave.

 

De constante “INTF_CONNECT” is een hexadecimale waarde die al binnen je NXC standaard library is gedefinieerd.

 

Creëer nu een programma-lus die net zo lang blijft zoeken naar een verbinding totdat de BlueTooth Status in orde is:

            while (!BluetoothStatus(JOUW_BT_KANAAL)==NO_ERR) {…BODY…}

 

De verbinding kan je nu in de body van de lus opzetten met het commando:

            SysCall(CommExecuteFunction, Args);

 

Mijn ervaring is dat nadat dit commando is uitgevoerd het nog een paar seconden kan duren voordat de verbinding er werkelijk is. Het kan ook zijn dat de NXT in de Auto nog niet aan staat of zo, wacht dan enkele seconden en voer dit commando gewoon opnieuw uit.

 

Is de BT-Communicatie eenmaal opgezet dan kan je vanaf de Remote NXT automatisch het programma in de NXT van de Auto starten, genaamd “S_CARmod11.rxe”. Heel simpel met het commando:

            RemoteStartProgram(JOUW_BT_KANAAL, "S_CARmod11.rxe");

 

De NXT in de Auto hoeft alleen maar te wachten totdat er een verbinding blijkt te zijn opgebouwd…. Als het goed is dan zal deze er dus al zijn omdat de Remote NXT het programma immers heeft gestart. Maar mocht je toevallig zelf eerst de Auto starten en daarna pas de Remote NXT, dan is er dus geen vuiltje aan de lucht omdat de Auto netjes wacht tot de verbinding op komt:

            while (!BluetoothStatus(JOUW_BT_KANAAL)==NO_ERR) {…BODY…}

 

Downloads (rechter muisknop)

Bouwinstructies        : <moeten nog gemaakt worden>

Software NXT           : NXC Source code voor Remote en Auto

RIC-Files                   : Graphics voor het dashboard (op beide NXT modulen) 

SoundFiles                : RSO Sound files (uit NXT-G library)

Executable                : Programmafile (.rxe) voor op je Remote NXT Module en Auto

 

 

Remote NXT:

·          Sensor  1 = Touch, voor Remmen en Vooruit/Achteruit schakelen

·          Sensor  2 = RCX-Rotatie, voor het gaspedaal.

·          Sensor  3 = RCX-Rotatie, voor het stuur.

 

Auto NXT:

·          Sensor  2 = Ultrasonisch, voor afstandsmeting vanaf voorbumper.

·          Output A = NXT-Motor voor stuurinrichting.

·          Output B = NXT-Motor voor aandrijving achter-as

·          Output C = Voor- en achterlichten aan/uit. (niet gemonteerd)

Niet geschikt voor NXT-G gebruikers!

NXT-G gebruikers zouden de executables van deze pagina rechtreeks in hun NXT kunnen uploaden. Dat gaat goed bij de auto, maar niet bij het pistool. Het pistool heeft namelijk geen standaard Firmware. Een afwijkende Firmware versie (v1.07) was nodig om toegang te krijgen tot de Bluetooth Systeemcommando’s waarvan de handles  in een beschermd deel van het geheugen blijken te zitten. Probeer je die te benaderen dan loopt het programma vast. Misschien dat het bij NXT 2.0 wel meteen werkt… Ikzelf heb de NXT 1.0

 

Terug naar de TOP