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.
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.
Zie de 4WD
Off Roader voor meer details.
|
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 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…}
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)
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