Robot Zumo et buzzer

Bonjour,
je suis actuellement en train de programmer un robot zumo polulu afin d’y ajouter un radar de recul, un joystick ainsi qu’un buzzer, de telle façon à ce que le buzzer émette un son lorsque le robot recule et que ce dernier s’arrête en présence d’obstacle. Voici le code :

#define M2PWM 10                                         // définition de la variable M2PWM
#define M1PWM 9                                          // définition de la variable M1PWM
#define M2DIR 8                                          // définition de la variable M2DIR
#define M1DIR 7                                          // définition de la variable M1DIR

float xPin = A1;                                         // définition de la variable xPin
float yPin = A0;                                         // définition de la variable yPin

int xPosition = 0;                                       // définition de la variable xPosition
int yPosition = 0;                                       // définition de la variable yPosition

int trig = 2;
int distance;
int impulse;

int buzzer = 3;

void setup()                                             // Initialisation de la carte

{

  Serial.begin(9600);

  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);


  pinMode(M2PWM, OUTPUT);
  pinMode(M1PWM, OUTPUT);
  pinMode(M1DIR, OUTPUT);
  pinMode(M2DIR, OUTPUT);


  pinMode(buzzer,OUTPUT);

}

void loop()

{
  xPosition = analogRead(xPin);
  yPosition = analogRead(yPin);

  if ((yPosition > 500 ) && (yPosition < 510) && (xPosition > 230 ) && (xPosition < 295))           //Avance

  {

    analogWrite (M1PWM, 150);
    analogWrite (M2PWM, 150);
    digitalWrite (M1DIR, LOW);                            // variable M1DIR à l'état logique bas ( LOW ) = 0
    digitalWrite (M2DIR, LOW);                            // variable M2DIR à l'état logique bas ( LOW ) = 0
    Serial.print(" Avancer ");

  }

  else if ((yPosition > 490 ) && (yPosition < 530) && (xPosition > 770 ) && (xPosition < 790))       //Recule

  {

    analogWrite (M1PWM, 100);
    analogWrite (M2PWM, 100);
    digitalWrite (M1DIR, HIGH);                           // Variable M1DIR à l'état logique haut ( HIGH ) = 1
    digitalWrite (M2DIR, HIGH);                           // variable M2DIR à l'état logique haut ( HIGH ) = 1
    Serial.print("Reculer");

    pinMode (trig, OUTPUT); // on met la broche 2 en sortie
    digitalWrite (trig, HIGH); // on envoie une impulsion
    delayMicroseconds (5); // on attend 5 µs
    digitalWrite (trig, LOW); // on désactive l'impulsion

    pinMode (trig, INPUT); // on met la broche 2 en sortie

    impulse == pulseIn (trig, HIGH); // on lit impulse en fonction de trig
    distance == (impulse/1000000*100*170); //on calcule la distance
    Serial.println (distance); // on affiche la distance dans le moniteur série

    digitalWrite(buzzer, LOW); // état bas
    delay(500); //on attend p milli-secondes
    digitalWrite(buzzer, HIGH); //état haut
    delayMicroseconds(500); // on attend p millisecondes


  }
}

Mon problème est : lorsque le robot recule, je ne souhaite pas que le buzzer émette un son continu. De ce fait, j’ai utilisé delay(500). Sauf que ce delay s’applique aussi aux mouvements du robot. Du coup celui-ci aussi s’arrête pendant 0.5 secondes, et je cherche un moyen de stopper le son du buzzer indépendemment du robot, tout en restant dans la boucle de recul (je ne sais pas trop si c’est clair).

Merci d’avance pour votre aide !

C'est typiquement le problème que tout le monde rencontre lorsqu'on veut faire plusieurs choses en même temps : ne pas utiliser delay. Toi tu veux mesurer une distance, contrôler tes moteurs, vérifier s'il faut émettre un son ou non.

Il faut te renseigner sur les moyens de faire un code non bloquant. Il y a plein de tutos sur le forum (en French ou en Anglais), ou sur les machines à états.

Sur ce dernier point, J-M-L a fait un bon tuto, et il existe des bibliothèques pour gérer ça (Google : "arduino multitasking library" par exemple). Mais il faut apprendre à s'en servir, ce n'est pas forcément immédiat (d'où le tuto...)

Bonjour !

Merci pour la réponse ! en bidouillant 2-3 trucs j'ai réussi à débloquer le problème, mais maintenant j'en ai un autre (qui était là d'ailleurs avant)...

En fait le capteur que j'utilise (HC-SR04) ne détecte aucune distance, et ce même en utilisant un code trouvé sur internet. J'ai utilisé la commande serial.println pour afficher dans le moniteur série, mais cela me donne toujours 0.

(c'est le même qui est utilisé au-dessus, je n'ai pas touché les lignes concernant le capteur)

Si ça marchait avant tes modifications et que ça ne marche plus maintenant, c'est que le problème vient de ces modifications. On ne peut donc rien faire sur l'ancien code, poste la dernière version...

Non justement ça ne marchait pas non plus avant mais j'en profite pour demander aussi pour ça

Je te conseille alors de séparer les problèmes :

Fais d'abord un code simple qui utilise le capteur US et calcule la distance. Il y a pléthore de tutos sur Internet dans toutes les langues.

Une fois que ça marche, tu mets les lignes de code qui font ce calcul de distance (l'ensemble : envoi du signal US, réception, calcul de distance) dans une fonction : par exemple

int calculDistanceUS () {
// tes lignes ici
}

et tu t’attaques à l'autre problème, plus complexe.

D'une manière générale, essaye de découper ton code en fonctions unitaires, plus simples à coder et faire fonctionner, que tu appelles dans ta loop. Lorsque chaque fonction marche, il te reste à les mettre en oeuvre selon l'algorithme de ton robot.

Mais lis le tuto que je t'ai indiqué pour comprendre comment faire ce bip tout en pilotant le robot et mesurant la distance.

Pour gerer un timing sans bloquer le programme j'utilise millis() associé a un long int qui stocke le dernier moment ou j'ai fait l'action + quelques flags booleens. Ca me permet de gerer des timeout sur d'autres cartes branchées en serie, gerer un defilement d'info sur mon LCD et emettre des signaux sonores et lumineux en meme temps (tout en laissant la carte faire son boulot principal).
Faut juste etre bien ordonné et nommer tes variables de façon explicite pour ne pas t'y perdre.