robot téléguidé via application projet terminale

bonsoir
est ce que quelqu’un peut m’aider aussi a propos du ce programme qui est censé de faire avancer un robot selon le choix de 4 modes via mon application remplacer par les lettres I,J,K,L ce robot est pour un projet de terminale que je presente apres demain

ils permettent de choisir le robot en fonctions des modes car c’est un robot modulaire les modes marchent individuellement, mais en les mettant ensemble dans le programme ils ne marche pas ensemble

les 4 modes sont :
(BluetoothData == ‘J’) //on va dans la boucle chenille manuelle
(BluetoothData == ‘L’) { //on va dans la boucle roue manuelle
(BluetoothData == ‘I’) { //on va dans la boucle chenille auto
(BluetoothData == ‘K’) { //on va dans la boucle roue auto

je m’explique quand je choisi le mode chenille manuelle et roue manuelle le robot doit etre diriger avec les boutons avancer reculer tourner a droite et tourner a gauche depuis l’application

les deux autres modes sont des modes automatiques qui sont censés fonctionner automatiquement apres selection dans l’application

voici le code arduino :

int E1 = 5;
int E2 = 6;
int M1 = 4;
int M2 = 7;
char BluetoothData;
char BluetoothData1;



void setup() {

  Serial1.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() { // On va creer plusieurs étapes afin de mieux organiser les évenements qui se suivent.
  if (Serial1.available())
  {
    char BluetoothData = Serial1.read();


    if (BluetoothData == 'J') { //on va dans la boucle chenille manuelle
      Etape1();
    
      exit(0);
    }
    else if (BluetoothData == 'L') { //on va dans la boucle roue manuelle

    }
    exit(0);
  }
  else

    if (BluetoothData == 'I') { //on va dans la boucle chenille auto
      exit(0);

    }
    else if (BluetoothData == 'K') { //on va dans la boucle roue auto

      exit(0);
    }

}














/////////////////////////  BOUCLE CHENILLE MANUELLE //////////////////////////////////
void Etape1()

{

  if (Serial1.available())
  { digitalWrite(13, HIGH);
    delay(3000);
    char BluetoothData1 = Serial1.read();
  }
    if (BluetoothData1 == 'A') {
      analogWrite (E1, 255);
      digitalWrite(M1, HIGH);
      analogWrite (E2, 255);
      digitalWrite(M2, HIGH);
    }
    else if (BluetoothData1 == 'R') {
      //reculer();
    }

    else if (BluetoothData1 == 'D') {
      //droite();
    }

    else if (BluetoothData1 == 'G') {
      //gauche();
    }
    else if (BluetoothData == 'S') {
      //stop1();
    }
  }




void avancer() {
  analogWrite (E1, 255);
  digitalWrite(M1, HIGH);
  analogWrite (E2, 255);
  digitalWrite(M2, HIGH);
}

void reculer()
{
  analogWrite (E1, 255);
  digitalWrite(M1, LOW);
  analogWrite (E2, 255);
  digitalWrite(M2, LOW);

}

void droite()
{

  analogWrite (E1, 255);
  digitalWrite(M1, HIGH);
  analogWrite (E2, 255);
  digitalWrite(M2, LOW);
}

void gauche()

{
  analogWrite (E1, 255);
  digitalWrite(M1, LOW);
  analogWrite (E2, 255);
  digitalWrite(M2, HIGH);

}

void stop1()
{

  analogWrite (E1, 0);
  digitalWrite(M1, HIGH);
  analogWrite (E2, 0);
  digitalWrite(M2, HIGH);

}



void Etape2()
{
}

/////////////////////////  BOUCLE CHENILLE AUTO //////////////////////////////////
void Etape3()
{
}
/////////////////////////  BOUCLE ROUE AUTO //////////////////////////////////
void Etape4()
{

}

en vous remerciant de votre aide

ci joint une presentation de l’interface qui vous aidera a mieux comprendre :slight_smile: :slight_smile:

Et quelle est la question concrètement ?

bonsoir le probleme et que lorsque je selectionne un mode l'action ne s'effectue pas je souhaite que lorsque je choisi un mode le robot reste sur celui ci jusqu'a ce que je reset la carte et selectionne un autre mode via l'application

bonsoir
quelqu'un pourrait il m'aider c'est un projet de terminale que je dois presenter apres demain

merci de votre aide bonne soirée

bonjour,
quel type de carte?
uno, mega?

quand un truc ne fonctionne pas, il est bon d'utiliser serial.print (letrucrecu) pour vérifier si quelque chose arrive bien.

juste comme ca en passant, demander de l'aide pour un projet bac deux jours avant et en voyant le code, hummmmmm

infobarquee:
bonjour,
quel type de carte?
uno, mega?

quand un truc ne fonctionne pas, il est bon d'utiliser serial.print (letrucrecu) pour vérifier si quelque chose arrive bien.

juste comme ca en passant, demander de l'aide pour un projet bac deux jours avant et en voyant le code, hummmmmm

bonsoir c'est une carte arduino romeo le serial print affiche des valeurs qui arrive et qui sont les bonnes valeurs
et je m'y prends au dernier temps car j'essaie depuis un bon moment a essayer de regler le probleme :frowning:

bonsoir
quelques pourrait t-il m'aider ?

bonne soirée

Il faut restructurer votre code

Il doit y avoir une seule boucle qui attend TOUTES les commandes

Suivant la commande reçue - si c'est le choix d'un mode, vous le mémorisez, si c'est une action moteur / direction vous l"effectuez

Si pas de commande reçue vous ne faites riens si mode manuel (l'ordre moteur a déjà été donné) si mode auto vous lancez les détecteurs de collisions et traitez l'info puis remontez en début de boucle

Bonjour merci de ta réponse
Comment dois-je m’y prendre pour mettre une boucle qui attend toutes les commandes ?
Merci bonne journée

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

J-M-L:
c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

bonjour
je pense que dans mon cas je dois utilisé la fonction switch/case

mais je ne vois pas a quoi sert cette partie du programme ni comment l'utiliser:

Par défaut :
// si rien d'autre ne correspond, faites par défaut
// la valeur par défaut est la
rupture optionnelle ;

bonjour
je pense que dans mon cas je dois utilisé la fonction switch/case

je pense que dans votre cas vous auriez dû vous y mettre beaucoup plus sérieusement avant.... On ne va pas faire le programme pour vous, ce serait tricher.

J-M-L:
je pense que dans votre cas vous auriez dû vous y mettre beaucoup plus sérieusement avant… On ne va pas faire le programme pour vous, ce serait tricher.

je ne vous demande pas de me faire le programme mais seulement de m’aider
comme je le disait plus j’ai consacré enormément de temps a essayer de regler le probleme en vain

si quelqu’un veut bien m’aider … :confused:
merci

hassanleboss:
si quelqu'un veut bien m'aider .... :confused:
merci

tu as une réponse déjà faite

J-M-L:
Il faut restructurer votre code

Il doit y avoir une seule boucle qui attend TOUTES les commandes

Suivant la commande reçue - si c'est le choix d'un mode, vous le mémorisez, si c'est une action moteur / direction vous l"effectuez

Si pas de commande reçue vous ne faites riens si mode manuel (l'ordre moteur a déjà été donné) si mode auto vous lancez les détecteurs de collisions et traitez l'info puis remontez en début de boucle

infobarquee:
tu as une réponse déjà faite

J-M-L:
Il faut restructurer votre code

Il doit y avoir une seule boucle qui attend TOUTES les commandes

Suivant la commande reçue - si c'est le choix d'un mode, vous le mémorisez, si c'est une action moteur / direction vous l"effectuez

Si pas de commande reçue vous ne faites riens si mode manuel (l'ordre moteur a déjà été donné) si mode auto vous lancez les détecteurs de collisions et traitez l'info puis remontez en début de boucle

cela ne m'aide toujours pas apres avoir essayé plusieurs solution avant de demander sur le foru mais la je ne sais pas comment m'y prendre

regardez votre loop, elle fait déjà l'attente d'une commande et si c'est I,J,K,L elle fait quelque chose (bon elle fait n'importe quoi pour le moment). rajoutez au même endroit l'attente des autres commandes et traitez les commandes reçue correctement.

vous aurez besoin d'une variable (utilisez un enum comme montré dans mon tuto) pour mémoriser le mode de votre robot et ensuite décidez quoi faire pour chaque lettre reçue en fonction du mode.

si vous n'avez rien reçu éventuellement en fonction du mode faites quelques chose d'automatisé

void loop() { 

  if (Serial1.available()) {
    char bluetoothData = Serial1.read();
    switch (bluetoothData) {

      // ------------------- LES MODES -----------------
       case 'I':
          mode = ChenilleAuto;
          break;
       case 'J':
          mode = ChenilleManuelle;
          break;
       case 'K':
          mode = RoueAuto;
          break;
       case 'L':
          mode = RoueManuelle;
          break;

      // ------------------- LES COMMANDES -----------------
       case 'R':
          if ((mode == RoueManuelle) || (mode == ChenilleManuelle)) {
                // ordres moteur tourner à droite uniquement en mode manuel
                analogWrite (E1, 255);
                digitalWrite(M1, HIGH);
                analogWrite (E2, 255);
                digitalWrite(M2, LOW);
          }
          break;

       case 'G':
          if ((mode == RoueManuelle) || (mode == ChenilleManuelle)) {
                // ordres moteur tourner à gauche uniquement en mode manuel
                 analogWrite (E1, 255);
                 digitalWrite(M1, LOW);
                 analogWrite (E2, 255);
                 digitalWrite(M2, HIGH);
          }
          break;

      // etc

    } 

    // ici on a traité la réception d'un ordre, on gère le fonctionnement automatique

    if (mode == ChenilleAuto) {
         // faire une étape de chenille Auto, ne pas bloquer la boucle


   } else  if (mode == RoueAuto)) {
         // faire une étape de Roue Auto, ne pas bloquer la boucle

   } 

}

Merci beaucoup de votre aide la selection des modes fonctionnent :slight_smile: :slight_smile: :slight_smile: :slight_smile:

Rebonjour :slight_smile:

dans le mode automatique je souhaite rajouter un capteur ultrasons et je souhaite savoir si le programme est juste car lorsque qu’il approche d’un obstacle le robot ne s’arrête pas

voici le code

int E1 = 5;
int E2 = 6;
int M1 = 4;
int M2 = 7;
int trig = 12;
int echo = 11;
int ddm;
long lecture_echo;
long cm;
char BluetoothData;
char BluetoothData1;
enum {ChenilleAuto, ChenilleManuelle, RoueAuto, RoueManuelle} mode;

void setup() {
  pinMode (2, INPUT);
  pinMode (ddm, INPUT);
  digitalRead (ddm) ;
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  Serial1.begin(9600);
}
void loop() {

  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = lecture_echo / 58;

  int ddm = digitalRead (2);
  

  if (Serial1.available()) {
    char bluetoothData = Serial1.read();
    switch (bluetoothData) {

      // ------------------- LES MODES -----------------
      case 'I':
        mode = ChenilleAuto;
        break;
      case 'J':
        mode = ChenilleManuelle;
        break;
      case 'K':
        mode = RoueAuto;
        break;
      case 'L':
        mode = RoueManuelle;
        break;

      // ------------------- LES COMMANDES -----------------
      case 'D':
        if ((mode == RoueManuelle) || (mode == ChenilleManuelle)) {
          // ordres moteur tourner à droite uniquement en mode manuel
          analogWrite (E1, 255);
          digitalWrite(M1, HIGH);
          analogWrite (E2, 255);
          digitalWrite(M2, LOW);
        }
        break;

      case 'G':
        if ((mode == RoueManuelle) || (mode == ChenilleManuelle)) {
          // ordres moteur tourner à gauche uniquement en mode manuel
          analogWrite (E1, 255);
          digitalWrite(M1, LOW);
          analogWrite (E2, 255);
          digitalWrite(M2, HIGH);
        }
        break;


      case 'A':
        if ((mode == RoueManuelle) || (mode == ChenilleManuelle)) {
          // ordres moteur tourner à gauche uniquement en mode manuel
          analogWrite (E1, 255);
          digitalWrite(M1, HIGH);
          analogWrite (E2, 255);
          digitalWrite(M2, HIGH);
        }
        break;

      case 'R':
        if ((mode == RoueManuelle) || (mode == ChenilleManuelle)) {
          // ordres moteur tourner à gauche uniquement en mode manuel
          analogWrite (E1, 255);
          digitalWrite(M1, LOW);
          analogWrite (E2, 255);
          digitalWrite(M2, LOW);
        }
        break;

      case 'S':
        if ((mode == RoueManuelle) || (mode == ChenilleManuelle)) {
          // ordres moteur tourner à gauche uniquement en mode manuel
          analogWrite (E1, 0);
          digitalWrite(M1, HIGH);
          analogWrite (E2, 0);
          digitalWrite(M2, HIGH);
        }
        break;

    }

    // ici on a traité la réception d'un ordre, on gère le fonctionnement automatique

    if (mode == ChenilleAuto) {


      if (cm > 20)
      {
        analogWrite (E2, 255);
        digitalWrite(M2, HIGH);
        analogWrite (E1, 255);
        digitalWrite(M1, HIGH);

      }
      else if (cm < 20)
      {
        analogWrite (E2, 0);
        digitalWrite(M2, HIGH);
        analogWrite (E1, 0);
        digitalWrite(M1, HIGH);
        
      }
    }

    else  if (mode == RoueAuto) {

      if (cm > 20)
      {
        analogWrite (E2, 100);
        digitalWrite(M2, HIGH);
        analogWrite (E1, 100);
        digitalWrite(M1, HIGH);

      }
      else if (cm < 20)
      {
        analogWrite (E2, 0);
        digitalWrite(M2, HIGH);
        analogWrite (E1, 0);
        digitalWrite(M1, HIGH);
      }


    }
  }
}

Pourrais-je avoir de l'aide ?