Programmation
Objectifs
La programmation du robot implique la réalisation des objectifs suivants:
- Concevoir un programme en interactive C (IC) permettant le contrôle du robot.
- Le programme doit être capable de communiquer avec un ordinateur par son
port série en utilisant le protocole RS-232.
- Le programme doit implanter des fonctions permettant au robot d’avancer,
reculer, tourner, activer et désactiver l’électroaimant, connaître l’état
de l’alimentation, détecter les obstacles rencontrés. Ces fonctions doivent
donner des résultats avec la meilleure précision possible.
- Développer une classe en C++ interfacant la communication série de l’ordinateur.
Les fonctions de cette classe seront utilisées par les responsables de l’imagerie
et de l’algorithme de positionnement pour communiquer avec le robot.
- Établir un protocole de communication avec la collaboration de l’équipe
du traitement de l’image. Ce protocole doit être efficace et permettre de
minimiser et détecter les erreurs de transmission.
Potentiels et contraintes
Les potentiels et contraintes dans la réalisation de ces objectifs s'énoncent
comme suit:
- Les possibilités de calcul et de mémoire du robot sont limité.
- Les ports d’entrée et de sortie du robot sont limités.
- L’imprécision des déplacements du robot.
- Le protocole RS-232 et les communications série nous sont inconnues.
- Intéressantes possibilités de programme « multithread » avec le robot.
- Aucune expérience dans la programmation de micro-controleur.
- Peu d’expérience avec les MFC pour la programmation du port série.
Solution
La solution développée capitalise sur les points suivants:
- la fonctionnalité
- la rapidité d'implémentation
- l'utilisation des ressources logicielles disponibles (librairie C++)
Elle se décrit en 6 points.
1. Adoption d'une stratégie "Maître-esclave"
L'ordinateur prend l'initiative de contrôler la communication. Le robot
attend d'être interrogé par l'ordinateur, pour en connaître l'état à tout
instant et lui transmettre les ordres à exécuter.
2. Fonction avance()
Elle permet d’avancer et de reculer en ligne droite selon une vitesse et
une distance. La vitesse du robot est constante et la fonction reçoit un paramètre
de distance en centimètre (± 0 à 100). On obtient une précision de quelques
centimètres pers. Si un des senseurs du robot est activé (collision avec un
objet), le robot s’arrête et attend la prochaine commande.
3. Fonction tourne()
Elle permet de tourner sur place dans le sens horaire et anti-horaire selon
le paramètre qu’elle reçoit, soit ± 0 à 360 degrés. On obtient une précision
raisonnable.
4. Fonction electroaimant()
Elle reçoit « 1 » en paramètre pour activer l’électroaimant, et « 0 » pour
désactiver. Cette fonction utilise le port D du robot. Elle a été développée
avec les responsables de l’électrotechnique.
5. Protocole de communication
- Le protocole de communication est établi avec les responsables du traitement
de l’image.
- L’envoi de la commande se fait sur 3 octets.
- l'octet 1 : contient la commande à exécuter par le robot.
- l'octet 2 : contient le paramètre de la commande.
- l'octet 3 : contient un « checksum » permettant de valider la commande
reçue par le robot.
- Quand le robot reçoit une commande, il donne toujours une réponse sur 1
octet. Il répond « 1 » quand la commande qu’il reçoit est validé et exécutée
et « 0 » quand une erreur est détectée.
- Dans le cas de la fonction recharge, il retourne « 0 » et « 1 » comme les
autres fonctions sauf si le niveau d’énergie est à ~20%, dans ce cas il retourne
« 3 » permettant ainsi à l’ordinateur de le diriger vers la station de recharge.
6. Communication série
Une classe en C++ GeoRobotCom a été développée et testée avec succès pour
permettre la communication par le port série de l’ordinateur. Cette classe
utilise les MFC et interface la classe CSerialPort. Elle contient seulement
la fonction Commande(), qui prend en paramètre la commande à envoyer au robot,
attend et retourne la réponse du robot.
Évaluation de la solution
Atteinte de l'objectif
L’objectif de départ a été atteint. Nous avons développé un programme pour
le robot qui répond à toutes nos attentes de base. Un interface logicielle
pour la communication série sur l’ordinateur a été conçu et testé et est fonctionnel
pour le projet.
Principales faiblesses
Le robot ne s’arrête pas de lui même s’il rencontre un obstacle. Il ne peut
savoir de lui même si les piles doivent être rechargé :il le fait sur commande
de l’ordinateur. Pour ce faire, il aurait fallut développer les fonctions
de façon « multithread ». Malheureusement le temps manquait pour réaliser
cette fonctionnalité, qui aurait été intéressante, et pas trop difficile à
implanter.
Délais de traitement
Le programme du robot s’exécute avec une assez grande rapidité. En fait,
il ne s’exécute pas à sa pleine vitesse, car il attend les commandes résultant
de la partie logicielle d’acquisition d’image qui est plus lente que la partie
du robot.
Robustesse
Le programme du robot pourrait être plus robuste. Quand il reçoit des informations
du port série alors qu’il ne s’y attends pas, il peut arriver que le programme
devienne hors fonction, et que l’on doivent recharger le « pcode ».
Quantité de code
- La quantité de code pour la programmation du robot n’est pas très volumineuse.
Le code est simple et très bien divisé en sous section pour permettre une
compréhension rapide. Il est divisé selon les différentes fonctions qu’il
peut exécuter. On peut facilement ajouter de nouvelles fonctions.
- Le protocole de communication peut permettre l’ajout de plus d’une centaines
de fonctions supplémentaires. Le code de la communication série est plus compliqué
et demande la compréhension du fonctionnement du port série. Il est très bien
commenté.
- La classe d’interface qui a été développée est très facile d’utilisation
: elle peut permettre à un débutant en C++ de communiquer via le port série.
Elle est développée de façon spécifique projet et ne peut être utilisée pour
la communication série en général. Il y a même un programme
de test permettant de vérifier le bon fonctionnement de cette classe.
Améliorations possibles
- Recommencer le projet à zéro avec la présente expérience,
nous procéderions de la même manière, sauf que l’on s’occuperait de la "communication
série" un peu plus tôt, pour permettre à l’équipe de communication de
tester leur module plus tôt. Cette partie du projet a été la
plus laborieuse.
- L'ajout de fonctions « multithread » pourraient régler les principaux problèmes
du robot et augmenter la robutesse de la solution.
- L'ajout d'autres fonctions concernant la communication série.