Projet Développement : Robot suiveur d’utilisateur

Envoyé par le 26 Juin 2018

Equipe :

Paul PAQUIN, étudiant en 1ère année à IMT Atlantique
Grégoire PICHEREAU, étudiant en 1ère année à IMT Atlantique
Baptiste SCHMITT, étudiant en 1ère année à IMT Atlantique
Ruyi ZHENG, étudiant en 1ère année à IMT Atlantique

I – Contexte

Durant le cursus Ingénieur généraliste de l’IMT Atlantique, les élèves doivent réaliser un projet Développement. C’est dans ce cadre que nous avons proposé notre propre projet : Construire un robot capable de suivre de lui même un humain et de porter une charge. L’idée derrière ce projet est de développer une solution pour les personnes à handicap moteur. En effet, ceux ci peuvent se retrouver en difficulté dans beaucoup de situations de la vie courante.

Ainsi, nous avons réalisé un prototype qui grâce à des modules de magnétométrie et de GPS est capable de se localiser. Nous avons ensuite développé une application Android capable de se connecter au robot et de donner sa position. Grâce à ça, le robot peut alors suivre l’utilisateur.

II – Réalisation

– une plaque de contreplaqué de 2 centimètres  d’épaisseur pour servir de support
– deux planches de bois 20×5×5 cm
– deux planches de bois 10×5×5 cm
– quatre planches de bois 25×7×1 cm
– deux moteurs de la gamme Maxon Motor A-max Program de 12 V
– deux roues de 10 cm de haut
– une roue non motrice qui se met sous le châssis
– deux adaptateurs moteur-châssis créés à l’aide d’une imprimante 3D
– deux adaptateurs moteur-roue créés à l’aide d’une imprimante 3D
– une batterie lithium-polymère TURNIGY 1000mAh trois cellules de 11.1 v
– une carte Arduino Uno
– une breadboard
– un magnétomètre Adafruit HMC5833l
– un module Parallax PAM-7Q pour le GPS
– un module Bluetooth HC-05
– une carte L298N
– un smartphone Android
– des vis et des câbles

2 ) Plateforme

Nous avons décidé de concevoir un châssis en bois à deux étages. Le premier étage servant au transport du système de positionnement embarqué ainsi qu’à celui des batteries, le second couvrant le premier, ayant lui pour but de servir de support où l’on pourrait déposer la charge.

Pour soutenir le châssis et pour le mettre en mouvement nous avons convenu de fixer sur les côtés avant deux moteurs de la gamme Maxon Motor A-max Program de 12 V chacun reliés à des roues de 10 cm de haut, fixe sur axe ainsi qu’en polypropène et en caoutchouc. Enfin nous avons décidé de placer une dernière roue non motrice, une roulette pivotante en caoutchouc à l’arrière du véhicule.

Pour faciliter la suspension des moteurs au bas du châssis nous avons convenu de modéliser des supports pour moteurs. De même, nous avons choisi de concevoir des adaptateurs entre les moteurs et les roues pour améliorer la transmission. La réalisation de ces parties s’est faite sous SolidWorks. Nous avons aussi pu retravaillé certaines pièces déjà à disposition sur des sites dédiés comme Thingiverse tant les moteurs et les roues que nous avions choisi semblent être des standards dans le milieu de la conception robotique amateur.

Une fois réalisées, les pièces sont alors converties en fichier .stl, format lisible par l’imprimante 3D que nous utilisons, une Ultimaker 2+. Le traitement de ses fichiers s’est fait par le logiciel dédié Ultimaker Cura permettant de visualiser la future impression 3D et ainsi de repositionner la pièce si sa disposition n’est pas optimale, d’ajouter un support pour stabiliser l’impression mais surtout de voir si il est possible ou non de réaliser une impression sans problèmes (les morceaux de la pièce ne pouvant être imprimés s’affichant en rouge dans le logiciel).

On place ensuite les moteurs à courant continus dans les supports en plastique dédiés imprimés par l’imprimante 3D, pour bien fixer les moteurs il est possible de visser les supports pour resserrer le tout. On ajoute alors les adaptateurs entre les moteurs et les roues, eux aussi imprimés en 3D, qu’on visse alors dans les adaptateurs de hub et dans les roues en plastique.

On  a alors le premier étage de la maquette qui contiendra tout le matériel nécessaire pour la détection de l’utilisateur et la commande des moteurs. On réalise alors un second étage pour pouvoir disposer la charge. Afin d’observer les composants et de vérifier leur bon fonctionnement durant un essai on opte pour une plaque de plastique en tant que capot pour le premier étage. Une fois installée et vissée on rajoute des plaques de bois tout autour de la plateforme pour servir de rebord de manière à ce que la charge ne puisse pas tomber.

3 ) Code Arduino

Comme le projet contient de nombreuses fonctionnalités, et que beaucoup de composants fonctionnent différemment, nous avons choisi de programmer le code, qui sera téléversé dans le robot, par classe. En effet, cela permet de tester séparément chaque fonctionnalité avant de les mettre ensemble. Ainsi, le code est facilement debuggable et on peut s’y retrouver bien plus facilement.

Pour ce faire, nous avons écrit des classes en langage C++, que l’on a ensuite placées dans le répertoire Librairie du dossier Arduino.

Enfin, un code Arduino va importer les classes nécessaires et va les appeler selon ses besoins.

Le code est présent sur le GitHub ici.

4 ) Electronique

a . Module L298N

Le prototype se déplace à l’aide de 3 roues: 1 roue pivotante et 2 roues motrices. Les moteurs sont alimentés par une batterie lithium-polymère TURNIGY 1000mAh trois cellules de 11.1 v. Etant donné la taille de notre prototype,  nous avons décidé d’utiliser un module « Double Pont-H » de type L298N destiné au contrôle des moteurs continus (des Maxon A-motor DC)  pour sa facilité d’utilisation et sa compatibilité avec la carte Arduino Uno que nous utilisons.

Cette carte est composée de 3 pins par moteur : 2 pins contrôlent le passage du courant dans les deux fils reliant la carte L298N au moteur et 1 pin PWM qui est utilisée pour contrôler la vitesse du moteur.

Les pins IN1, IN2, ENA sont reliés aux pin de l’arduino 7, 8 et 5; et gèrent le moteur A.

De même, les pins IN3, IN4, ENB sont reliés aux pin de l’arduino 12, 4 et 9; et gèrent le moteur B.

Pour contrôler les moteurs, puis la plateforme, nous avons créé des bibliothèques Arduino spécifique. Nous disposons ainsi d’une classe Moteur qui permet de contrôler facilement les moteurs à partir d’un nouveau sketch Arduino, et d’une classe Plateforme qui permet de contrôler aisément l’interaction entre les deux roues.

A noter que cette Plateforme est la classe mère de PlateformeIntelligente qui permet aussi de rejoindre un point dont on connaît la distance et l’angle entre le vecteur robot-point et la médiatrice du segment joignant les deux roues du robot.

b . Module Adafruit HMC5833l (magnétomètre)

Pour calculer l’angle entre la médiatrice du segment joignant les deux roues arrières du robot et l’utilisateur, nous utilisons un intermédiaire, le pôle nord, dont la mesure est plus précise grâce à l’utilisation du champ magnétique terrestre. Pour ce faire, nous utilisons donc un magnétomètre (module Adafruit HMC5833l).

Ce magnétomètre est posé à l’horizontal au même endroit que l’arduino. Nous avons dû le tester et changer son orientation pour que le magnétomètre donne des mesures cohérentes avec nos calculs. C’est à dire que nous avons placé le magnétomètre de sorte que lorsque le robot soit dirigé vers le pole nord, l’angle mesuré soit égal à 0. Le magnétomètre a ensuite été fixé pour conserver cette cohérence. En effet, toute erreur sur l’orientation de référence de celui-ci entraîne une erreur sur la mesure.

Le magnétomètre est relié aux pins analogiques A4 et A5 de l’arduino par ses pins SCL et SDA. Pour récupérer les mesures du magnétomètre, nous avons créé une classe, MagneticRead, qui renvoie la valeur en degré ou en radian selon la méthode appelée du heading (le heading étant la direction selon laquelle le véhicule est dirigé)

c . Module Parallax PAM-7Q pour le GPS

Le module GPS que nous utilisons pour le projet est le module Parallax PAM-7Q. Il se situe sur la même breadboard que le magnétomètre.

Le gps utilise la pin digital numéro 6 de l’arduino relié à la pin TX du module.

Les mesures du gps sont elles aussi récupérées à l’aide d’une classe que nous avons créée. Au départ, nous comptions utiliser une classe déjà développée pour ces besoins, nommé TinyGPS.

Malheureusement, nous n’avons pas réussi à la faire fonctionner, nous avons donc utilisé la bibliothèque SoftwareSerial pour récupérer les données gps brutes et les traiter dans notre classe GPS (c’est à dire récupérer les informations utiles).

Nous avons aussi testé les conditions de fonctionnement du gps. Nous nous sommes vite rendus compte que le gps ne fonctionne qu’en extérieur. Celui-ci semble de plus continuer de fonctionner en cas de pluie légère et de temps nuageux.

d . Module Bluetooth HC-05

Grâce à la technologie Bluetooth, de nombreuses informations peuvent transiter entre le smartphone de l’utilisateur et le robot.

La pin RX du module est connectée à la pin 11 de l’arduino tandis que la pin TX du module est connectée à la pin 10 de l’arduino.

Une bibliothèque, CommunicationManager, a été développé pour récupérer les informations en provenance du Bluetooth et les interprète selon un protocole de communication.

e . Capteur ultrason HC-Sr04

Nous avons ajouté des capteurs ultrasons HC-Sr04 au robot qui mesurent la distance entre le robot et l’obstacle. Les bornes de « trigger » et d’« écho » sont reliées à la pin digital 13.

Pour contrôler ces capteurs et récupérer les mesures réalisées, nous avons utilisé la classe Capteur présente de base dans la bibliothèque arduino. Les différentes réactions du robot en fonction de la distance avec l’obstacle sont présentes dans la classe plateforme.

Ainsi, toute cette partie n’est pas visible dans le sketch final, mais est présente dans la classe PlateformeIntelligente. C’est d’ailleurs ce fait qui justifie l’écriture de cette classe héritée : le comportement de cette classe, qui arrête le robot dès qu’un obstacle est détecté était nuisible pour notre phase de test. Le robot s’arrête ainsi en cas d’obstacle présent à une distance inférieure à 30 centimètres, fait tourner ses capteurs pour détecter une voie où il n’y a pas d’obstacle et se déplace dans cette direction.

f . Schéma des branchements

 

5 ) Interface Android

Afin de permettre au robot de suivre automatiquement les mouvements de l’utilisateur, nous avons besoin d’un appareil mobile capable d’envoyer des informations de localisation. Nous avons donc créé une application pour smartphones Android avec Android Studio. Application et robot communiquent via Bluetooth, l’application obtient l’information de la position via GPS, et la direction (heading) de l’utilisateur via la boussole interne du mobile (compass).

Ensuite, l’application envoie les informations au robot via le canal Bluetooth, en même temps le téléphone mobile reçoit également des informations envoyées par le robot. L’application peut analyser le message et afficher la distance et la puissance sur l’interface Androïde. Afin de s’assurer que chaque fonction peut être réalisée, nous allons faire une application distincte pour chaque fonction, y compris la communication Bluetooth, GPS, Boussole.

Ayant rencontré des difficultés pour écrire une application Bluetooth, nous avons décidé de ne pas rechercher la totalité des appareils Bluetooth à proximité. Cependant, la recherche d’autres appareils utilisant Bluetooth effectuée par le téléphone portable permet de trouver le module Bluetooth (HC-05) de la plateforme. Après recherche, nous avons résolu le problème.

Depuis, l’application peut rechercher, se connecter et créer un canal Bluetooth pour échanger des informations.

La plupart des smartphones modernes sont équipés d’un GPS qui fonctionne avec deux modes, le mode réseau et le mode satellite : le mode réseau utilise des méthodes de ciblage et est utilisé en intérieur, car le signal satellite est faible, ce qui impacte la précision de localisation. Or, les méthodes implémentées dans ce mode ont une efficacité indépendante à la qualité de réception. Il est cependant impossible d’obtenir les informations relatives à la direction. Quand il est à l’extérieur, le positionnement par satellite est utilisé. En raison de son positionnement rapide et sa grande précision, des informations importantes telles que la direction et la vitesse peuvent être obtenues.

Comme précédemment mentionné, le GPS ne peut pas obtenir d’informations de direction dans le contexte de positionnement par réseau, d’autres méthodes sont donc nécessaires pour obtenir la direction. Heureusement, la plupart des téléphones mobiles ont une fonction de boussole, et nous pouvons donc obtenir cette information capitale.

Dans le processus de communication Bluetooth, deux canaux (des threads) sont demandés : le premier est utilisé pour envoyer les informations de localisation toutes les trois secondes, le second reçoit les informations envoyées par le robot et affiche l’interface après le traitement. Cela nécessite des capacités de multithreading, malheureusement nous ne disposions pas des connaissances relatives à implémentation de cette technique. Cependant, nous avons trouvé une bibliothèque traitant spécifiquement le multithreading ce qui nous a permis de mettre en place cette fonction.

Afin d’échanger des informations sans problèmes avec le robot, nous avons conçu un protocole de communication pour réguler la structure de l’information.

La plupart de nos fonctions ont été implémentée et deux affichages ont été développés selon que le robot est en mode suivi ou en mode contrôlé par l’utilisateur.

6 ) Protocole de communication

Grâce à la technologie Bluetooth, de nombreuses informations peuvent transiter entre le smartphone de l’utilisateur et le robot. Ces informations ainsi que leurs impacts sur le fonctionnement du robot et de l’application sont très variés. Cela impose que chaque type d’information ait un format reconnaissable parmi les autres.

Cependant, comme les équipes chargées de développer la partie application Android et la partie code Arduino ne sont pas les mêmes, il convient de rédiger un unique protocole de communication respecté par toutes les équipes. Un tel protocole garantit non seulement que les formats d’une information donnée soit les mêmes pour l’émetteur et le récepteur mais il a aussi la capacité d’évoluer si de nouvelles fonctionnalités venaient à être implémentées sur le robot.

La spécification du protocole choisie ne retransmet aucun message perdu ou erroné durant son trajet. En effet, un mécanisme de retransmission pourrait rendre le robot beaucoup moins réactif.

Toutes les informations suivent le format suivant : ‘#’ + type + ’\’ + Données + ‘$’

Les champs ‘type’ et ‘données’ varient selon le type de donnée envoyée tandis que ‘#’ et ‘$’ indiquent respectivement le début et la fin du message. Le récepteur sait alors si le message qu’il a reçu est complet ou non. De plus si le champ ‘données’ contient plus qu’une seul donnée alors celles-ci sont séparées par un symbole ‘\’ pour bien faire la distinction.

Le détail du protocole est présent sur le GitHub ici.

III – Résultats

Notre projet de réalisation d’un robot suiveur d’utilisateur assisté de son application compagnon s’est soldé par la mise en place de systèmes embarqués placés dans une plateforme construite en bois et en plastique et dont les composants sont appairés au smartphone de l’utilisateur.

Un des critères de fonctionnement du robot qui fait défaut au prototype est sa précision, notamment du à l’approximation de l’ordre du mètre des GPS modernes.

En effet la solution technique utilisée semble améliorer la précision de la course du robot cependant on peut rester mitigé sur les déplacements en intérieur tant le GPS voit son efficacité diminuée dans la majorité des bâtiments.

Finalement, il semble que le projet puisse être amélioré en intégrant une alternative au GPS en intérieur et en prenant une Arduino Mega parce qu’elle permet de mettre plus de composants nécessitant des protocoles de communication.

 

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *