Bestuur ‘m op
afstand met Bluetooth!
Een forse bak, hoog op de assen en met extreem veel kracht! (Te veel, maar daar vertel ik later meer over). Inderdaad… ik heb voor een belangrijk deel de materialen van de Lego Technic Extreme Off Roader-2 gebruikt (Model 8297 van eind 2007). Maar ik kan je verzekeren dat dit een totaal andere auto is.
Deze vierwiel aangedreven auto is lekker soepel geveerd. Hij heeft dubbele koplampen en ook achterlichten die het echt doen. En… hij wordt gemanaged door een NXT-Module in de achterbak.
Door de drie zware motoren en de NXT aan boord weegt het gevaarte totaal 2 kilogram. Daarmee is de snelheid er wel uit. Daarom zijn de tandwielverhoudingen zodanig gekozen dat hij grote hindernissen overwint in een gestaag rijtempo…
Het moest er een keer van komen. Na de Pimped 8297 Off Roader nu een auto die
met Bluetooth bestuurbaar is zodat je nu eens nauwkeurig kunt sturen
(proportioneel), gedoceerd gas kan geven en echt kan remmen als dat nodig is.
Bovendien is de auto intelligent met zijn “Auto Distance Control” en “Collision Prevention Assistance”. Hij houdt hiermee automatisch afstand op voor hem rijdende auto’s en als er een botsing dreigt grijpt hij in door zelf op de rem te trappen. De bestuurder hoort een waarschuwingsignaal en ziet op het dashboard dat er ingegrepen wordt…
Het
besturen doe je nu eens niet met een NXT en twee motoren die als sensor
fungeren, zoals je dat meestal ziet. Dit keer gaat het met een “Pistool”. Dit
pistool heeft een echt dashboard op het
display! Je ziet de toerenteller, snelheidsmeter, benzinemeter, richting
aanwijzers, automatische versnellingsbak en een paar signaal-“lampjes”
bijvoorbeeld als je moet tanken! En dat laatste is geen flauwekul, want de
benzinemeter is gekoppeld aan de batterij van je auto!
Sturen doe je door voorzichtig aan het stuur te draaien. De voorwielen van de auto volgen precies jouw beweging aan het stuur. Rechts naast de handgreep zit het rempedaal. En de trekker, voor de handgreep van het pistool, fungeert als gaspedaal. Met het rempedaal kan je ook de auto in “zijn achteruit” zetten. De “Reverse” is natuurlijk ook op het Dashboard af te lezen. De toerenteller op het display volgt de beweging van het gaspedaal. De snelheidsmeter is gekoppeld aan de achteras van de wagen.
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 zelf in dit filmpje hoe de NXT 4WD Off Roader werkt!
Of bekijk de detailfoto.
Kort even de kenmerken van
dit model op rij:
·
Maten van de
auto: LxBxH is 38 x 21 x 26 cm, 2 kilogram.
·
Vierwiel
aangedreven met differentieel op voor- en achteras
·
Twee XL-Motoren
voor maximale kracht op de wielen
·
Een Power Function
- Polariteit Schakelaar (éénmaal instellen, verder niet gebruiken) zodat
voorwielen dezelfde kant opdraaien als de achterwielen met gebruik van 1 NXT
Output Port voor beide motoren tegelijk.
·
Knoppenwielen
voorkomen slippende tandwielen bij haakse overbrenging van wielaandrijving op
differentieel
·
Dwarsgeplaatste
Mindstorms-NXT Motor voor de stuurinrichting
·
RCX Rotatiesensor
voor snelheidmeting op de achteras. (Wegens XL-Motoren ipv NXT motoren op de
wielen)
·
Ultra Sonore afstandsmeting
vanuit voorbumper.
·
Automatic
Distance Control (ADC)
Automatische gaspedaal beperking bij afstand op voorganger van minder dan 30
cm.
·
Braking
Assistance (onderdeel van ADC)
Als met meer dan 30% van de maximum snelheid op voorliggend object wordt
ingereden wordt eerst automatisch geremd voordat het gaspedaal wordt gedoceerd.
(Voor toekomstige snelle modellen, zal ik maar zeggen)
·
Collision Prevention Assistance (CPA)
De auto grijpt in en trapt acuut op de rem (en rijdt ook niet verder meer) als
je een object dichter dan op 15 cm hebt benaderd.
·
Automatische
verlichting (voor en achter) wordt gedimd als auto 2 seconden niet meer rijdt
(altijd aan in reverse mode).
·
Full Dashboard
(in de achterbak, ha ha ha) met:
o
Richtingaanwijzers
(Knipperen als voorwielen meer dan 30 graden uitsturen)
o
Toerenteller (In
werkelijkheid het vermogen dat op de elektromotoren wordt aangebracht)
o
Snelheidsmeter
(Gekoppeld aan rotatiesensor op achteras)
o
Benzinemeter
(Meet werkelijke output spanning van de batterij in de NXT van de Auto)
o
Waarschuwingsindicatie
voor het Tanken (bij minder dan 7165 millivolt batterij output)
o
PRND Status
Display voor automatische versnellingsbak (Park, Reverse, Neutral, Drive)
o
ACD / CPA
indicatoren op voor- en achterwielen (alleen zichtbaar als er ingegrepen wordt)
·
Automatische
stuurrichting initialisatie bij opstart. (Het maakt niet uit hoe de voorwielen
staan gericht als je de NXT inschakeld)
·
Geprogrammeerd in
NXC met NXT 1.0 Firmware Version 1.04 (From Lego.com)
·
Wacht op
opkomende Bluetooth verbinding (via BT-Channel 0) indien auto wordt gestart voordat de
afstandbediening actief is. (NO RC FOUND op display)
·
Automatische
Remingreep als afstandsbediening buiten bereik raakt (ivm Bluetooth bereik).
·
Gecomprimeerde
Bluetooth Data Transfer tussen Auto en Pistool (8 variabelen) ter verhoging van
de reactiesnelheid van de auto op de bestuurdersacties en andersom.
De specificaties van het
afstandsbedieningpistool:
·
Proportioneel
gaspedaal (gerealiseerd met RCX Rotatiesensor, verbonden aan de trekker van het
pistool)
·
Proportionele
stuurinrichting (met een RCX Rotatiesensor verbonden aan het stuurtje)
·
Rempedaal
(verbonden met NXT Tast Sensor). Alle vier de wielen worden direct geblokkeerd,
ook als je tegelijkertijd gas blijft geven.
·
Reverse mode
(achteruit rijden) door rempedaal aan te tikken terwijl auto stil staat. Terug
naar “voorwaarts” door rempedaal opnieuw kort aan te tikken als auto stilstaat.
De PRND indicator in het Dashboard laat zien of je voor of achteruit zult gaan
rijden.
·
Identiek Dashboard,
werkt synchroon met dat van de Auto.
·
Geprogrammeerd in
NXC met NXT 1.0 Firmware Version 1.07 (From bricxcc.sourceforge.net)
·
SEARCHING CAR op
display indien Automatische Bluetooth Setup actief is (Zoekt via Device
Nr.0, BT-Channel 1). De beide NXT’s moeten elkaar wel kennen (dus de
Passkey heb je ooit al een keer ingevoerd)
·
Vraagt
“Attention” als er geen auto gevonden wordt (NO CAR FOUND op Display). De NXT
gaat opnieuw zoeken.
·
Gecomprimeerde
Bluetooth Data Transfer tussen Pistool en Auto (8 variabelen) ter verhoging van
de reactiesnelheid van de auto op de bestuurdersacties en meters op het
dashboard van de afstandsbediening.
|
Het
oog wil ook wat… En daarom is de auto ook van binnen afgewerkt met een
rond afgewerkt klokkenkastje boven het stuur en ventilatieroosters in het
dashboard. Om de suggestie van een echte ruit nog wat te benadrukken zijn er
ruitenwisserbladen gemonteerd. De stoelen klappen naar voren zodat je makkelijk
bij de kabelbende kunt komen als je iets wilt aan- of loskoppelen aan de NXT
Module. De lucht inlaten op de motorkap zullen je ook niet
ontgaan zijn. |
|
Heldere
verlichting.
Zodra de auto uit de “Park”
stand wordt gehaald gaan de lichten aan. De lichten dimmen 2 seconden nadat
de auto weer in de Park stand wordt gezet. De achterlichten zijn
gemaakt van een transparante Lift-Arm waardoor ze lekker breed zijn en ook
van de zijkant zichtbaar zijn, zoals bij echte auto’s. De koplampen zijn van
kleine transparante schotelantennetjes gebouwd. Hierdoor krijg je die mooie
krans om de lampen heen! |
|
Onafhankelijk
Chassis. De auto bestaat duidelijk
uit twee delen. Een Chassis voor alle technische zaken. Een Carrosserie voor
de afwerking. Deze laatste zit met slechts vier verbindingspunten aan het
Chassis vast. Een eenvoudige handeling dus, in geval je iets moet repareren. De NXT rust op het
achterste Chassisdeel. Zo veel mogelijk direct op de as zodat de
veerelementen niet het volle gewicht van de NXT hoeven te dragen. Als de
achterwielen inveren scharniert de NXT netje mee. De NXT beweegt dus op en
neer in de achterbak van de auto. Hetzelfde geldt voor de
NXT-Motor die dwars op het voorste chassisdeel ligt. Hij ligt dwars zodat hij
niet te veel onder de motorkap uit steekt. De breedte van de motorkap aan de
binnenzijde is precies zo gemaakt dat de besturingsmotor er in zijn geheel in
kan “verdwijnen” als de voorwielen inveren. Het enige dat de
Carrosserie moet dragen zijn de lampjes en de Ultra Sonore Sensor die in de
bumper is verwerkt. |
Het prototype chassis |
Nieuw
en zeer flexibel veersysteem. De vering die ik hier heb
gebouwd heb ik nooit eerder in een Lego-model gezien (oktober 2009). Ook niet
in de werkelijke wereld trouwens! Het
is opgebouwd uit drie segmenten. Een chassis voor de ophanging van de
voorwielen, één voor de achterwielen en een tussenliggend chassisdeel waaraan
de carrosserie is gemonteerd. Links zie je het prototype. De extra sterke
veerelementen (geel) drukken de beide chassisdelen links en rechts naar
beneden waardoor het middendeel omhoog komt. Door aan beide zijden dezelfde
veerkracht te gebruiken blijft het middendeel horizontaal. Overigens werd de
gehele constructie zo zwaar dat er 2x 4 gele veerelementen nodig waren om het
geheel (2 kilo) omhoog te houden. Maar je ziet misschien al
dat er draaiplateaus in het middendeel zitten… Deze zijn nodig in geval
slechts één wiel een obstakel moet overrijden. |
|
De
twee draaiplateaus zorgen dus voor deze vrijheid. De carrosserie houdt mooi
het midden tussen de verdraaiing van de vooras en achteras. De
veerelementen zorgen voor veerkracht in op- en neerwaartse beweging, maar ook
voor het terugdraaien van de draaiplateaus naar de neutrale stand. |
|
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. |
|
Te
veel gevraagd….
De aandrijving op de
achteras begaf het opeens. Later, met een rit door de sneeuw
brak er weer een knoppenwieltje, die keer op de vooras... Mocht je de auto na
willen bouwen, wees dan voorzichtig met het nemen van
hindernissen! |
|
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
“4WD_CARmod10.rxe”. Heel simpel met het commando:
RemoteStartProgram(JOUW_BT_KANAAL, "4WD_CARmod10.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 : MLcad Chassis
/ PDF Chassis / Elektrisch schema / Bedrading
MLcad Carrosserie / PDF Carrosserie
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
NXT Bedradingsschema:
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 1 = RCX-Rotatie, voor
snelheidsmeting op achteras.
·
Sensor 2 = Ultrasonisch, voor
afstandsmeting vanaf voorbumper.
·
Output A = NXT-Motor voor stuurinrichting.
·
Output B = Aandrijving voor- en achter-as (Twee XL-motoren op 1 poort)
·
Output C = Voor- en achterlichten aan/uit.
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