[résolu] Arduino Robot Ultrason Moteur et son dans le HP

Bonjour,
une journée (pluvieuse) à expérimenter sans succès :slight_smile:
Je suis sur le projet d'un petit robot mobile avec deux moteurs, une arduino, une carte L293D, un capteur ultrason et un haut-parleur.
Le programme fonctionne mais je bloque sur le son.... Impossible de déclencher du son sans bloquer les moteurs... J'ai essayé X solutions mais rien n'y fait.... L'idée serait lorsque le robot recule et tourne de générer un son. Ce serait génial s'il était du type du bruit fait par les engins de chantier, mais un son simple dans mon HP serait déjà pas trop mal. Si vous avez une idée à me soumettre :slight_smile:
Bien cordialement
PS: le HP est sur la sortie 2, la 13 étant un laser monté sur le servomoteur

#include <Servo.h>
#include <Ultrasonic.h>
# define trigger A4
# define eccho A5


#include <AFMotor.h>
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
Servo servo1;

 
void setup()
{
  servo1.attach(9);  
  motor1.setSpeed(100);
  motor2.setSpeed(100);
  pinMode(trigger,OUTPUT);
  pinMode(eccho,INPUT);
  pinMode(13,OUTPUT);
 
}


void loop()
{
  long lecture_eccho;
  long distance;
  
  digitalWrite(trigger,HIGH); //debut de la salve du trigger
  delayMicroseconds(10);
  digitalWrite(trigger,LOW);  // arret de la salve du trigger
  lecture_eccho=pulseIn(eccho,HIGH);  //lecture de la durée du signal émis par la broche eccho
  distance=lecture_eccho/58;         // Conversion de cette durée en centimètre
  
  
  if(distance < 5.0)   //si obstacle proche on recule
  {
  motor2.run(BACKWARD);
  motor1.run(BACKWARD);  
  digitalWrite(13,1);
  servo1.write(0);
  // ICI LE SON 1
    }
  
  if(distance > 5.0 && distance < 10.0) //si obstacle moyennement éloigné on tourne
  {
  servo1.write(180);
  digitalWrite(13,1);
  digitalWrite(buzzer,HIGH);// Faire du bruit
  motor2.run(FORWARD);
  motor1.run(BACKWARD);
  // ICI LE SON 2
  }
  
  if(distance > 15.0)                //si obstacle éloigné on fonce droit devant
  {  
  digitalWrite(13,0);
  servo1.write(90);
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  // ICI LE SON 3
  }
  
    
 // delay(500); //Délais pour ne pas surcharger le terminal
  
}

bonjour,
regardes ICI

Bonsoir,merci pour ta réponse, c'est sympa :slight_smile:
J'ai déjà essayé l'instruction tone() mais impossible de la combiner avec la rotation des moteurs....

si tu mettais le code avec tone

merci pour ton aide :slight_smile:

voici le code. Lorsque tone est activé, le bruit est parfait mais les moteurs sont coupés...
Si tu as une idée à me soumettre .... Merci d'avance :slight_smile:

#include <Servo.h>
#include <Ultrasonic.h>
# define trigger A0
# define eccho A1


#include <AFMotor.h>
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
Servo servo1;

 
void setup()
{
  Serial.begin(9600);
  servo1.attach(9);  
  motor1.setSpeed(100);
  motor2.setSpeed(100);
  pinMode(trigger,OUTPUT);
  pinMode(eccho,INPUT);
  pinMode(13,OUTPUT);
 
}


void loop()
{
  long lecture_eccho;
  long distance;
  
  digitalWrite(trigger,HIGH); //debut de la salve du trigger
  delayMicroseconds(10);
  digitalWrite(trigger,LOW);  // arret de la salve du trigger
  lecture_eccho=pulseIn(eccho,HIGH);  //lecture de la durée du signal émis par la broche eccho
  distance=lecture_eccho/58;         // Conversion de cette durée en centimètre
  Serial.println(distance); 
 
  
  if(distance < 5.0)   //si obstacle proche
  {
  
 

  motor2.run(BACKWARD);
  motor1.run(BACKWARD);
  
  digitalWrite(13,1);
  servo1.write(0);
  tone(2,150,100);
  delay(350);
  noTone(2);
    }
  
  if(distance > 5.0 && distance < 10.0) //si obstacle moyennement éloigné
  {
  servo1.write(180);
  digitalWrite(13,1);
  motor2.run(FORWARD);
  motor1.run(BACKWARD);
  
  }
  
  if(distance > 15.0)                //si obstacle éloigné
  {
  
  digitalWrite(13,0);
  servo1.write(90);
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  }
  
    
 // delay(500); //Délai pour ne pas surcharger le terminal
  
}
  tone(2,150,100);
  delay(350);

delay =>> bloquant, donc normal à mon avis

vires les delay et ca ne devrait plus bloquer

Quelle est l'impédance du HP ?

Bonjour,
l'impédance est de 8 ohms c'est un 0.5W (recup PC).
J'ai viré le delay

if(distance < 5.0)   //si obstacle proche
  {
  
 

  motor2.run(BACKWARD);
  motor1.run(BACKWARD);
  
  digitalWrite(13,1);
  servo1.write(0);
  tone(2,150,100);
  //delay(350);
  noTone(2);
    }

C'est idem (les roues ne tournent plus) sauf le son qui est tout gresilleux :slight_smile:
Si vous avez une idée :slight_smile:
Bien cordialement

manque d'alim entre servo, moteur, carte.
schéma ou photo
type d'alim

pvkp:
Bonjour,
le HP est sur la sortie 2 ...
l'impédance est de 8 ohms c'est un 0.5W (recup PC).

Et ça fait combien d'ampères sous 5 V ?
Combien supporte une sortie de votre arduino en courant ?

merci pour vos idées :slight_smile:
D'aprés ce que vous m'avez dit concernant l'intensité, je pense avoir trouvé une piste

je teste demain et je vous dis :slight_smile:

pas compliqué de voir si c'est le hp qui pose pb.
tu mets une led à la place.

je viens de monter une del, effectivement elle clignote mais ne plante pas les moteurs... Je vais tenter de passer par un transistor

Bonsoir,
après toutes manipulations pas possibles (j'ai même failli griller mon pc) l'instruction tone() fait planter les moteurs de la L293D....
Impossible à mon niveau de trouver pourquoi, je capitule.... :slight_smile:

c'est pas tone qui bloque les moteurs, mais la conso du hp.
comment tu as fait pour presque griller ton pc?

si tu as un buzzer, essaye, ca consomme moins.

j'ai essayé mais c'est l'instruction tone() qui plante tout.... Même sans rien connecter sur la sortie 2, si je lance tone (2,...,...); paf, y a plus rien au niveau des moteurs.... C'est complètement illogique.....

Tu n'utilises pas assez les états pour valider une action qui n'a pas besoin d'être relancée à chaque boucle loop().

Par exemple

boolean recule=0; // dans l'initialisation

if((distance < 5.0 )&! recule)   //si obstacle proche on recule
  {
motor2.run(BACKWARD);
  motor1.run(BACKWARD);  
  digitalWrite(13,1);
  servo1.write(0);
  recule=1
  // ICI LE SON 1
    }

Variable que tu remets à 0 dans les autres actions moteur.
C'est peut-être un conflit entre les librairies, mais ça m'étonnerait.

Bonjour,

Issu de la doc de tone:

"Use of the tone() function will interfere with PWM output on pins 3 and 11"

Quels sorties PWM utilises-tu pour tes moteurs ?

Bonjour,
merci pour ces précieuses infos....
D'aprés la notice les moteur 1 et 2

#define MOTOR1_PWM 11
#define MOTOR2_PWM 3

utilisent les sorties 11 et 3....

Merci, je vais tester sur les moteurs 3 et 4!

Franchement c'est vraiment compliqué de le savoir si on ne lit pas la notice à fond :slight_smile:

Merci encore, je teste et je fais un retour :slight_smile:
Bien cordialement

Bonsoir,
un grand merci à tous!
Je viens de passer sur les moteur 3 et 4 et l'instruction tone() fonctionne parfaitement.
Bref ça me servira de leçon, la prochaine fois je commencerai par lire la notice :slight_smile:
Merci encore le problème est résolu et j'avoue que j'aurai capitulé sans votre aide :slight_smile:
Bien cordialement