Problème commande bluetooth

Bonjour,
J'ai pour projet de reproduire le robot Scott de la machinerie. La différence est qu'il y a un capteur ultrason intégré et j'aimerai par le Bluetooth le faire passer en ultrason. Mais cela ne fonctionne pas une fois l'ultrason lancé cela fonctionne mais qu'une fois et ensuite va tout droit et se prends les murs. Il faudrait qu'une fois que je le lance qu'il fonctionne tout seul.
Merci de votre aide.

/* voici un programme permettant de contrôler un petit robot autonome du nom de Scott, inventé par la Machinerie, le Fablab d'Amiens. Les détails sur leur wiki : http://wiki.lamachinerie.org/projects/scott-le-mini-robot
 *  
 *  Ce robot autonome créé à partir d'un Mini Driver Dagu RS027, de 2 moteurs motoréducteurs GM9, d'un coupleur de piles x4, et d'un capteur ultrason HC-SR04.
 */

//----------------------------------------------------------

/* pour brancher la Dagu à L'IDE Arduino (le programme Arduino), ne pas oublier :
 *  
 *  - télécharger le driver sur le site de Silabs : http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx#windows
 *  
 *  - dans l'IDE Arduino choisir dans outils, type de carte "Arduino NG ou older"
 *  
 *  - toujours dans outils, sélectionner dans la catégorie processeur : ATmega8
 */

//----------------------------------------------------------
// Définir les constantes et variables pour le bluetooth
//----------------------------------------------------------
 
byte serialA; // variable de reception de donnée via RX


//----------------------------------------------------------
// Définir les constantes et variables pour les moteurs
//----------------------------------------------------------
 
const int Direction_Moteur_Gauche = 7; // indique que Direction_Moteur_Gauche est sur la broche : PIN 7
const int Vitesse_Moteur_Gauche = 9; // indique que Vitesse_Moteur_Gauche est sur la broche : PIN 9
const int Direction_Moteur_Droit = 8; // indique que Direction_Moteur_Droit est sur la broche : PIN 8
const int Vitesse_Moteur_Droit = 10; // indique que Vitesse_Moteur_Droit est sur la broche : PIN 10

// Direction_Moteur indique le sens de rotation du moteur pour faire aller le robot vers l'avant.
// Vitesse_Moteur sert à la fois à gérer la vitesse du Robot avec la fonction analogWrite, mais elle sert aussi à faire tourner le moteur dans l'autre sens avec la fonction digitalWrite

//----------------------------------------------------------
// Définir les constantes et variables pour le capteur HC-SR04
//----------------------------------------------------------
//ARDUINO IDE code for Obstacle detecting Robot
const int trig = 4;
const int echo = 5;
long duration, inches, cm;

//----------------------------------------------------------
// Void setup (exécuté 1 fois)
//----------------------------------------------------------

void setup() {
  
    // définir les PIN des moteurs pour savoir si c'est des entrées ou des sorties
    pinMode( Direction_Moteur_Gauche, OUTPUT ); // indique que Direction_Moteur_Gauche est une sortie
    pinMode( Vitesse_Moteur_Gauche, OUTPUT ); // indique que Vitessee_Moteur_Gauche est une sortie
    pinMode( Direction_Moteur_Droit, OUTPUT ); // indique que Direction_Moteur_Droit est une sortie
    pinMode( Vitesse_Moteur_Droit, OUTPUT ); // indique que Vitesse_Moteur_Droit est une sortie
    Serial.begin(9600);
    pinMode(trig,OUTPUT);
    pinMode(echo,INPUT);
}

//----------------------------------------------------------
void marche_Avant(  )
{
    // Avancer tout droit à une vitesse de 255 sur 255
    digitalWrite( Direction_Moteur_Gauche, HIGH ); // met en marche le moteur gauche
    digitalWrite( Direction_Moteur_Droit, HIGH ); // met en marche le moteur droit
    analogWrite( Vitesse_Moteur_Gauche, 200 ); // règle la vitesse du moteur Gauche à 200 (allant de 1 à 255)
    analogWrite( Vitesse_Moteur_Droit, 200 ); // règle la vitesse du moteur Droit à 200 (allant de 1 à 255)
}

//----------------------------------------------------------
void marche_Arriere (  )
{
    // Reculer tout droit à une vitesse de 255 sur 255
    digitalWrite( Vitesse_Moteur_Gauche, HIGH ); // pour faire reculer on utilise "Vitesse_Moteur_Gauche
    digitalWrite( Vitesse_Moteur_Droit, HIGH ); //
    analogWrite( Vitesse_Moteur_Gauche, 220 ); // règle la vitesse du moteur Gauche à 200 (allant de 1 à 255)
    analogWrite( Vitesse_Moteur_Droit, 220 ); // règle la vitesse du moteur Droit à 200 (allant de 1 à 255)
}

//----------------------------------------------------------
void tourner_Droite (  )
{
    digitalWrite( Direction_Moteur_Gauche, HIGH ); // met en marche le moteur gauche
    digitalWrite( Vitesse_Moteur_Droit, HIGH ); // met en marche le moteur droit mais en sens inverse
    analogWrite( Vitesse_Moteur_Gauche, 200 ); // règle la vitesse du moteur Gauche à 100 (allant de 1 à 255)
    analogWrite( Vitesse_Moteur_Droit, 100 ); // règle la vitesse du moteur Droit à 50 (allant de 1 à 255)
}

//----------------------------------------------------------
void tourner_Gauche (  )
{
    digitalWrite( Vitesse_Moteur_Gauche, HIGH ); // met en marche le moteur gauche
    digitalWrite( Direction_Moteur_Droit, HIGH ); // met en marche le moteur droit mais en sens inverse
    analogWrite( Vitesse_Moteur_Gauche, 100 ); // règle la vitesse du moteur Gauche à 50 (allant de 1 à 255)
    analogWrite( Vitesse_Moteur_Droit, 200 ); // règle la vitesse du moteur Droit à 100 (allant de 1 à 255)
}

//----------------------------------------------------------
void arreter ( )
{
    digitalWrite( Direction_Moteur_Gauche, LOW ); // met en marche le moteur gauche
    digitalWrite( Direction_Moteur_Droit, LOW ); // met en marche le moteur droit
    analogWrite( Vitesse_Moteur_Gauche, 0 ); // règle la vitesse du moteur Gauche à 0 (allant de 1 à 255)
    analogWrite( Vitesse_Moteur_Droit, 0 ); // règle la vitesse du moteur Droit à 0 (allant de 1 à 255)
}
//----------------------------------------------------------
void marche_Avant_Rapide( )
{
    // Avancer tout droit à une vitesse de 255 sur 255
    digitalWrite( Direction_Moteur_Gauche, HIGH ); // met en marche le moteur gauche
    digitalWrite( Direction_Moteur_Droit, HIGH ); // met en marche le moteur droit
    analogWrite( Vitesse_Moteur_Gauche, 250 ); // règle la vitesse du moteur Gauche à 200 (allant de 1 à 255)
    analogWrite( Vitesse_Moteur_Droit, 250 ); // règle la vitesse du moteur Droit à 200 (allant de 1 à 255)
}

//----------------------------------------------------------

void ultrason( ) {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(5);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
//this returns the time duration taken
//for the ultrasonics to hit an obstacle and return
inches = duration / 74 / 2;//converts the time duration into inches
cm = duration / 29 / 2;//converts the time duration to cm
  if(cm>15){//checks for the distance is greater than 15cm
  //the bot forward if the condition is true
    marche_Avant(  );
    Serial.print("No obstacle detected");
    delay(100);
  }
      else {
    //the robot turns right when an obstacle is detected
  Serial.print("Obstacle detected");
delay(100);//this delays the process by 100millisec
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
          marche_Arriere ( );
          delay (1000);
          tourner_Droite ( );
          delay (1000);
          marche_Avant( );
          delay(50);
delay(100);//this delays the code by 0.1 second and repeats the loop again
      }
     }

     
void loop(){
   {  while (Serial.available() == 0); // wait for character to arrive
   char c = Serial.read();

   
     if(c =='4') {
    marche_Avant(  );
    }
     
     if(c == '1'){
    arreter ( );
    }
     
     if(c == '2'){
    tourner_Droite (  );
    }
     
     if(c == '3'){ 
    tourner_Gauche (  );
    }
     
     if(c == '0'){
    marche_Arriere (   );
    } 
     
     if(c == '5') {
      ultrason( );
     }

     if(c == '6') {
    marche_Avant_Rapide ( );
    }
  }
}

j'aimerai par le Bluetooth le faire passer en ultrason

ça veut dire quoi?

ça veut dire que depuis le Bluetooth je lui envoie un ordre pour qu'il passe en 'mode ultrason'

alors il faut virer l'attente active d'une commande sur le port série au début de la loop sinon c'est là où vous passez votre temps et si vous n'avez rien reçu alors il faut appeler ultrason() pour continuer à avancer

par exemple votre loop() pourrait être comme cela

void loop() {
  static bool modeUltraSon = false; // pour mémoriser le mode
  if (Serial.available()) {   // si on a reçu un caractère sur le port série
    char c = Serial.read();   // on le lit      
    switch (c) {              // on regarde si c'est une commande valide
      case '0':
        modeUltraSon = false; // N'importe quelle commande valide arrête le mode automatique
        marche_Arriere();
        break;
      case '1':
        modeUltraSon = false; // N'importe quelle commande valide arrête le mode automatique
        arreter ();
        break;
      case '2':
        modeUltraSon = false; // N'importe quelle commande valide arrête le mode automatique
        tourner_Droite ();
        break;
      case '3':
        modeUltraSon = false; // N'importe quelle commande valide arrête le mode automatique
        tourner_Gauche();
        break;
      case '4':
        modeUltraSon = false; // N'importe quelle commande valide arrête le mode automatique
        marche_Avant();
        break;
      case '5':
        modeUltraSon = true;  // on passe en mode automatique
        ultrason();
        break;
      case '6':
        modeUltraSon = false; // N'importe quelle commande valide arrête le mode automatique
        marche_Avant_Rapide();
        break;
    }
  } else if (modeUltraSon) ultrason();
}

Malheureusement suite à un test le problème reste le même avec votre exemple. Le problème est que si je lui dit de passer en ultrason il va le faire mais qu'une fois. Ensuite il se cogne et ne s'arrête pas.

Julien-p:
Malheureusement suite à un test le problème reste le même avec votre exemple. Le problème est que si je lui dit de passer en ultrason il va le faire mais qu’une fois. Ensuite il se cogne et ne s’arrête pas.

Si vous passez en mode ultrason() il fait ce que la fonction lui dit de faire tant que vous n’envoyez aucune autre commande*. S’il se “cogne et ne s’arrête pas” c’est que la fonction ultrason() ne lui dit pas de faire autre chose et ne fonctionne pas.

Pour tester vous pouvez utiliser cette boucle(puisque c’est ce que fait mon code une fois que vous avez enclenché le mode ultrason):

void loop() {
 ultrason();
}

Que se passe-t-il dans ce cas?


__*__Comment est connecté votre adaptateur BT? est-ce qu’il bavarde et peut envoyer d’autres chose que les commandes de l’utilisateur?

Alors quand je me sers uniquement du Bluetooth il fonctionne très bien pareil pour l'ultrason uniquement sans Bluetooth. Voici un petit schéma de mon montage:
https://image.noelshack.com/fichiers/2017/12/1490101706-montage-scotty-avec-couleurs-respectives.jpg

votre image pour tous

lien sur votre carte?

comment envoyez vous des commandes BT?

Avec mon smartphone sur l'application 'Arduino Bluetooth Controller'

et qu'est-ce que vous voyez en retour sur votre smartphone?

C'est-à-dire ?
J'ai une petite 'manette' a laquelle j'ai assigné les valeurs numériques à un mouvement par exemple pour marche avant sur la touche avant il envoie 4 donc Scotty va en avant. J'espère être clair ^^

votre code fait des Serial.print() vous les voyez s’afficher?

Oui ils s'affichent correctement.

Du coup mon problème n'est toujours pas réglé et je suis perdu..