Petite mise à jour de notre article sur la liste des UCS LEGO avec les derniers sets sortis. (...)
Connecter un Module GPS au NXT, en bluetooth
Un récepteur GPS envoie les données de localisation via Bluetooth, par un protocole dit NMEA, qui définit les trames support de la communication. Le NXT embarquant un composant bluetooth, avec lequel il est possible de faire dialoguer des NXT avec un PC et/ou ensemble, vous trouverez ici un tutoriel pour programmer la liaison bluetooth du NXT en NXC, et récupérer les données provenant du récepteur GPS.
Le système GPS et les robots
Le système GPS permet le positionnement sur l’ensemble de la surface du globe à +/- 2m près, au pire 10m, avec une fréquence de rafraichissement de 1 à 5 Hz (1 à 5 fois par seconde). C’est très pratique quant on est en voiture, à l’extérieur (on « voit » au moins 3 satellites), à 50 km/h (1 seconde, c’est 14 m), sur des routes qui font plus de 2 m de large (on peut discriminer les voies, et donc faire du suivi de trajectoire). Mais pour des robots qui évoluent le plus souvent à l’intérieur, qui font quelques dizaines de cm, qui évoluent à des vitesse de l’ordre du m/s et qui doivent le plus souvent se frayer un chemin dans des traces de moins de 50cm de large, c’est totalement inapproprié. Alors, pourquoi essayer de connecter un NXT avec un GPS ?
- Parce que !
- Parce que d’autres langages de programmation pour NXT, tels que PbLua, LeJos et RobotC disposent de leurs propres firmwares, et ont développé des librairies de code pour accéder aux trames d’un GPS bluetooth, pourquoi pas en développer une avec les bouts de code NXC qui trainent...
- Parce que certains utilisateurs de NXT n’ont pas peur de salir leurs robots, et de les emmener « outdoor », pour des challenges de type darpa « grand challenge », traversée du désert de point GPS en point GPS, de 2004, ou comme le Green Monster de Steve Hassenplug ou même de les mouiller, cf le bateau des boulettes.
- Parce que d’autres expérimentateurs ont tenté d’autres approches, en connectant un module GPS délivrant un signal série RS232 à un micro-contrôleur chargé de convertir le flux en I2C pour le NXT, comme Martijn ten Bhömer, qui a écrit un rapport lors du cours LEGO beyond toys.
- Parce que Dexter Industries est en passe de mettre sur le marché un capteur GPS, et que ça donne envie d’expérimenter autour du GPS
- Parce que je n’y connais rien en bluetooth, et que c’est fun d’apprendre et d’expérimenter !
Connecter via le bluetooth GPS et NXT
Bien que donné pour impossible car le NXT utilise un protocole bluetooth propriétaire codé « en dur » dans le firmware (afin de garantir une connectivité facile entre la brique NXT et le PC), il est néanmoins possible de passer outre les limitations imposées. On peut ainsi récupérer une trame complète de données venant du GPS, car le composant utilisé est standard, et stocke toutes les données reçues.
Un tel exploit (au sens geek du terme, c’est à dire un moyen de contourner une difficulté) est le fait d’un certain Antonio Scarfone, voici un post sur nxtasy.org qui décrit le principe du hack.
Pour pouvoir connecter un récepteur GPS Bluetooth avec le NXT, il faut :
- Une installation fonctionnelle de Bricxcc, communicant avec la brique NXT via le driver USB, et une brique NXT avec le dernier firmware optimisé.
- Il vous faut aussi un récepteur Bluetooth compatible NMEA 1.2, Bluetooth 2.0 et capable de dialoguer à 4800 bauds [1].
Celui que j’utilise est le Holux M-1000, dont voici les caractéristiques :
Pour « appairer » le récepteur au NXT, il vous faudra suivre les étapes suivantes
A chaque fois que le NXT ou le récepteur est éteint, il faut reprendre le processus de connexion, pour identifier le canal au récepteur (allez dans bluetooth, My contacts, vous retombez là :
Vous sélectionnez le canal, et voilà !)
Programmation de la pile Bluetooth du NXT
La programmation de la communication bluetooth est de type maître-esclave, le maître donne des ordres, et les esclaves répondent, ce qui implique que les esclaves ne peuvent initier les réponses car le maître ne serait pas en mesure de les réceptionner, puisse qu’il n’a rien demander.
Les procédures de base du contrôle Bluetooth sont :
Le programme maître vérifie que l’esclave est bien connecté sur le port ( constante BT_CONN 1 ) en utilisant la fonction BluetoothStatus(conn) ; et envoie des ordres avec SendRemoteString(conn,queue,string) ; . Il reçoit des messages de l’esclave avec ReceiveRemoteString(queue,clear,string) ; . D’autres fonctions permettent de partager un compteur de messages, afin d’éviter à l’un ou l’autre d’attendre indéfiniment un équipement déconnecté (Fouillez dans l’aide NXC fournie avec Bricxcc). Une autre fonctionnalité intéressante, c’est le contrôle à distance d’un NXT, directement grâce aux fonctionnalités du firmware, qui reçoit et traite les ordres émis par le NXT maître. On peut ainsi lui commander d’actionner les moteurs, de jouer de la musique, de lire un capteur...
Exemple de code
Un peu comme le code « brut de fonderie » de l’article sur le nunchuk, le code publié par Antonio Scarfone mérite pas mal de boulot pour en faire une librairie exploitable. Entre autre, il manque le découpage des trames NMEA en longitude/latitude/altitude, le décodage des messages de temps, la récupération du nombre de satellites vus, etc.). Robokalle a quant a lui poussé l’idée de découper les trames, au travers du bout de code suivant.
Or toutes les informations pertinentes ne sont pas contenues dans la trame GGA (heure UTC, latitude, longitude, altitude, la correction de l’altitude), la trame PGRMC en plus la vitesse sol, le cap, la date et la déclinaison magnétique.
Le code source :
Le résultat :
- GPS_Display
GPS différentiel
Le GPS différentiel pourrait être une solution pour augmenter la précision du GPS. Pour faire, il faudrait disposer de deux sources de données GPS, l’une statique, l’autre embarquée dans le robot. Ainsi les variations du signal GPS par des brouilleurs extérieurs (vents solaires, micro-variations de propagation dues aux phénomènes électro-magnétiques) seraient les mêmes pour les deux récepteurs, et on pourrait en « annuler » par calcul les effets (valeurs du GPS embarqué - perturbations du statique = valeurs embarquées plus précises). On obtiendrait une précision de quelques dizaines de cm, à vérifier....