Diminution de la fréquence d'execution

Bonjour,

je cherche à faire en sorte qu’une partie du loop s’execute moins souvent. A l’heure actuelle elle s’exécute toutes les 2ms (mesuré avec micros() ) environ et je voudrais pouvoir contrôler ceci.

Il s’agit de la construction d’un Pipo électronique qui associe un son de fréquence donnée par la distance entre le bloc E/R et l’obstacle.

Comme la détermination de la durée (measure) se fait trop souvent, la fréquence n’a pas le temps d’être jouée avant qu’une autre valeur soit prise en compte, par conséquent je me retrouve avec un son du type “parasite de radio qui ne capte pas”.

Donc en gros je cherche à savoir comment faire pour :

  • Execution tous les X ms du “1. Mesure le temps entre l’envoi…”
  • Execution continue du “/* 2. Détermination de la fréquence…” (donc pas de delay())

Je sais aussi par avance que delayMicroseconds(10) devra être remplacé.

  /* Constantes pour les broches */
const byte TRIGGER_PIN = 10; // Broche TRIGGER
const byte ECHO_PIN = 9;    // Broche ECHO
const byte BUZZER = 2;

void setup() {
  /* Initialise les broches */
  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER, OUTPUT);
}

void loop() {
  /* 1. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho en microsecondes */
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long measure = pulseIn(ECHO_PIN, HIGH);

  /* 2. Détermination de la fréquence correspondante au quart de la longueur d'onde */
  float frequence = 500000 / measure;
  tone(BUZZER, frequence);
}

NB : je suis enseignant et cela apparaît au programme, je tente de m’adapter, j’ai beaucoup de lacunes mais aussi de bonne volonté.

j’ai tenté ça, qui correspond à moins d’échantillonnage de la distance pour un son plus constant sans interruption (avec discontinuité cependant)

/* Constantes pour les broches */
const byte TRIGGER_PIN = 10; // Broche TRIGGER
const byte ECHO_PIN = 9;    // Broche ECHO
const byte BUZZER = 2;
float freq;
int x;

void setup() {
  /* Initialise les broches */
  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); 
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER, OUTPUT);

}

void loop() {
  for (x = 0; x <= 200; x ++)
  {
    if (x < 1) {
      digitalWrite(TRIGGER_PIN, HIGH);
      delayMicroseconds(10);
      digitalWrite(TRIGGER_PIN, LOW);
      long measure = pulseIn(ECHO_PIN, HIGH);

      float frequence = 500000 / measure;
      freq = frequence;
      tone(BUZZER, frequence);

    }
    if (x >= 1 && x < 200) {     
      tone(BUZZER, freq);
    }
  }
}

all is good

désolé pour le dérangement, juste que c'est mon capteur qui ne donne pas de réponse tout le temps, d'où mes coupures de son, certaines boucles avaient des fréquences non calculables du coup.

donc le code suivant me va très bien

/* Constantes pour les broches */
const byte TRIGGER_PIN = 10; // Broche TRIGGER
const byte ECHO_PIN = 9;    // Broche ECHO
const byte BUZZER = 2;
float freq;
int x;

void setup() {
  /* Initialise les broches */
  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); 
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER, OUTPUT);

}

void loop() {

      digitalWrite(TRIGGER_PIN, HIGH);
      delayMicroseconds(10);
      digitalWrite(TRIGGER_PIN, LOW);
      long measure = pulseIn(ECHO_PIN, HIGH);

      float frequence = 500000 / measure;

      tone(BUZZER, frequence);
delay(250);
}

Bonjour JackRomu

JackRomu: je cherche à faire en sorte qu'une partie du loop s'execute moins souvent. A l'heure actuelle elle s'exécute toutes les 2ms (mesuré avec micros() ) environ et je voudrais pouvoir contrôler ceci.

Pourquoi ne se rendre indépendant de Loop() et de sa vitesse plus ou moins rapide de "rotation" et d'installer une bibliothèque comme Timer1 et ainsi avoir une fréquence d'exécution "indépendante".

Cordialement jpbbricole