Incompatibilité apparente entre commande bluetooth et HCSR04 ?

Bonjour,
Veuillez excuser une question sans doute basique, mais je débute...
J'ai réalisé un robot simple commandé par bluetooth via HCO5 qui fonctionne bien, mai à l'ajout d'une fonction de détection US via HCSR04, la détection de distance fonctionne mais plus la commande bluetooth. Quid ?
Les branchements sont corrects bien sûr.
Malgré mes efforts et mes tests je ne comprend pas.
Merci.
(Je 'nai pas trouvé où me présenter :grimacing:)

#include <SoftwareSerial.h>
#include <HCSR04.h>

const int trigPin = 10;   //attribution des broches du capteur US
const int echoPin = 11;

SoftwareSerial mySerial(2, 3); // Création d'une instance du port série logiciel
int val; // commande bluetooth

UltraSonicDistanceSensor distanceSensor(trigPin, echoPin); // Création d'une instance du capteur US

// attribution des brochages moteurs
int in1 = 9;  // Entrée In sens rotation moteur A
int in2 = 8;  // Entrée In sens rotation
int in3 = 7;  // Entrée In sens rotation moteur B
int in4 = 6;  // Entrée In sens rotation

void setup()
{
  mySerial.begin(9600); //  initialisation de la vitesse port série logiciel
  Serial.begin(9600);  // initialisation de la vitesse port série matériel
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
  arret();
  float distance = distanceSensor.measureDistanceCm();
  Serial.print ("Distance :");
  Serial.println(distance);
  if (mySerial.available()) { // vérifie s'il y a des données disponibles sur la liason bluetooth
    val = mySerial.read();  // stocke les données dans la variable val
    if (val == '0') {
      arret () ;
    }
    if (val == '1') {
      avancer () ;
    }
    if (val == '2') {
      reculer () ;
    }
    if (val == '3') {
      tourneradroite () ;
    }
    if (val == '4') {
      tourneragauche () ;
    }
    if (val == '5') {
      arret () ;
    }
  }
  if (distance < 30 ) {
    arret();
    delay(300);
    reculer();
    delay (1000);
  }
}

// Définition des déplacements
void arret () {
  digitalWrite(in1, LOW); // Moteur A arrêt
  digitalWrite(in2, LOW); // Moteur A arrêt
  digitalWrite(in3, LOW); // Moteur B arrêt
  digitalWrite(in4, LOW); // Moteur B arrêt
}
void avancer () {
  digitalWrite(in1, LOW); // Moteur A marche
  digitalWrite(in2, HIGH); // Moteur A marche
  digitalWrite(in3, HIGH); // Moteur B marche
  digitalWrite(in4, LOW); // Moteur B marche
}
void tourneragauche () {
  digitalWrite(in1, HIGH); // Moteur A marche
  digitalWrite(in2, LOW); // Moteur A marche
  digitalWrite(in3, HIGH); // Moteur B arrêt
  digitalWrite(in4, LOW); // Moteur B arrêt
}
void tourneradroite () {
  digitalWrite(in1, LOW); // Moteur A arrêt
  digitalWrite(in2, HIGH); // Moteur A arrêt
  digitalWrite(in3, LOW); // Moteur B marche
  digitalWrite(in4, HIGH); // Moteur B marche
}
void reculer () {
  digitalWrite(in1, HIGH); // Moteur A marche
  digitalWrite(in2, LOW); // Moteur A marche
  digitalWrite(in3, LOW); // Moteur B marche
  digitalWrite(in4, HIGH); // Moteur B marche
}

vous appelez arret() à chaque début de loop??

--

votre loop pourrait être récrite comme cela:

void loop() {
  float distance = distanceSensor.measureDistanceCm();
  Serial.print ("Distance :"); Serial.println(distance);
  if (distance < 30 ) {
    arret();
    delay(300);
    reculer();
    delay (1000);
  }

  switch (mySerial.read()) { // retourne -1 si rien à lire
    case '0': arret();          break;
    case '1': avancer();        break;
    case '2': reculer();        break;
    case '3': tourneradroite(); break;
    case '4': tourneragauche(); break;
    case '5': arret();          break;
    default: break;
  }
}

en enlevant le arret() du début et en faisant un switch/case au lieux des if (qui auraient dû être imbriqués avec des else pour éviter des comparaisons inutiles)

se pose quand même la question de ce qu'il se passe une fois que j'ai commencé à reculer parce que la distance était faible. et si je recule, est-ce que le capteur de distance regarde bien derrière ?

image

Bonsoir,
Merci beaucoup de votre réponse rapide.

  • l'appel de "arrêt" en début de loop a été seulement ajouté hier seulement un peu comme ça, par test après un mois d'errance.
  • le programme de commande bluetooth marchait bien avant que je ne rajoute la détection de distance.
  • je note la disparition de " if (mySerial.available()"
  • pour les if, je n'avais pas réussi à utiliser switch/case.
    Je vais essayer dès ce soir votre programme. Encore merci pour votre aide.
    Cordialement.

oui - on peut demander à lire le port série et ça retourne -1 (un int) s'il n'y a rien à lire. Comme vous testez des valeurs ensuite pour faire quelque chose, si c'était -1 vous ne faites rien de toutes façons.

peut-être mon petit exemple vous montrera comment on les utilise. Sinon c'est pas mal de passer un peu de temps à suivre un cours C++ cf par exemple Structurez votre code avec les conditions - Apprenez à programmer en C++ - OpenClassrooms

Bonsoir,

Le montage fonctionne avec votre script !
J'ai juste modifié deux choses:
un arrêt après reculer:
reculer();
delay (1000);
arret() ;
}
et une instruction pour éliminer un -1 qui apparait curieusement dans la
lecture de distance : if (distance < if (distance < 30 && distance >0)

Merci beaucoup pour votre aide précieuse. Je vais pouvoir poursuivre mes
montages.
Cordialement.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.