Module Communication 
Picsou Robotix inc.
 


Yves Beaumont 
Steeve Duchesne 
Maxime Roy 
  beaumo00@gel.ulaval.ca 
steduc1@globetrotter.net 
roy09@gel.ulaval.ca 
14 décembre 1999


 
1.0 Objectifs
 

Dans le cadre du projet Cyclope, l'équipe micro-contrôleur / Communication RF a comme tâche principale de rendre le robot Rug Warrior Pro intelligent en implantant dans le micro-contrôleur 68HC11 diverses fonctions lui permettant de se déplacer, de transmettre et de recevoir sans fil, de manière RF, des données avec le poste de contrôle, de gérer les collisions et de gérer la consommation d'énergie.
 
2.0 Responsabilités
 

L'équipe micro-contrôleur / Communication RF a comme responsabilités :

Au tout début du projet, le rôle principal de l'équipe était d'assurer la communication sans fil. Cependant, l'équipe RF a rapidement pris en charge la partie micro-contrôleur afin de faciliter le développement des points suivants :  
3.0 Aspects techniques
 
3.1 Communication RF
 

Tel que spécifié dans les exigences du projet Cyclope, la communication entre le serveur / poste de contrôle et le robot doit s'effectuer sans fil par transmission RF. Ce mode de transmission a été choisi en fonction des facteurs suivants :

Afin de communiquer entre le serveur et le robot, il a été décidé d'utiliser le port série RS-232 de l'ordinateur servant de poste de contrôle. De cette façon, il est possible d'utiliser le port série RS-232 fourni avec le micro-contrôleur 68HC11. De plus avec cette option, les modules de transmission RF ne sont pas absolument nécessaires à la réalisation du projet puisque nous pouvons aisément les remplacer par un câble. De sorte que si des problèmes techniques majeurs surviennent, il est possible de communiquer avec le robot par câble.
 

Description du système de communication RF

En premier lieu, il est important de bien comprendre le rôle et les fonctions des éléments présents dans le système. Comme il a été vu, la communication RF s'effectue entre le poste de contrôle et le robot.  Plusieurs étapes sont nécessaires avant de pouvoir transmettre et recevoir un message correctement.  Lors de la transmission, le message quitte l'ordinateur par le port série de celui-ci.  Le protocole de communication qui est reconnu par les ordinateurs se nomme RS-232.  Les données qui sont envoyées en RS-232 ont la forme suivante :
 

 

L'amplitude en tension des bits de données est de 3 à 25 V pour un  '1' logique et de ö3 à ö25V pour un '0' logique.  La plupart des modules de communication RF trouvés dans le cadre du projet Cyclope n'acceptent pas des tensions plus grandes que 6 V.  C'est pour cette raison qu'il faut convertir le signal RS-232 en un signal TTL avant de le transmettre afin de ne pas endommager les modules.  La figure suivante illustre les étapes nécessaires à la communication RF de la compagnie Picsou.

Les éléments les plus importants de ce système sont sans doute les modules de communication RF.  Étant donné la complexité de fabrication et le peu de temps disponible, la compagnie Picsou a décidé d'acheter des modules de communication déjà fait de plus, les modules déjà fait offrent des performances supérieures à ce que nous aurions pu espérer fabriquer dans le meilleur des cas.  Au début du projet, deux choix s'offraient à l'équipe Communication RF, acheter les modules de la compagnie Linx Technologies ou acheter ceux de la compagnie Abacom Tech.  Les modules de Linx ont été choisis pour trois raisons, le faible coût, 5$US pour le transmetteur et 10$US pour le récepteur, la simplicité d'utilisation et pour les caractéristiques relatives au transfert de données en série.  La partie suivante décrite les modules choisis pour la réalisation du projet.
 

Description des modules de Linx Technologies.

Afin de réaliser la communication sans fil, la compagnie Picsou a utilisé deux modules de transmission de type TXM-433-LC et deux modules de réception RXM-433-LC.  Ces modules fonctionnent à une fréquence de transmission de 433 MHz ce qui permet d'obtenir une vitesse de transmission maximale de 4800 bps.  Ces modules sont très compacts et très simple d'utilisation.  Le module Tx ne possède que huit pattes alors que le module Rx en possède dix.  De plus, ces modules ne requièrent aucune composantes externes mises à part une antenne.  Cette caractéristique fait en sorte que nous n'avons pas à ajouter des composantes coûteuses tel que des oscillateurs locaux, des modulateurs et des filtres actifs.  Les modules de Linx offrent un fonctionnement sur une distance d'environ 300 m en ligne de vue.  Le choix de l'antenne a été fait afin d'obtenir une antenne efficace et petite.  Étant donné la fréquence des modules, nous avons utilisé une antenne de type ¼  de longueur d'onde.  Ce type d'antenne offre de bonne performance étant donnée sa longueur de 16.9 cm.
 

La dernière caractéristique qui a influencé le choix des modules de Linx Technologies est leur optimisation pour le transfert en série de données binaires.  Les modules Linx sont conçus principalement pour le transfert binaire puisqu'ils modulent seulement lorsque le transmetteur détecte des informations à transmettre.  Cette méthode de modulation se nomme Carrier-Present Carrier-Absent.  Cette modulation est très appropriée pour le port série d'un PC parce que lorsque l'ordinateur n'a pas d'information à transmettre via le port série, l'état du port n'est ni à '1' ni à '0', donc le transmetteur ne module pas et ne transmet pas, il est en mode sleep.  Par contre, lorsque l'ordinateur envoie des données de huit bits sur le port série, le Tx module seulement lorsqu'il voit des '1' logiques.  De cette façon, le récepteur est en mesure de démoduler le signal reçu seulement à partir de la présence  ou de l'absence du signal porteur.  Lorsque le signal porteur est présent, le récepteur sait que la donnée est un '1' logique et dans le cas contraire, lorsque le signal porteur est absent, la donnée est un '0'.  Cette modulation permet à deux modules Tx de transmettre un après l'autre sans avoir à développer un circuit de contrôle qui fermerait les transmetteurs pour ne pas avoir d'interférences.  Sans cette modulation, il serait impossible pour nous d'avoir deux transmetteurs puisque ceux-ci transmettraient continuellement en simultané.  Pour plus d'informations techniques sur les modules, il est possible de visiter les sites www suivants : http://www.linxtechnologies.com/ et http://www.abacom-tech.com/.
 

Description des circuits électroniques

Maintenant que les principes généraux ont été vus,  la compagnie Picsou présente les schémas  des circuits électroniques du système de communication RF. Comme nous le voyons sur les schémas, le circuit relié au PC et le circuit relié au robot sont presque semblables.  Les seules différences se situent au niveau des connections entre le connecteur RJ-11 et le SP3232.  Chacun des circuits est alimenté avec une pile de type 9V.  Il faut noter que tous les circuits intégrés du système de communication  sont conçus pour fonctionner entre 3 et 5V d'alimentation.  C'est pour cette raison que la tension 9 V de la pile est régulée par le régulateur variable LM338.  Avec le LM338, il est possible d'avoir une tension de sortie ajustable entre 1.25V et 25V pouvant fournir 5 A.  Pour notre application, nous alimentons tous nos circuits intégrés à l'aide du 4 V provenant de la sortie du régulateur.  À l'origine, les modules devaient fonctionner à 3 V, mais nous avons remarqué qu'à cette tension la transmission et la réception des signaux s'effectuaient difficilement, donc nous avons décidé d'augmenter la tension d'alimentation jusqu'à ce que la réception soit bonne.
 

Par la suite, nous pouvons diviser le circuit en trois parties, la partie transmission Tx, la partie réception Rx et la partie conversion TTL  RS-232.  Les deux circuits de la page précédente sont reliés au port série du PC et au port série du robot par un connecteur RJ-11.  Pour l'explication, nous allons prendre comme exemple le circuit relié au PC.  Tout d'abord, lorsque le PC transmet vers le robot, il envoie un signal RS-232 au circuit ci-haut via le connecteur RJ-11.  Ce signal RS-232 est ensuite converti dans le circuit intégré SP3232 en un signal TTL.  Par la suite, la dernière étape consiste à prendre le signal TTL provenant du SP3232 et de le faire entrer dans le transmetteur Linx TXM-433.  Le signal est alors transmit par ondes hertziennes.  La réception se fait du côté du robot par le récepteur Linx RXM-433.  Le récepteur envoi le signal TTL au SP3232 pour le reconvertir en format RS-232.  Le signal RS-232 est ensuite envoyé au port série du robot via le connecteur RJ-11.  La transmission du robot vers le PC se fait exactement de la même manière.
Le seul point en suspend pour l'instant est la partie du circuit qui apparaît en trait pointillé.  Cette partie correspond l'implentation de la communication RF dans la direction robot - PC.  Pour l'intant, seule la communication dans la direction PC - robot est fonctionnelle.  Nous avons placé en priorité le dévelopement d'une  bonne communication RF dans une direction plutôt que d'avoir une communication bidirectionnelle non fonctionnelle.  Comme nous le voyons sur les circuits des pages précédentes, les modifications nécessaires pour établir le deuxième sens de communication sont minimes.
 

 
3.2 Micro-contrôleur 68HC11
 

Protocole de communication

Le protocole de communication qui a été implanté est très simple et fonctionne de la manière suivante : Le serveur ou le robot transmettent un caractère qui représente la l'action à effectuer, suivit des arguments de celle-ci, par exemple si le serveur veut faire avancer le robot alors il envoie le caractère « a » qui signifie avance. Par la suite, il devra envoyer une série de trois caractères représentant le premier argument de la commande et ensuite il transmettra trois autres caractères pour le deuxième argument. Si une commande ne nécessite pas deux arguments alors on transmet de la même façon et le deuxième argument sera rejeté lors du traitement interne. Voici un exemple pour illustrer la méthode de transmission. Si on désire faire avancer le robot de 100 cm à une vitesse de 40% alors la façon de faire est la suivante : on envoie premièrement le caractère « a » pour signifier qu'il faut avancer, ensuite on envoie le premier argument qui dans le cas de la fonction avance représente la vitesse. Alors on envoie trois caractères « 0 4 0 » et on procède de la même façon pour le deuxième argument, donc 100 cm donne  « 1 0 0 ».
 

La détection des erreurs se fait dans le programme principal du robot et vérifie si les arguments reçus correspondent à des commandes plausibles. Si une commande dépasse la limite des arguments alors la commande est rejetée et le serveur  voyant que l'ordre n'a pu être exécuté va relancer une transmission.
 

Fonctions de communication et de déplacement

Pour permettre une communication efficace entre le robot et le serveur, plusieurs fonctions ont dû être implanté dans le programme principal du robot. La section qui suit fait référence à ces fonctions, les arguments qu'ils acceptent et à leur principales utilités.
 

La fonction « disable_pcode_serial(void) »

Cette fonction a pour but d'annuler l'effet du programme (IC) pour programmer le robot. Donc, une fois le programme principal du robot  chargé avec (IC),  le pcode doit être désactivé puisque si le pcode est actif, le robot ne peut pas utiliser la fonction de réception série. Cette fonction est sans argument et est utilisée au début du programme principal.
 

La fonction « reenable_pcode_serial(void)»
 
Une fois que le programme principal est terminé , il faut rétablir la communication entre le robot et son interface de programmation (IC). Alors, il faut réactiver le pcode avec la fonction « reenable_pcode_serial(void) pour annuler l'effet de la fonction précédente. Cette fonction est sans argument et s'utilise à la fin du programme principal.
 

La fonction « set_baud(int rate) »

Puisque les modules de communication de Linx Technologies fonctionnent à une vitesse maximale de 4800 bauds, il a donc été nécessaire de faire passer la vitesse de transmission du robot de 9600 bauds à 4800 bauds.  La variable « rate » correspond à la vitesse de transmission et de réception du robot, cette fonction est appelée une fois au début du programme principal. Il est nécessaire de rétablir la vitesse à 9600 à la fin du programme.
 

La fonction « serial_tx(int c) »

Cette fonction transmet un caractère à la fois par le port série. La variable « c » est un entier qui correspond au code ascii du caractère à envoyer, par exemple pour transmettre le caractère « 1 » il faut transmettre de code « 40 » (voir une table de caractères ascii).
 

La fonction « int serial_tx(void) »

À l'image de la fonction précédente, cette fonction reçoit un caractère à la fois et comme pour la fonction de transmission le code reçu correspond au code ascii du caractère transféré.
 

La fonction « get_command(char tab[6]) »

Cette fonction reçoit les six caractères d'arguments transmis par le serveur  et convertie les codes ascii et caractères numériques entiers. Exemple si les codes ascii reçut par serial_tx sont : 40 41 42  43 44 45 alors la conversion donnera 1 2 3 4 5 6 qui pourront maintenant être utilisé comme argument pour les fonctions de déplacement etc.
 

Les fonctions « Dist(void)  et Reset_click() »

Cette fonction calcule la distance que fait le robot en tenant compte du résultat que retournent les encodeurs de roues. La fonction Dist agit en tâche de fond, c'est-à-dire qu'elle calcul constamment la distance et peut être remise à zéro avec la fonction « Reset_click() ».
 

Les fonctions « Avance(int speed, int distance) et Recule(int speed, int distance) »

Les fonctions Avance et Recule déplacent le robot d'une certaine distance en cm à une certaine vitesse en pourcentage de vitesse. Ces fonctions comportent un procédé d'asservissement (voir correction du mouvement) qui permet au robot de suivre une trajectoire plus rectiligne.
 

La fonction Tourne(int direction, int deg (angle)):

Cette fonction permet au robot de tourner.  En effet, le robot par un pivot sur lui-même tourne du sens et de l'angle demandé.  Avec la valeur de l'angle passé en argument, on peut déterminer la distance à parcourir pour chaque roue.  Comme le robot fait un pivot, les roues parcourront la même distance mais dans des directions opposées.  Pour calculer cette distance, nous nous sommes servis de quelques notions simples en mathématique pour calculer la longueur d'un arc de cercle.  Ainsi, avec cette valeur, nous avons pu trouver précisément le nombre de tours que doit tourner chaque roue.  En actionnant les moteurs de chaque roue dans des directions opposées, celles-ci tourneront jusqu'au moment où l'un a atteint le nombre de tour requis.  Idéalement, nous voudrions que les roues parcourent la même distance mais due à des contraintes physiques sur les moteurs, il arrive qu'une roue tourne plus vite que l'autre provoquant ainsi une petite erreur dans l'angle.
 

Fonctions de  la capture des pièces

Puisque la qualité distinctive du projet était d'identifier des pièces dans le but d'acquérir une somme quelconque, on se devait de faire un certain système pour permettre au robot d'exécuter cette action.  Avec un ingénieux système de bras, actionné à l'aide d'un servomoteur, de simples aimants et d'une gratte (également actionné par un servomoteur) on n'a pu procéder à la capture des pièces.  ( Pour plus d'information sur ce système, référez-vous à la section Robot ).  Toutefois, pour bien contrôler ce système nous avons doté notre robot de différentes fonctions servant à contrôler les actionneurs (bras et gratte) pour permettre à ceux-ci d'identifier, de ramasser, de déplacer et de déposer les pièces de monnaies ainsi sélectionnées.  Pour permettre une meilleure compréhension de ce système, une explication détaillée de ces fonctions sera discutée.
 

La fonction « Gratte(int g ) »

La gratte de notre système sert principalement à compenser les erreurs pouvant intervenir lors des différents déplacements effectués pour se rendre à la pièce de monnaie.  C'est pourquoi le robot est doté d'une fonction servant à descendre (pour saisir une pièce) ou soulever (lors des déplacements) la gratte.  Pour une certaine sortie(1 bit = 1 ou 0) le circuit contrôlant le servomoteur fait actionner ce dernier à deux positions différentes permettant de descendre ou monter la gratte.  La sortie nécessaire pour cette opération est prise sur le port D du microcontrôleur soit la pin PD5.  Toutefois, puisque le port D (pin 3,4,5 et 6) est bidirectionnel nous devons préalablement régler la direction des pins à output. Ainsi, nous aurons 4 sorties disponibles.  Ensuite, avec les fonctions d'écriture, bit_set et bit_clear, nous pouvons au choix, obtenir une valeur de 1 ou 0 à la sortie PD5.  La fonction gratte reçoit donc en argument g = 2 pour descendre la gratte ou g = 1 pour soulever la gratte.
 

La fonction « Identifie( ) »

Cette fonction comme son nom l'indique, identifie la pièce de monnaie à l'intérieur de la gratte. Pour procéder à cette identification, nous devrons se servir de 2 bits d'entrée sur le port A soit PA1 et PA2. Il est important de mentionner que ces entrées sont à 1 lorsqu'elles sont flottantes et c'est pourquoi, nous devrons forcer celles-ci à la masse. En effet, par de petites plaques métalliques fixées de chaque côté de la gratte, une pièce s'insérant entre elles, forcera une certaine entrée sur le port A à la masse par le biais de la conduction de la pièce. Une plaque est donc alimentée à la masse et l'autre entre dans le port A.  La fonction identifie lit sur le port A (par la fonction peek) si les bits PA1 et PA2 sont à la masse.  Un signal est envoyé au port série de l'ordinateur qui pourra déterminer si cette pièce doit être ramassée ou non.  Par exemple, si après une lecture sur le port A, PA1=0 et PA2=1, cela signifie qu'il y a un 25 cents et la fonction retournera un « 3 » (valeur choisie arbitrairement) au COM1 pour signifier qu'il s'agit d'une pièce de 25 sous.
 

La fonction « Bras(int b) »

Cette fonction nous permet de pouvoir prendre une pièce de monnaie, de la déplacer et par la suite, de la déposer dans une zone de déchargement.  Notre système de capture est donc muni d'un petit bras, actionné par un servomoteur qui lui permet d'avoir 3 positions différentes.  Encore une fois, comme la fonction Gratte(int g), le circuit doit recevoir certains bits pour contrôler la position du servomoteur par le fait même la position du bras.  Ainsi, nous nous sommes servis des sorties disponibles du port D soit 2 bits (PD3 et PD4) pour déterminer les positions requises.  La fonction Bras(int b) règle donc les sorties de PD3 et PD4 pour que le circuit utilisant un "555" varie la position du servomoteur.  Par exemple, lorsque que la fonction Bras(int b) est appelée et qu'elle reçoit en argument b=2; la fonction « set » PD3=1 et PD4=0.  Alors, le circuit contrôle le servomoteur de sorte que le bras se retrouve en position pour déplacer la pièce.  Pour régler les différentes pin soit PD3 et PD4, nous utilisons encore une fois les fonctions d'écriture: bit_set et bit_clear.

Résumé des commandes serveur - robot
 

 
Résumé des commandes
 
 Fonctions
Code 
Argument 1 
Argument 2 
Exemple 
 Avance
 Vitesse
Distance 
 a040100
 Recule
 r
 Vitesse
 Distance
 r040100
 Tourne
 t
 Direction
 Angle
 t001045 - Dro.
t002045 - Gau.
 Gratte
 g
 001
Lever : 001 
Descendre : 002
g001001
g001002
 Identifie
 i
 001
 001
 i001001
 Bras
 b
 001
 actions
001: ramasse 
002: déplace 
003: décroche
 

Correction du mouvement

Les caractéristiques des deux moteurs n'étant pas du tout semblables, nous avons dû corriger leur mouvement afin de pouvoir suivre une trajectoire rectiligne. Pour y parvenir, l'équipe du 68HC11 a programmé un asservissement simple dans le programme principal du robot qui permet d'améliorer sa course. L'algorithme se divise en deux parties : la distance parcourue par chaque roue et une correction sur la vitesse des moteurs. Afin de suivre la distance parcourue par chaque roue, l'équipe a eu recours à une tâche de fond (process) qui suit constamment l'évolution du parcours des roues. Ensuite lorsqu'une fonction de déplacement est appelée, celle-ci compare l'évolution de l'écart entre chaque roue (donnée par la tâche de fond) et corrige la vitesse d'un des deux moteurs afin de faire tendre l'écart à zéro.
 

Documentation

Code source du robot   
Circuit électroniques du système de communication RF- Circuit PC   
Circuit électroniques du système de communication RF- Circuit Robot   



[ Application ]   [ Communication ]   [ Imagerie ]   [ Robot ]
    Retour en arrière