Labyrinthe
Notre Monty doit sortir d'un labyrinthe (la sortie est définie par un obstacle).
Analyse du
problème
Composants utilisés
- Moteur G et D
- Détecteur de position G et D (0 : Blanc, 1 :Noir)
- Capteur de choc G et D (0 : Choc, 1 : Libre)
- Buzzer
Stratégie
Je me suis basé sur le programme ligne noire.
Pour rappel :
Les capteurs de choc sont à zéro s'ils détectent un choc
et à 1 sinon.
Les capteurs de position sont à zéro s'ils sont sur une ligne
blanche et à 1 si cette ligne est noire.
Nous pouvons prendre comme hypothèse que notre robot est sur la ligne
noire. Lorsqu'il avance, il peut lui arriver plusieurs choses :
- Il rencontre un obstacle : on a fini
- Il quitte la ligne noire par la droite (celle si tourne ou notre robot n'est
pas dans l'axe de la ligne)
- Il quitte la ligne par la gauche (même raison que pour le cas précédent)
- Il quitte la ligne par les deux cotés en même temps, il faut
faire demi-tour.
Il n'a pas d'autres événements qui peuvent provoquer une réaction de notre robot.
Ne pouvant pas 'voir' la sortie, le Monty va utiliser la méthode du rat : toujours tourner à gauche (ou a droite). Pour cela, il va toujours essayer d'aller à gauche, s'il sort par la gauche, il va à droite. Lorsqu'il est sorti de la ligne (à cause d'un cul-de-sac), il fait demi-tour sur place.
Voici sur un labyrinthe simplifié le trajet que va faire le monty.

Algorithme
L'algorithme est très semblable à 'ligne noire', sauf pour les
points suivants :
- Le monty n'avance jamais en ligne droite, en effet, il essaye de longer 'le
mur' gauche.Par défaut on initialise w avec TG (movlw TG) et l'on ne
place TD que si l'on a plus rien sur le capteur gauche.
(S'il n'y a plus rien à droite on doit tourner à gauche, c'est
ce que l'on a prévu par défaut)
- Lorsque l'on touche quelque chose c'est que l'on est sorti. Modification :
on ne fait plus un call à Alarme mais on va en Fin
- Si l'on est sorti de la ligne noire, il faut faire demi-tour. on charge TGS
(tourne à gauche sur place) lorsque l'un des capteurs 'relit' la ligne,
nous pouvons considérer que nous avons terminé de faire demi tour
et l'on reprend de longer le mur gauche.
Le programme
Version 1.0 :
(08/05/2002 zip : 14K)
Variante 1: Monty tourne à droite (1.0 V1)
(22/05/2002 zip : 14K)
Variante 2: Monty choisi au départ de prendre toujours à droite ou toujours à gauche. La méthode pour "tirer" un nombre aléatoire est simple dans la boucle d'attente de la mise en marche, la pic incrémente une variable. Dans la boucle principale, il y a un test vérifiant si le nombre est paire ou impaire. Ce test permet de choisir si l'on charge "à droite" ou "à gauche" :
(1.0 V2)
(22/05/2002 zip : 14K)