| Module Communication
Picsou Robotix inc. |
| Yves Beaumont
Steeve Duchesne Maxime Roy |
beaumo00@gel.ulaval.ca
steduc1@globetrotter.net roy09@gel.ulaval.ca |
| 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 :
| 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 :
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
Code source du robot
Circuit électroniques du système
de communication RF- Circuit PC
Circuit électroniques du système
de communication RF- Circuit Robot