Action getlinepos (recupere la position de la ligne) Ve : llp, rlp [pointeurs sur octet] (left & right line position) lastls [entier] (last line state) Vr : [entier] (constante indiquant la position de la ligne) Av : lllp, lrlp [octets] (last llp & rlp) Debut | lllp <- *llp | lrlp <- *rlp | *llp <- 0 | *rlp <- 0 | | Lecture des capteurs, | Si un capteur est sur une ligne blanche | | Marquer ce capteur (OU logique) | | dans l'octet correspondant au cote du capteur | FinSi | | Si on n'a localise la ligne nulle part | | On decide qu'elle est la ou elle etait juste avant | FinSi | | Si la ligne est a plusieurs endroite | |ET ce n'est pas que au centre | | Renvoyer qu'on croise une ligne | Sinon | | En fonction de la position de la ligne, | | Renvoyer la position (constante) adquate | FinSi | | (on ne devrait jamais arriver ici) | Renvoyer qu'il y a eu une erreur Fin Action principale lvit, rvit [entiers] (rapport cyclique des moteurs) linestate, lls [entiers] (etats actuel et precedent de la ligne) llp, rlp [octets] (position actuelle de la ligne) ishere, washere [octets] (etats actuel et precedent de la detection de barriere) usd, usdd [entiers sur 32 bits] (etats et temporisation pour la detection a droite) Debut | Initialiser le PIC | | TantQue le jack est en place | | Ne rien faire | FinTantQue | | TantQue la barriere n'est pas encore tombee (ie: washere=0) | | lls <- linestate | | linestate <- getlinepos(&llp, &rlp, lls) (ou est la ligne ?) | | | | Selon linestate | | | Regler la vitesse des moteurs pour corriger | | | la trajectoire (avec lvit et rvit) | | | | | | Cas ligne blanche croisee (cas particulier) | | | | Si juste avant on en croisait pas une ligne | | | | |blanche (verification de lls) | | | | | Si on detectait deja a droite (ie: usd>0) | | | | | | Arreter de detecter (ie: usd <- 0) | | | | | Sinon | | | | | | Commencer la detection (ie: usd <- 1) | | | | | FinSi | | | | FinSi | | | FinCas | | FinSelon | | | | Si on detecte a droite, mais on n'est pas a l'arret (ie: usd>0 ET usdd=0) | | | Incrementer usd | | | Si on a atteint le temps limite (ie: usd>USDMAX) | | | | Arreter de detecter (ie: usd <- 0) | | | FinSi | | FinSi | | | | Si on detecte A GAUCHE et on etait a l'arret (ie: ddrl>0) | | | On ne prend plus les ultrasons en compte (ie: usd <- 0, usdd <- 0) | | SinonSi usd>0 ET on detecte A DROITE | | |OU on est a l'arret (ie: usdd>0) | | | Arreter les moteur (avec lvit et rvit) | | | Incrementer usdd | | | Si on a atteint le temps limite (ie: usdd>USDDMAX) | | | | On ne prend plus les ultrasons en compte | | | FinSi | | FinSi | | | | Si on heurte la barriere ET c'est la premiere fois (ie: ishere=0) | | | ishere <- 1 | | SinonSi on ne heurte pas la barriere ET on l'a heurtee avant (ie: ishere=1) | | | washere <- 1 | | FinSi | | | | Mettre le moteur gauche a la vitesse lvit | | Mettre le moteur droit a la vitesse rvit | FinTantQue | | Arreter les moteurs | TantQue VRAI | | Ne rien faire | FinTantQue Fin