Continue à réfléchir
Tu mesures 2 distances à des obstacles, l'une sur la gauche, l'autre sur la droite.
J'ai l'impression que tu veux te diriger du coté opposé à l'obstacle le plus proche.
Peut être plus l'obstacle et proche, plus tu veux t'éloigner.
Un algorithme simple pourrait être :
- mesurer la distance à l'obstacle à gauche
- mesurer la distance à l'obstacle à droite
- choisir le coté où l'obstacle est le plus prêt
- m'en éloigner de manière inversement proportionnelle à la proximité de l'obstacle.
Si on cherche à traduire cela en C, ca donne quelque chose du genre :
void loop()
{
irValueD = analogRead(irD); //lit la valeur de ir droit (valeur haute = objet proche, valeur faible = objet lointain)
irValueG = analogRead(irG); //lit la valeur de ir gauche
if ( irValueD > irValueG )
{
// obstacle plus prêt à droite, on part à gauche (angle < 90°)
angle = 90 + map( irValueD, 0, 1023, 0, 30 );
}
else
{
// obstacle plus prêt à gauche, on part à droite (angle > 90°)
angle = 90 + map( irValueG, 0, 1023, 0, 30 );
}
servo.write( angle );
}
Cela devrait un peu plus se rapprocher de ce que tu veux faire.
Si tu veux faire un calcul de moyenne au lieu d'une lecture unique, tu peux faire comme cela :
#define NB_MESURES 10
void loop()
{
irValueD = 0;
irValueG = 0;
for ( int i = 0 ; i < NB_MESURES ; i++ =
{
irValueD += analogRead(irD); // on fait la somme des mesures
irValueG += analogRead(irG); // on fait la somme des mesures
}
irValueD /= NB_MESURES; // on divise par le nombre de mesures pour avoir la moyenne
irValueG /= NB_MESURES;
if ( irValueD > irValueG )
{
// obstacle plus prêt à droite, on part à gauche (angle < 90°)
angle = 90 + map( irValueD, 0, 1023, 0, 30 );
}
else
{
// obstacle plus prêt à gauche, on part à droite (angle > 90°)
angle = 90 + map( irValueG, 0, 1023, 0, 30 );
}
servo.write( angle );
}
Cette méthode ne regarde qu'un coté donc quand on est proche de 2 obstacles, on risque de faire ping-pong.
Une autre approche est de combiner les 2 valeurs de façon a déterminer la direction.
L'un des valeurs va tirer à gauche, l'autre va tirer à droite.
void loop()
{
irValueD = analogRead(irD); //lit la valeur de ir droit (valeur haute = objet proche, valeur faible = objet lointain)
irValueG = analogRead(irG); //lit la valeur de ir gauche
angle = irValueD - irValueG; // la valeur va tendre vers 1023 si un objet est proche à droite ou à -1023 si l'objet est proche a gauche.
// mais si il y a des objets des 2 cotés, elle va tendre du coté de l'objet le plus proche.
angle = map( angle, -1023, 1023, 60, 120 );
servo.write( angle );
}
Mais le mieux est de passer vers un modèle d'asservissement PID (Proportionnel Intégrale Dérivée) qui est surement le plus efficace.