par PrépaQuébec » 24 Déc 2008, 05:10
Salut,
vacances de Noël oblige, j'ai pris le temps de me repencher sur l'Asuro, histoire aussi de mettre à profit mes nouvelles connaissances en C. Voici ce que ça donne, suivi de ligne AVEC gestion des obstacles:
/*
Par : Stephane
Date : 23 décembre 2008
Revisions :
Fonctionnalités du programme: Programme Asuro pour suivi de ligne.
*/
#include "asuro.h"
/****************************************************************************/
/* CONSTANTES DE COMPILATION */
/****************************************************************************/
#define TEMPO 255 /* Sans unité, envoyé à la fonction sleep */
#define PMP 255 /* Sans unité, envoyé en paramètre
à MotorSpeed, représente la vitesse max
du robot. */
#define SENSI_SWITCH 10 /* Sans unité, sera comparé au retour
de PollSwitch */
typedef enum {GAUCHE, DROITE} t_direction;
/****************************************************************************/
/* DECLARATIONS DE FONCTIONS */
/****************************************************************************/
void Suivi_ligne(void);
void reaction_obstacle(void);
void corriger_trajectoire(t_direction direction);
/****************************************************************************/
/* FONCTION MAIN() */
/****************************************************************************/
int main(void)
{
/* On initialise le microcontroleur.
Cette fonction doit OBLIGATOIREMENT etre appelée en début de
programme!
*/
Init();
/* Appel de la fonction ligne() de suivi de ligne, dans un boucle infinie
pour l'instant.*/
while (1)
{
Suivi_ligne();
}
return 0;
}
/****************************************************************************/
/* DEFINITIONS DE FONCTIONS */
/****************************************************************************/
/* Pour réaliser le suivi, on créé un tableau de 2 entiers non signé, qui sera
envoyé à la fonction LineData pour détérminer la position d'Asuro
par rapport à la ligne.*/
void Suivi_ligne(void)
{
/* Conserve les valeurs courantes lues sur les phototransistors. */
unsigned int posit_ligne[2];
/* On met la LED frontale à ON pour faciliter le travail des phototransistors,
sa lumière étant réfléchie par le sol sous le robot. La LED de status est
placé sur vert, fonctionnement normal. On envoit le tableau posit_ligne à
LineData.
*/
FrontLED(ON);
StatusLED(GREEN);
LineData(posit_ligne);
/* Si l'un des phototransistors reçoit plus de lumière, c'est que le robot
sort de sa ligne dans cette direction. Les moteurs doivent contrer cette
tendance.
*/
if (posit_ligne[0] < posit_ligne[1])
{
corriger_trajectoire(GAUCHE);
}
else if (posit_ligne[0] > posit_ligne[1])
{
corriger_trajectoire(DROITE);
}
}
void corriger_trajectoire(t_direction direction)
{
unsigned char contact;
if (direction == GAUCHE)
{
/* L'allumage d'une des LED arrières permet de visualiser quel "if"
est à l'oeuvre. */
BackLED(OFF,ON);
/* Appel des fonctions de propulsion, moteur en avant, moteur droit
tourne plus vite afin de corriger la position. */
MotorDir(FWD, FWD);
MotorSpeed(80, 170);
}
else
{
BackLED(ON, OFF);
MotorDir(FWD, FWD);
MotorSpeed (170, 80);
}
/* La valeur 1 pour PollSwitch permet d'éviter les déclenchements
intempestifs. */
if ((contact = PollSwitch()) > SENSI_SWITCH)
{
reaction_obstacle();
}
}
void reaction_obstacle(void)
{
int i;
/* Événement inattendu, on passe la LED de status à jaune.
FrontLED est inutile dans cette fonction, on l'éteint.*/
StatusLED(YELLOW);
FrontLED(OFF);
/* On accélére progressivement jusqu'à vitesse maxi, l'appel à
à Sleep permet de ralentir le processus pour une bonne execution
du 1/4 de tour.*/
for(i = 0; i < PMP; i++)
{
MotorDir(RWD,RWD);
MotorSpeed(i,0);
Sleep(TEMPO);
}
}
Ça marche bien, Asuro pivote de 90 degrés sur obstacle et reprend sa route.
@++
Stef