Capteur ultrason HC-SR04 1 ou 2 PIN ?

Bonjour

Je souhaite utiliser un capteur ultrason HC-SR04 1.

J'ai ce code dans lequel il est dit que l'on utilise le même pin pour l'émission ET la réception de l'écho des ultrasons.

Ma question concerne le câblage sur la carte .
sur les liens du net, je ne trouve que des exemples avec 2 pin.
Aucun avec un seul.
pouvez-vous me dire comment le câbler ?

Merci

// constants

// set pin numbers:

const int pingPin = 7; // le pin d'émission des ultrasons

const int buttonPin1 = 2;     // the number of the pushbutton pin  le numero du pin du bouton  commande automatique(presse-bouton)

const int buttonPin2 = 4;

const int motor =  3;      // the number of the motor pin    le numero du pin du moteur

const int motor2 = 11;

+++++
++++
++++


void loop() {

  // establish variables for duration of the ping,

  // and the distance result in inches and centimeters:

  long duration, inches, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  //Le PING))) est déclenché par une HAUTE impulsion de 2 ou plusieurs micro-secondes.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  //Donnez une impulsion BASSE courte à l'avance pour assurer une HAUTE impulsion propre
  pinMode(pingPin, OUTPUT);

  digitalWrite(pingPin, LOW);

  delayMicroseconds(2);

  digitalWrite(pingPin, HIGH);

  delayMicroseconds(5);

  digitalWrite(pingPin, LOW);



  /* The same pin is used to read the signal from the PING))): a HIGH
    pulse whose duration is the time (in microseconds) from the sending
    of the ping to the reception of its echo off of an object.


    la même épingle est utilisée pour lire le signal du PING))) : UN HAUT
    pulse dont la durée est le temps (en micro-secondes) de l'envoi
    Du Ping à la réception de son écho d'un objet.
  */

  pinMode(pingPin, INPUT);

  duration = pulseIn(pingPin, HIGH);



  // convert the time into a distance

  inches = microsecondsToInches(duration);

  cm = microsecondsToCentimeters(duration);

  // read the state of the pushbutton value:

  buttonState1 = digitalRead(buttonPin1);

  buttonState = digitalRead(buttonPin2);

  if (cm <= 15) {

    //digitalWrite(motor, LOW);

    digitalWrite(motor2, LOW);

  }

  else {

    //digitalWrite(motor, HIGH);

    digitalWrite(motor2, HIGH);

    button();

  }

  delay(100);





}

Montage ultrasons.jpg

Postez un lien vers votre module... lisez le post sur comment utiliser le forum

Je n'ai jamais vu de capteur ultrasons dans lequel on utilise la même broche pour l'émission et la réception. Poste un lien vers le site où tu as vu ça...

Si si ça existe (il y a même de la doc qui va bien)

Je pense que l’OP a un gros poil dans la main ou ne lit pas l’anglais....

J-M-L:
Je pense que l’OP a un gros poil dans la main ou ne lit pas l’anglais....

Bonjour l'OP c'est moi ? :slight_smile:

Je débute arduino et j'essaie d'aider ma fille du mieux que je peux (même en anglais)

Je vais donc modifier mon code et je reviens vers vous

voici donc le code original

/*
moteur et bouton en coté opposé

  This code corresponds to a floating boat with rudimentary sensing capabilities -

  step by step instructions and images are at levinegabriella.com/teaching

  It includes an parallax ultrasonic rangefinder :  see data sheet

  http://www.arduino.cc/en/Tutorial/Ping

  which allows the boat to turn away from obstacles ahead.

  It also includes two reed switches so if it hits barriers from the side, it

  turns around away from the wall

 *****
  Ce code correspond à  un bateau flottant aux capacités de sentiment rudimentaires -

  Pas à  pas les instructions et les images sont à  levinegabriella.com/teaching

  Il inclut une parallaxe le télémètre ultrasonique: voir la fiche technique

  Http://www.arduino.cc/en/Tutorial/Ping

  Ce qui permet au bateau de se détourner d'obstacles en avant.

  Il inclut aussi deux échanges de roseau donc s'il frappe des barrières du côté, cela

  Se retourne loin du mur

  created 2011 by gabriella levine

*/



// constants

// set pin numbers:

const int pingPin = 7;

const int buttonPin1 = 2;     // the number of the pushbutton pin  le numero du pin du bouton  commande automatique(presse-bouton)

const int buttonPin2 = 4;

const int motor =  3;      // the number of the motor pin    le numero du pin du moteur

const int motor2 = 11;



// variables

int buttonState = 0;         // variable for reading the pushbutton status     variable pour lire le statut à  commande automatique

int buttonState1  = 0;

void setup() {

  //begin serial

  Serial.begin(9600);

  // initialize the motors  as output:

  pinMode(motor, OUTPUT);

  pinMode(motor2, OUTPUT);

  // initialize the pushbutton pins as  input:

  pinMode(buttonPin1, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance

  pinMode(buttonPin2, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance

}



void loop() {

  // establish variables for duration of the ping,

  // and the distance result in inches and centimeters:

  long duration, inches, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  //Le PING))) est déclenché par une HAUTE impulsion de 2 ou plusieurs micro-secondes.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  //Donnez une impulsion BASSE courte à  l'avance pour assurer une HAUTE impulsion propre
  pinMode(pingPin, OUTPUT);

  digitalWrite(pingPin, LOW);

  delayMicroseconds(2);

  digitalWrite(pingPin, HIGH);

  delayMicroseconds(5);

  digitalWrite(pingPin, LOW);



  /* The same pin is used to read the signal from the PING))): a HIGH
    pulse whose duration is the time (in microseconds) from the sending
    of the ping to the reception of its echo off of an object.


    la même épingle est utilisée pour lire le signal du PING))) : UN HAUT
    pulse dont la durée est le temps (en micro-secondes) de l'envoi
    Du Ping à  la réception de son écho d'un objet.
  */

  pinMode(pingPin, INPUT);

  duration = pulseIn(pingPin, HIGH);



  // convert the time into a distance

  inches = microsecondsToInches(duration);

  cm = microsecondsToCentimeters(duration);

  // read the state of the pushbutton value:

  buttonState1 = digitalRead(buttonPin1);

  buttonState = digitalRead(buttonPin2);

  if (cm <= 15) {

    //digitalWrite(motor, LOW);

    digitalWrite(motor2, LOW);

  }

  else {

    //digitalWrite(motor, HIGH);

    digitalWrite(motor2, HIGH);

    button();

  }

  delay(100);





}

void button() {

  // check if the pushbutton is pressed.

  // if it is, the buttonState is HIGH:

  if (buttonState1 == HIGH) {

    // turn LED on:

    digitalWrite(motor, LOW);

  }

  else {

    // turn LED off:

    digitalWrite(motor, HIGH);

  }

  if (buttonState == HIGH) {

    // turn LED on:

    digitalWrite(motor2, LOW);

  }

  else {

    // turn LED off:

    digitalWrite(motor2, HIGH);

  }

}

long microsecondsToInches(long microseconds)

{
  /*
    According to Parallax's datasheet for the PING))), there are
    73.746 microseconds per inch (i.e. sound travels at 1130 feet per
    second).  This gives the distance travelled by the ping, outbound
    and return, so we divide by 2 to get the distance of the obstacle.

    Selon la fiche technique de la Parallaxe pour le PING))), il y a
    73.746 micro-secondes par pouce (c'est-à -dire le son voyage à  1130 pieds par seconde)(1 pied = 30.48 cm).
    Ceci donne la distance voyagée par le Ping, pour l'aller retour
    Donc nous nous divisons par 2 pour obtenir la distance de l'obstacle.
     See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  */
  return microseconds / 74 / 2;

}



long microsecondsToCentimeters(long microseconds)

{

  /*
    The speed of sound is 340 m/s or 29 microseconds per centimeter.
    The ping travels out and back, so to find the distance of the
    object we take half of the distance travelled.

    La vitesse du son est 340 m/s ou 29 micro-secondes par centimètre.
    Le tintement voyage d'et en arrière, ainsi trouver la distance de le
    L'objet nous prenons la moitié de la distance a voyagé.
  */
  return microseconds / 29 / 2;

}

le code modifié suit dans le msg suivant

Et les modif

/*
  moteur et bouton en coté opposé
  This code corresponds to a floating boat with rudimentary sensing capabilities -
  step by step instructions and images are at levinegabriella.com/teaching
  It includes an parallax ultrasonic rangefinder :  see data sheet
  http://www.arduino.cc/en/Tutorial/Ping
  which allows the boat to turn away from obstacles ahead.
  It also includes two reed switches so if it hits barriers from the side, it
  turns around away from the wall
*****
  Ce code correspond à  un bateau flottant aux capacités de sentiment rudimentaires -
  Pas à  pas les instructions et les images sont à  levinegabriella.com/teaching
  Il inclut une parallaxe le télémètre ultrasonique: voir la fiche technique
  Http://www.arduino.cc/en/Tutorial/Ping
  Ce qui permet au bateau de se détourner d'obstacles en avant.
  Il inclut aussi deux échanges de roseau donc s'il frappe des barrières du côté, cela
  Se retourne loin du mur
  created 2011 by gabriella levine
*/


// constants
// set pin numbers:
const int pingPin = 7;
const int buttonPin1 = 2;     // the number of the pushbutton pin  le numero du pin du bouton  commande automatique(presse-bouton)
const int buttonPin2 = 4;
const int motor =  3;      // the number of the motor pin    le numero du pin du moteur
const int motor2 = 11;

// les 2 pin ultrason
#define echoPin 7 // broche Echo 
#define trigPin 8 // broche Trigger (declenchement)


// variables
int buttonState = 0;    // variable pour lire le statut des boutons poussoirs
int buttonState1 = 0;

void setup() {
  //begin serial
  Serial.begin(9600);

  // initialize the motors  as output:
  pinMode(motor, OUTPUT);
  pinMode(motor2, OUTPUT);

  // Activer les broches ultrason
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // initialize the pushbutton pins as  input:
  pinMode(buttonPin1, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance
  pinMode(buttonPin2, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance

}



void loop() {
  // establish variables for duration of the ping,
  // and the distance result in centimeters:

  long distance, duration, cm; // Durée utilisée pour calculer la distance

  // Envoi une impulsion de 10 micro secondes sur la broche "trigger"
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Attend que la broche Echo passe au niveau HAUT et retourne la durée
  duration = pulseIn(echoPin, HIGH);

  //Calculer la distance (en cm, basé sur la vitesse du son).
  distance = duration / 58.2;
  cm = distance;

  // read the state of the pushbutton value:
  buttonState1 = digitalRead(buttonPin1);
  buttonState = digitalRead(buttonPin2);

  if (cm <= 15) {
    //digitalWrite(motor, LOW);
    digitalWrite(motor2, LOW);
  }
  else {
    //digitalWrite(motor, HIGH);
    digitalWrite(motor2, HIGH);
    button();
  }
  delay(100);
}

void button() {
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:

  if (buttonState1 == HIGH) {
    digitalWrite(motor, LOW);
  }
  else {
    digitalWrite(motor, HIGH);
  }

  if (buttonState == HIGH) {
    digitalWrite(motor2, LOW);
  }
  else {
    digitalWrite(motor2, HIGH);
  }
}



long microsecondsToCentimeters(long microseconds)

{
   return microseconds / 29 / 2;
}

Je ne peux rien testé car je n'ai pas encore reçu le matériel entièrement.
Pourriez-vous me dire s'il est bon ?

Merci

Ps le code utilisé pour modification viens d'ici

/* Senseur de distance Ultrason HC-SR04:
  VCC sur Arduino 5v
  GND sur Arduino GND
  Echo sur Arduino broche 7
  Trig sur Arduino broche 8

  Ce sketch/croquis est originaire de Virtualmix: http://goo.gl/kJ8Gl
  Il a été modifié par Winkle ink ici:
   http://winkleink.blogspot.com.au/2012/05/arduino-hc-sr04-ultrasonic-distance.html
  Puis modifié par ScottC le 10 Nov 2012:
   http://arduinobasics.blogspot.com/
  Finalement traduit par MCHobby.be pour le tutoriel:
   http://wiki.mchobby.be/index.php?title=HC-SR04
*/

Plop
Je comprends pas, il y a deux pins pour ton HCSR04 dans le code

// les 2 pin ultrason
#define echoPin 7 // broche Echo
#define trigPin 8 // broche Trigger (declenchement)

Tu voulais tester avec un seul?

Les codes d'exemple ne marchent pas chez moi (mais c'est pas étonnant).
pour pouvoir faire ça, il faut changer le pin de INPUT en OUTUT, mais ça se fait dans le setup, ça , non?
SI on peut le faire par une fonction, ça devrait marcher, mais est-ce possible?

Il est hors de prix de ping)))

En fait, j'ai pris un premier code pour faire la maquette de base pour ma fille.
Je pensais que le code était pour un ultrason normal ( pin trigger et pin Echo)
en lisant mieux le code, je me suis aperçu qu'il n 'y avait qu'un pin pour les deux, alors que tous les exemples que j'ai vu sur le net avaient 2 pin.

Du coup, je vous ai posé ma question .... et j'ai bien fait, car avec la sonde HC-SR04, il me faut bien 2 pin.Et c'est cette sonde que j'ai commandée.

Et donc je cherche simplement à faire fonctionner la maquette, et j'ai cherché un code normal pour modifier le code avec 1 seul pin.
Le lien de J-M-L me donne une sonde à 20€ alors que l'autre est à moins de 2€ .. et que je l'ai
.

C'est pour cela que j'essaie de modifier ce code.
Comme cela la partie code étant validée, on s'occupera de la maquette physique tranquillement

Désolé, j'ai raté le début et je ne peux plus compiler, mais si dans son code tu as
pinMode(pingPin, INPUT);
dans la loop, tu devrais pouvoir faire le même dans ton code avec un module standard, non? Tu as essayé j'imagine?
Je ne pensais pas pouvoir passer d'un pinMode INPUT OUTPUT en dehors du setup. Il faut tenir compte du temps mis par le pin pour passer de l'un à l'autre, si ça fonctionne le ping))) est un HC-SR04 avec deux pins en commun... bonne nouvelle ^^

donc vous avez un commandé un capteur avec 2 pins séparées? (le prix on s'en fiche, ce sont les mêmes trucs, certains font plus de marges que les petits chinois (et ont des taxes en plus))

Oui
C'est celui là
est je cherche à le faire fonctionner

Z197.jpg

J-M-L:
donc vous avez un commandé un capteur avec 2 pins séparées? (le prix on s'en fiche, ce sont les mêmes trucs, certains font plus de marges que les petits chinois (et ont des taxes en plus))

J'essaie de commander un HC-SR04 en mettant trig et echo sur un même pin, en le changeant en OUTPUT puis en INPUT, mais ça ne marche pas...

Ne t'embêtes pas.

Je cherche juste à faire fonctionner mon ultrason avec 2 pin .
L'important c'est que la maquette fonctionne.

s'il y a une pin pour TRIG et une pin de signal, tous les codes postés sur internet vont fonctionner...

regardez la librairie newPing elle va vous simplifier la vie

ah bah ca va fonctionner, ton code marche

Depuis le début de ce post j 'ai testé plusieurs choses.
Tu me confirmes que c'est ce code qui fonctionne ?

Ça c'est pour le bateau version 0.

Je n'ai plus qu'à aller modifier mon autre code

/*
  moteur et bouton en coté opposé
  This code corresponds to a floating boat with rudimentary sensing capabilities -
  step by step instructions and images are at levinegabriella.com/teaching
  It includes an parallax ultrasonic rangefinder :  see data sheet
  http://www.arduino.cc/en/Tutorial/Ping
  which allows the boat to turn away from obstacles ahead.
  It also includes two reed switches so if it hits barriers from the side, it
  turns around away from the wall
*****
  Ce code correspond à un bateau flottant aux capacités de sentiment rudimentaires -
  Pas à pas les instructions et les images sont à levinegabriella.com/teaching
  Il inclut une parallaxe le télémètre ultrasonique: voir la fiche technique
  Http://www.arduino.cc/en/Tutorial/Ping
  Ce qui permet au bateau de se détourner d'obstacles en avant.
  Il inclut aussi deux échanges de roseau donc s'il frappe des barrières du côté, cela
  Se retourne loin du mur
  created 2011 by gabriella levine
*/


// constants
// set pin numbers:
const int pingPin = 7;
const int buttonPin1 = 2;     // the number of the pushbutton pin  le numero du pin du bouton  commande automatique(presse-bouton)
const int buttonPin2 = 4;
const int motor =  3;      // the number of the motor pin    le numero du pin du moteur
const int motor2 = 11;

// les 2 pin ultrason
#define echoPin 7 // broche Echo 
#define trigPin 8 // broche Trigger (declenchement)


// variables
int buttonState = 0;    // variable pour lire le statut des boutons poussoirs
int buttonState1 = 0;

void setup() {
  //begin serial
  Serial.begin(9600);

  // initialize the motors  as output:
  pinMode(motor, OUTPUT);
  pinMode(motor2, OUTPUT);

  // Activer les broches ultrason
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // initialize the pushbutton pins as  input:
  pinMode(buttonPin1, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance
  pinMode(buttonPin2, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance

}



void loop() {
  // establish variables for duration of the ping,
  // and the distance result in centimeters:

  long distance, duration, cm; // Durée utilisée pour calculer la distance

  // Envoi une impulsion de 10 micro secondes sur la broche "trigger"
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Attend que la broche Echo passe au niveau HAUT et retourne la durée
  duration = pulseIn(echoPin, HIGH);

  //Calculer la distance (en cm, basé sur la vitesse du son).
  distance = duration / 58.2;
  cm = distance;

  // read the state of the pushbutton value:
  buttonState1 = digitalRead(buttonPin1);
  buttonState = digitalRead(buttonPin2);

  if (cm <= 15) {
    //digitalWrite(motor, LOW);
    digitalWrite(motor2, LOW);
  }
  else {
    //digitalWrite(motor, HIGH);
    digitalWrite(motor2, HIGH);
    button();
  }
  delay(100);
}

void button() {
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:

  if (buttonState1 == HIGH) {
    digitalWrite(motor, LOW);
  }
  else {
    digitalWrite(motor, HIGH);
  }

  if (buttonState == HIGH) {
    digitalWrite(motor2, LOW);
  }
  else {
    digitalWrite(motor2, HIGH);
  }
}



long microsecondsToCentimeters(long microseconds)

{
   return microseconds / 29 / 2;
}

Comme le dit J-M-L, avec un pin trig et un pin echo, ça marchera, c'est fait pour.
Je pensais que tu voulais gagner un pin...

N'empêche, mettre trig et echo sur un seul pin avec un HCSR04, ça ne marche pas.
je peux pas aller plus loin avec ce dont je dispose, mais je me demande bien ce qu'a le trig))) que n'a pas le HCSR04.
Je chercherai quand mon pc marchera normalement...

N'empêche, mettre trig et echo sur un seul pin avec un HCSR04, ça ne marche pas.

Arrête d'affirmer s'il te plaît, tout dépend du matériel réellement utilisé.

Il faut bien avoir conscience que le monde des modules "dits" pour arduino est un foutoir complet.
Sous la même référence on trouve des modèles différents et le cas du HC-SR04 est un cas d'école.

Les premiers modèles avaient deux pins : trigger et echo.
Dans un HC-SRO4 il y a un petit micro qui fait la gestion donc tout est possible.

Un concurrent a eu l'idée de supprimer une des deux pin pour gagner quelques fractions de centime. Rien de plus simple à faire il suffit de placer la pin en entrée en attente du signal trigger et immédiatement ce signal reçu de la placer en sortie pour envoyer l'impulsion de longueur variable.

Et maintenant c'est le foutoir, c'était un module simple à utiliser où il n'y avait rien à expliquer et bien maintenant "il faut " une bibliothèque pour gérer le bor*el.

D'un autre coté la bibliothèque c'est un peu un marteau pilon pour enfoncer un clou : la seule modif à faire est au niveau de la carte arduino de "retourner" le mode de la pin unique en la passant du mode sortie dès que l'impulsion de "trigger" à été envoyé au mode entrée qui va lui permettre de recevoir l'impulsion de longueur proportionnelle à la distance.