Problème capteur robot suiveur de ligne

Bonjour, je suis en 1ère année d'école d'ingénieur et notre premier projet consiste à créer un petit robot suiveur de ligne.

J'ai réussi à créer un programme qui fonctionne avec un seul capteur du type MeLineFollowerV2 11005, (qui est un capteur avec deux "sensors", qui est le suivant :

#include "MeOrion.h"

MeDCMotor motor1(PORT_1);
MeDCMotor motor2(PORT_2);
MeDCMotor motor3(M1);
MeDCMotor motor4(M2);

uint8_t motorspeed = 25;

MeLineFollower lineFinder(PORT_3);

void setup() 
{
  Serial.begin(9600);
motor1.stop();
motor2.stop();
motor3.stop();
motor4.stop();
}

void loop() 
{
  int sensorState = lineFinder.readSensors();
  switch(sensorState)

{
case S1_IN_S2_IN: 
  Serial.println("Sensor 1 and 2 are inside of black line"); 
  motor1.run(-motorspeed);
  motor2.run(-motorspeed);
  motor3.run(-motorspeed);
  motor4.run(-motorspeed);
  break;

case S1_OUT_S2_IN:
  Serial.println("Sensor 1 is outside of blackline"); 
  motor1.stop();
  motor2.run(-motorspeed);
  motor3.stop();
  motor4.run(-motorspeed);
  break;

case S1_IN_S2_OUT:
  Serial.println("Sensor 2 is outside of blackline"); 
  motor1.run(-motorspeed);
  motor2.stop();
  motor3.run(-motorspeed);
  motor4.stop();
  break;
  
case S1_OUT_S2_OUT:
  Serial.println("Sensor 1 and 2 are outside of black line"); 
  motor1.stop();
  motor2.stop();
  motor3.stop();
  motor4.stop();
  break;
  
 
  default: break;

}}
 

Cependant, mon souhait est de placer 2 capteurs Me Line Follower, ce qui implique en conséquence 4 "sensors".

Le problème est que je ne sais pas comment introduire ce deuxième capteur dans le programme étant donné que S1 et S2 sont déjà utilisés.
J'ai cru comprendre que le #define pouvait être une solution mais je ne sais pas comment m'y prendre.

Par avance merci pour votre aide :))

Bonjour bienvenue sur le forum. C'est une bonne chose d'avoir utilisé les balises de code pour poster, il nous manque quelques infos

  • qu'est-ce que MeOrion.h ?
  • quelle bibliothèque pour MeLineFollower ?
  • qu'est-ce que S1 et S2 ?

en pratique on comprend à la lecture du code que lineFinder est une instance de la classe MeLineFollower qui sait lire le capteur (ici connecté sur PORT_3) par le biais de l'appel à la méthode lineFinder.readSensors() qui retourne un état sous forme d'énumération (S1_IN_S2_IN, S1_OUT_S2_IN, ...)

Si vous ajoutez donc un autre capteur (instances LF1 et LF2) sur un autre port et que vous faites

MeLineFollower LF1(PORT_x); // définir où il est connecté
MeLineFollower LF2(PORT_y); // définir où il est connecté

...

  int etatLF1 = LF1.readSensors();
  int etatLF2 = LF2.readSensors();

alors vous aurez dans etatLF1 et etatLF2 l'état de chacun des 2 capteurs.
Ils peuvent prendre chacun 4 valeurs, vous avez donc 16 possibilités à explorer.

➜ il faut remplir chacune des case du tableau avec l'action que vous souhaitez effectuer si cette condition (conjonction des 2 états) est remplie

ensuite vous groupez les cases qui conduisent à la même action et vous réduisez les conjonctions des conditions pour obtenir une valeur de vérité (ça vous fera bosser votre algèbre booléenne) et votre switch() devient un gros

if (conditions1)       actions1();
else if (conditions2)  actions2(); 
else if (conditions3)  actions3(); 
else if (conditions4)  actions4(); 
else                   actions5();

une autre approche c'est l'approche "bourrin" des switch imbriqués ou vous traitez les 25 cas possibles

switch (etatLF1) {
case S1_IN_S2_IN:
  switch (etatLF2) {
    case S1_IN_S2_IN:   break;
    case S1_OUT_S2_IN:  break;
    case S1_IN_S2_OUT:  break;
    case S1_OUT_S2_OUT: break;
    default:            break;
  }
  break;

case S1_OUT_S2_IN:
  switch (etatLF2) {
    case S1_IN_S2_IN:   break;
    case S1_OUT_S2_IN:  break;
    case S1_IN_S2_OUT:  break;
    case S1_OUT_S2_OUT: break;
    default:            break;
  }
  break;

case S1_IN_S2_OUT:
  switch (etatLF2) {
    case S1_IN_S2_IN:   break;
    case S1_OUT_S2_IN:  break;
    case S1_IN_S2_OUT:  break;
    case S1_OUT_S2_OUT: break;
    default:            break;
  }
  break;

case S1_OUT_S2_OUT:
  switch (etatLF2) {
    case S1_IN_S2_IN:   break;
    case S1_OUT_S2_IN:  break;
    case S1_IN_S2_OUT:  break;
    case S1_OUT_S2_OUT: break;
    default:            break;
  }
  break;

default:
  switch (etatLF2) {
    case S1_IN_S2_IN:   break;
    case S1_OUT_S2_IN:  break;
    case S1_IN_S2_OUT:  break;
    case S1_OUT_S2_OUT: break;
    default:            break;
  }
  break;
}

PS: Si le capteur peut retourner autre chose (une valeur d'erreur par exemple) il faudra en tenir compte et ça fait 5x5 états = 25