<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte



 Joyeux le robot !
Joyeux est l'un (l'une?) des PMI que nous avons utilisée à la coupe 2000.

Joyeux avec son capot blac
Le rôle de Joyeux était de crever les ballons mobiles même si ils avaient bougés.
Pour cela, il expérimentait un système de balises infra-rouges, et s'en servait pour trouver les 2 ballons mobiles.
Il utilisait tout d'abord une phase au timer pour descendre de l'aire de départ (bon dernier des PMI, il se pressait pas) et gagner le terrain adverse.
Ensuite il recherchait une certaine balise (identifiée par un code) avec sa tourelle et essayait de s'en rapprocher le plus possible. Si au bout d'un certain il ne la trouvait pas, ou si il finissait par taper un obstacle en vue de la balise, il changeait alors de code et passait à la balise suivante. Et ainsi de suite !


 Prérequis
Avant de regarder plus avant comment est réalisé Joyeux, il est nécessaire d'avoir vu les fiches précédentes.
Bien sûr tout d'abord tout ce qui concerne le PIC,
mais aussi sa partie mécanique, la gestion des servos,
et enfin et surtout ce qui fait sa particularité (même si une autre PMI les utilisait aussi) : les balises.


 Comment Joyeux s'est comporté à la Coupe ?
Joyeux n'a pas eu de chance (c'est pas moi, c'est Murphy !)
Etant dans le dernier à partir, il a été souvent géné par ses malheureux congénères qui ont eu des problèmes divers au départ.
Les 3 premiers matchs, Joyeux a tout simplement terminé sur son derrière, à bouger pitoyablement sa tourrelle dans tous les sens ...
Sur le 4ème match, coincé par les PMI adverses, Joyeux est sorti trop tôt de la phase au timer.
Il quand même vu la balise de l'autre côté du terrain, s'est jeté dessus ...
mais s'est coincé dans le dénivelé du fossé. Il a finalement réussi à se libérer et à crever un ballon à peu près 10s APRES la fin du match !
Sur le 5ème et dernier match, la phase au timer s'est enfin bien déroulée. Joyeux a creuvé 1 ballon et aurait crevé le deuxième si Atchoum ne l'avait pas déja fait. Ouf ! son papa commençait à désespérer ;)

En résumé :
- La phase au timer, malgré un système de recalage en utilisant la colline au départ, cette phase est très aléatoire et ne donne pas satisfaction. C'est vraiment parce qu'on voulait faire simple !
- Les balises elles marchent tip top. Joyeux les voyait de l'autre côté de la table, malgré l'éclairage de la télé et les problèmes d'inclinaisons.
De plus il ne se trompait pas et choisissait bien la bonne.
- L'asservissement vers les balises, au prix de quelques réglages un peu délicats, l'asservissement marchait très bien (sauf vraiment quand Joyeux était juste à côté du ballon. Il devait s'éloigner d'abord avant de bien revenir).


 Les composants de Joyeux
La base mécanique :
Joyeux sans son capot
Joyeux a un cache en carton recouvert de résine, peint en blanc. Il a fallu découper méchamment pour laisser la tourelle passer.
Le chassis est le chassis standard des PMI fribottes.
On a sur l'avant en plus la tourelle avec son capteur IR (dont l'inclinaison est réglable) muni de son cache.
Juste en dessous, un peu de plomb pour alourdir la PMI (et éviter qu'elle ne décolle sur les plans inclinés).
Les pointes sont placées directement sur la tourrelle, pour éviter qu'elles ne gênent la tourrelle dans sa recherche des balises.
Sur l'arrière la carte PIC, avec en dessous les accus (la prise de recharge est en dessous de la PMI).
La tourelle L'avant
Le dessous Le capteur de choc

Tous les fils qui se promènent sont coulés dans la résine au niveau des connecteurs ou des soudures. Ils sont ensuite enroulés de chaterton (on n'est jamais trop prudent).
La carte électronique :
Joyeux a la carte électronique PIC "standard" des PMI Fribotte.
Cette dernière sera (ou est) décrite dans une autre page.
Grossièrement, elle comprend le PIC 16F84, la régulation, le quartz, la régulation des servos, des connecteurs (dont 3 pour les servos), un interrupteur, un système de détection de lumière, et 4 LEDS.
Il n'y a pas de système de programmation du PIC sur la carte. Il devait donc être enlevé et remis à chaque changement du programme !
Les capteurs :
Joyeux a (seulement) 3 capteurs :
  • Un capteur de lumière pour le démarrage.
  • Un capteur de choc à l'avant (micro-switch) pour les obstacles
  • Et bien sûr le capteur de détection infra-rouge des balises !
Les accus :
Joyeux a un pack de 8 accus 1.2 V (ici simplement des accus NI/CA 750 mAh).
L'autonomie est déja pas mal importante !
A noter que le pack est fait maison, avec des "piles rechargables" du commerce.


 Le joyeux algorithme
Je vais détailler ici plus particulièrement l'algorithme utilisé sur Joyeux pour se diriger vers les ballons.

Il n'est pas très compliqué, mais présente quand même une difficulté :
En effet il y a un double asservissement imbriqué
La tourrelle doit chercher, puis rester sur la balise.
Et Joyeux lui-même doit se tourner dans la direction de la balise.

Oui, mais quand Joyeux se tourne, la tourrelle tourne avec ! Il faut donc la ramener un peu dans la direction inverse pour ne pas qu'elle perde la balise.
Résultat : des réglages un peu délicats (sachant qu'on n'a pas vraiment beaucoup de marges). Mais au final ça marche !

Comment la tourelle reste sur la balise ?
La tourelle n'a qu'une information pour se diriger. Oui il y a une balise en face, non il n'y a pas de balise en face.
Rien d'autre ! Et en particulier aucune information de direction ...
Du coup j'ai utilisé l'algorithme suivant pour traquer la tourrelle :
Admettons qu'on soit sur la balise. On initialise une valeur compteur à 0 et CompteurMax à 1. On va alors bouger dans une direction (c'est important, on bouge tout le temps la tourrelle !)
Si on détecte on revient au début, en continuant à bouger dans la même direction.
Si on ne détecte plus on va alors incrémenter compteur.
On continue à bouger jusqu'à ce que soit on détecte (et on revient toujours au début dans ce cas), soit compteur soit égal à compteurMax. A ce moment-là on double compteurMax, on remet compteur à 0 et on change de sens de rotation de la tourrelle.
On cherche encore la balise dans l'autre sens cette fois ...

Donc la tourrelle va faire des aller-retour de plus en plus longs pour essayer de trouver la balise qu'elle a perdue !
Si CompteurMax, qui double à chaque aller-retour, dépasse une certaine valeur, on considère la balise comme perdue, et on passe à d'autres phases du programme pour essayer de la retrouver.

Et ça donne quoi sur les roues ?
Et bien tout simplement si la tourrelle part trop à droite ou trop à gauche les roues tournent.
Tout d'abord une roue d'un coté s'arrête, mais si la différence est encore plus grande elle part en marche arrière !
Du coup, il faut compenser sur la tourelle pour qu'elle suive le mouvement...

L'algo général?
Voici maintenant l'algo général.
Il y a eu depuis que je l'ai écrit (et oui, je l'ai écrit avant de coder !!) quelques différences par rapport au code, mais rien d'important !
		

Interruption :

	Gère les PWM (avec Min et Max teste)
	Teste l'obstacle devant -> retourne sa valeur dans une variable globale
	Teste la balise -> retourne sa valeur dans une variable globale
	Compteur++
	NouvelleInterrution = 1


Main :

BaliseATrouver = Balise1
CompteurDeChoc = 0
CompteurDePerduBalise = 0
CompteurDeVaToutDroit = 0

Debut : etape 1

(les indications de sens tourelle/moteur sont en fait des fixations de la valeur de leur PWM)


-------------------------------------------------------
Les phases de mouvement forcees
-------------------------------------------------------

Etape 1 Rotation sur soi-meme
	Compteur = 0
	Faire 
		Tourelle devant
		Moteur gauche avance
		Moteur droit recule
	Jusqu'a ce que :
		Balise detectee -> va en 4
		Compteur superieur a 200 -> Va en 2
		Obstacle detecte -> va en 3

Etape 2 Avance tout droit
	Compteur = 0
	CompteurDeVaToutDroit++
	si CompteurDeVaToutDroit > CompteurDeVaToutDroitMax
		GOSUB ChangeBalise
	Faire 
		Tourelle devant
		Moteur gauche avance
		Moteur droit avance
	Jusqu'a ce que :
		Balise detectee -> va en 4
		Compteur superieur a 200 -> Va en 1
		Obstacle detecte -> va en 3

Etape 3 Recule suite a obstacle
	Compteur = 0
	CompteurDeChoc++
	si CompteurDeChoc > CompteurDeChocMax
		GOSUB ChangeBalise
	Faire 
		Tourelle devant
		Moteur gauche arret
		Moteur droit recule
	Jusqu'a ce que :
		Compteur superieur a 100 
			PWMtourelle = MaxPWMtourelle
			sensDeRotationTourelle = -1
			-> Va en 5
	
-------------------------------------------------------
L'asservissement
-------------------------------------------------------

Etape 4	Asservissement sur la balise
	CompteurMax = 1
	Compteur = 0
	avance = 1
	Faire 
		NouvelleInterrution =0
		Faire (rien) // Attend qu'une phase d'interruption complete ait ete realisee
		tantque NouvelleInterrution=0 
		PWMtourelle = PWMtourelle + sensDeRotationTourelle (-1 ou 1)
		Si balise detectee -> compteur = 0, CompteurMax  = 1, avance = 1
		Si compteur > compteurMax, ou si en butee (> a MaxPWMtourelle ou < a MinPWMtourelle )
			sensDeRotationTourelle  = - sensDeRotationTourelle 
			compteur = 0
			compteurMax = compteurMax * 2
			Si compteurMax > 16 avance = 0
			Si compteurMax > 128
				si PWMtourelle > milieu
					PWMtourelle = MaxPWMtourelle
					sensDeRotationTourelle = -1
				sinon 
					PWMtourelle = MinPWMtourelle
					sensDeRotationTourelle = 1
				Va en 5	
			Si PWMTourelle en butee 
				si PWMtourelle > milieu
					PWMtourelle = MaxPWMtourelle -1 
				sinon
					PWMtourelle = MinPWMtourelle +1 
				   
		si avance = 1
			si PWMtourelle < milieu + epsilon
				Moteur droit avance
				PWMtourelle++
			sinon 
				si PWMtourelle > milieu + GrandEcart
					Moteur droit recule
					PWMtourelle--
				sinon
					Moteur droit arret

			si PWMtourelle > milieu - epsilon
				Moteur gauche avance
				PWMtourelle--
			sinon 
				si PWMtourelle < milieu - GrandEcart
					PWMtourelle++
					Moteur gauche recule
				sinon
					Moteur gauche arret
		Sinon su avance = 0, va tout droit !
	Jusqu'a ce que 
		Obstacle detecte 
			si balise detectee
				GOSUB 	ChangeBalise			
			-> va en 3
		
	
-------------------------------------------------------
La recherche immobile, un tour de tourelle complet
-------------------------------------------------------
	
etape 5 Tour de tourelle immobile
	Compteur = 0
	CompteurDePerduBalise++
	si CompteurDePerduBalise > CompteurDePerduBaliseMax
		Gosub ChangeBalise
	Faire (pour laisser le temps a la tourelle d'arriver en butee)
		Moteur gauche arret
		Moteur droit arret
	Jusqu'a ce que :
		Compteur superieur a 50, continue

	Faire 
		PWMtourelle = PWMtourelle + sensDeRotationTourelle (-1 ou 1)		
		Moteur gauche arret
		Moteur droit arret
	Jusqu'a ce que :
		Balise detectee -> va en 4
		Obstacle detecte -> va en 3
		Tourelle en butee -> Va en 1

-------------------------------------------------------
Des Sous-Fonctions
-------------------------------------------------------

ChangeBalise
		CompteurDeChoc = 0
		CompteurDePerduBalise = 0
		CompteurDeVaToutDroit = 0
		BaliseATrouver++
		si BaliseATrouver > BaliseATrouverMax
			BaliseATrouver = Balise1


Les autres parties du code : La gestion des servos
Les PWM des servos sur Joyeux ainsi que sur d'autres PMI qui ont le même code sont gérés un peu différement de ce qu'on a vu les pages précédentes.
Le code est ici fait pour demander le même temps quelque soit les valeurs de ces PWM, soit 20ms, pour simplifier ensuite les phases au timer.
Il y a eu pour cela une simplification : la tourrelle peut toujours avoir une valeur de PWM quelconque (8bits, limité par les butées), mais les 2 PWM des moteurs gauches et droits ne peuvent plus prendre que 3 valeurs : Arret (pas de PWM,) avance (tourne à fond dans un sens) et recule (tourne à fond dans l'autre).
Cette partie du code sera expliquée plus en détail dans les pages d'autres PMI Fribottes.

Le démarrage au timer
Joyeux présente une particularité : l'utilisation de l'EEPROM du 16F84.
En effet, les numéros des balises à rechercher, ainsi que l'ensemble du parcours à effectuer était stoqué dans cette dernière et lus à l'éxécution par le programme.
Le stockage dans l'EEPROM permet surtout une modification plus rapide : pas besoin de recompiler le programme pour changer de parcours.
Par contre sa capacité de stockage est limitée (mais suffisante dans le cas de Joyeux). Une simple modification dans l'EEPROM à partir du programmateur permet le changement des codes des balises, ou la modification d'un paramêtre du parcours au timer.
Ces derniers sont représentés de manière très simple :
Il y a 2 octets, un premier indique l'état des moteurs à appliquer (marche/arrêt et sens) et le deuxième indique le temps pendant lequel il est appliqué, en muliple de 20ms.

Toutes ces données sont pré-remplies dans le programme par la commande d'assemblage "DE" qui permet de remplir l'EEPROM. Et elles sont donc ensuite rapidement modifiables dans l'éditeur du programmateur (même si il était quand même nécessaire d'enlever le PIC pour le mettre sur le programmateur !)
Le code final
Voici donc le code de Joyeux tel qu'il a été utilisé à la coupe, à quelques réglages près !




Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/robots/Joyeux.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail