Club robotique de Sophia-Antipolis

Accueil > Projets et études > Nos robots > Robots Eurobot > PoBot 2008 (aka Mars Alien) > Code du robot pour la FdS 2008

Code du robot pour la FdS 2008

samedi 1er novembre 2008, par Julien H.

 Principe de programmation

Une machine à état gère les différentes étapes de la stratégie à l’intérieur d’une boucle continue. C’est-à-dire qu’un certain nombre d’opérations sont exécutées très régulièrement (toutes les 50 ms) pour gérer l’acquisition des capteurs, la commande en vitesse des moteurs et la gestion des servomoteurs, et la boucle se termine par l’évaluation de l’état en cours dans la stratégie : déterminer l’action à exécuter et envisager de passer à l’état suivant.

Cette machine à état est totalement linéaire : lorsque la condition de fin d’état est réunie, un compteur est incrémenté et on passe à l’état/commande suivant.

Tout le déroulement du match est donc déterministe, ce qui rend le fonctionnement du robot très simpliste mais rudement efficace. C’est déjà rudement complexe à gérer et n’empêche pas de se creuser la tête.

Donc vous l’aurez deviné, l’implémentation de la stratégie va ressembler beaucoup à la liste d’opérations décrite ci-dessus, et notre travail va consister à une simple décomposition en états/commandes élémentaires.

Il y a trois possibilités d’action pour chaque commande, selon qu’on veut agir lorsqu’on entre dans l’état, pendant qu’on est dans l’état (l’action décrite va se répéter à chaque tour de boucle) ou quand la condition de sortie est atteinte.

Les commandes disponibles

Description des actions correspondant aux états
Commande Action initiale Action en boucle Condition de sortie Action de sortie
STARTrienrieninterrupteur "jack" de départ retirémettre à 0 le chrono des secondes
WAITarmer un compteur, si demandé passer la vitesse à 0rientemps d’attente atteintrien
ENDcouper les moteursrienaucunerien
ENA_MOTactiver les moteursrientout de suiterien
DIS_MOTcouper les moteursrientout de suiterien
PINCE_Oouvrir la pincerientout de suiterien
PINCE_Ffermer la pincerientout de suiterien
DOCKpositionner les consignes de vitessescouper le moteur correspondant au côté atteint en premierles deux interrupteurs sont en contact avec le murrien
GOTOfaire passer l’index du tableau des commandes à l’index passé en consigne (avant ou après)rientout de suiterien
MOVE_Xrienappeler l’algorithme turn & gola coordonnée passée en paramètre est atteinterien
MOVE_Yrienappeler l’algorithme turn & gola coordonnée passée en paramètre est atteinterien
MOVE_CAPrienappeler l’algorithme turn & gola coordonnée passée en paramètre est atteinterien
MOVE_POSrienappeler l’algorithme de logique flouela position X,Y,cap est atteinterien
MOVE_SECpositionner les consignes de vitesse et armer le chronorienle compteur a atteint la consigne de temps d’attenterien

Comme vous le remarquez, il n’y a pas toujours d’attente, ce qui signifie qu’on va entamer la consigne suivante sans attendre que l’action soit terminée. C’est utile pour la pince (elle va s’ouvrir ou se fermer alors qu’on est déjà en mouvement) mais il faut bien l’avoir en tête et intercaler des WAIT quand on a besoin de temporiser suffisament pour laisser le temps à l’action précédente de se terminer.

Les modifications à apporter

Nous n’utiliserons pas le jack de départ, il ne faudra donc pas utiliser la commande START, mais pas besoin de la modifier. On utilisera une opération hors de la machine à état pour enregistrer les coordonnées du robot (ce point sera détaillé ultérieurement).

Il va falloir modifier la commande DOCK : en effet, le recalage sur le bord sert à remettre à niveau la coordonnnée correspondant à l’axe atteint. Comme l’origine choisie pour cette démo diffère de l’origine du terrain de la Coupe, la coordonnée à enregistrer lorsqu’on est au contact est différente.

Les suppléments à ajouter

Il faut créer de nouvelles actions pour l’utilisation de la turbine. L’ensemble "turbine + servo" est autonome : une électronique dédiée assure le pilotage du moteur de la turbine et l’asservissement en position du servomoteur qui permet de la faire pivoter. Le programme principal va donc échanger avec cette carte pour commander l’une des 4 positions possibles :

Commande Description
TURB_OFFturbine au repos
TURB_ASPIturbine en aspiration
TURB_PRETs’aligner avec l’entrée du lanceur
TURB_LANCEpassage de la balle au lanceur

De la même manière, le lanceur a une électronique de contrôle des moteurs CC qui utilise une communication très simple pour recevoir ses ordres

Commande Description
LANCE_ONallumer les moteurs
LANCE_OFFéteindre les moteurs

Avant de pouvoir lancer une balle, il faut attendre une demi-seconde. On laissera ce choix à la stratégie, selon qu’on intercale un WAIT après le LANCE_ON ou bien qu’on utilise un déplacement (MOVE_...) pour gérer ce temps de mise en route.

Dans ces deux cas (turbine ou lanceur), le code à développer est simple. Concernant la machine à état, on reprendra l’exemple de la pince (une action au premier tour puis passage direct à l’état suivant). Pour la communication, des lignes de sortie sur les ports numériques de la carte principale sont reliées aux cartes électroniques dédiées. Il suffit donc de mettre à 1 ou à 0 les pattes correspondantes.

Exemple de code :

int main()

// initialisation des ports
// sbi = set bit = niveau haut = 1 sur la patte demandée
// DDR = Direction Data Register
// DDRB = registre DDR du port B
// 0 ou 1 signifie la patte 0 ou 1 de ce port
sbi(DDRB,0) ;
sbi(DDRB,1) ;

while (1)

...
// appels aux différentes commandes
// par exemple "turbine off"
cbi(PORTB,0) ;
cbi(PORTB,1) ;
...
// par exemple "turbine lance"
sbi(PORTB,0) ;
sbi(PORTB,1) ;


Une question subsiste : faut-il le faire en même temps (et l’Atmel le fait-il ainsi) ou bien peut-on faire suivre deux commandes cbi ou sbi ?

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.