ARDUINO
LE BIPEUR PIEZO-ELECTRIQUE

Introduction

Le bipeur ou buzzer (anglicisme) piézo-électrique s'emploie généralement en sortie. Il produit un son lorsqu'il est alimenté en courant alternatif. Il est parfois détourné de sa fonction première pour être utilisé en entrée. Il permet alors de capter un choc, un son, une vibration ou une action mécanique. Les fréquences audibles pour un humain varient grosso modo de 20 Hz pour les sons graves à 20 kHz pour les sons aigus.

Emission de sons

Schéma de câblage

Le câblage est très simple!

Son interrompu et répétitif

Le programme suivant engendre un son de fréquence 4000 Hz, d'une durée d'une seconde, répété toutes les secondes.

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  tone(2, 4000);
  delay(1000);
  noTone(2);
  delay(1000);
}

Le programme ci-dessous donne le même résultat, avec deux lignes de code en moins.

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  tone(2, 4000, 1000);
  delay(2000);
}

Variation de la hauteur du son

La musique comporte des dièses, bémols, des croches, des soupirs... Il est possible de programmer tout cela, mais le but ici est de tester un exemple simple.

void setup() {
 pinMode(2, OUTPUT);
}

void loop() {
 tone(2, 3520);
 delay(300);
 tone(2, 4186);
 delay(300);
 tone(2, 4698);
 delay(600);
}

Le programme ci-dessous réalise une sirène en appliquant au bipeur un signal avec une variation sinusoïdale de la fréquence.

int fm=3500; // Fréquence sonore minimale, en Hz
int fM=5500; // Fréquence sonore maximale, en Hz
int T=1500;  // Période, en ms
int t=0;     // Temps qui passe, en ms
int dt=30;   // Intervalle de temps, en ms

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  tone(2, ((fM-fm)*sin(2*PI*t/T)+fM+fm)/2);
  delay(dt);
  t=t+dt;
}

Variation du niveau sonore

La fonction digitalWrite() permet de générer un signal de rapport cyclique variable, contrairement à la fonction tone(). Il est ainsi possible de baisser l'intensité sonore. Par contre, pour de complexes raisons, la sonorité varie avec le rapport cyclique :

En somme, faire varier le niveau sonore reste assez délicat. Exemple de programme :

int i; // Indice

void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  // Niveau sonore élevé
  for (i=0; i<1000; i++) {
    digitalWrite(2, HIGH);
    delayMicroseconds(500);
    digitalWrite(2, LOW);
    delayMicroseconds(500);
  }
  // Niveau sonore faible
  for (i=0; i<1000; i++) {
    digitalWrite(2, HIGH);
    delayMicroseconds(2);
    digitalWrite(2, LOW);
    delayMicroseconds(998);
  }
}

Transmission sonore

Principe de fonctionnement

Un bipeur, placé à droite, émet un signal sonore. L'autre bipeur, placé à gauche, reçoit le signal et allume une DEL. Les deux bipeurs sont disposés à proximité l'un de l'autre.

Schéma du câblage

Lorsque le bipeur de gauche ne délivre aucune tension, l'entrée A0 de la carte Arduino n'est reliée à rien électriquement. On dit de l'entrée qu'elle est en l'air. En conséquence, la valeur qu'elle reçoit reste indéterminée. Pour éviter cela, on place en parallèle une résistance importante, ici de 10 kΩ.

La résistance de 330 Ω placée en série avec la DEL limite le courant dans le circuit. Il doit rester inférieur à 20 mA pour ne pas endommager la carte Arduino.

Première version du programme

Le bipeur de droite est mis en œuvre pour envoyer un son interrompu et répétitif.

Le programme proposé ci-dessous, pour le bipeur de gauche, est simple. Toutefois, lorsqu'il reçoit un son, la DEL clignote légèrement au lieu de rester allumée continuellement. En effet, le bipeur délivre une tension alternative, tantôt positive, tantôt négative. Si l'entrée A0 reçoit une tension négative, celle-ci est considérée nulle par la carte Arduino. Il y a donc une chance sur deux pour que la DEL s'allume.

int lu;

void setup(){
  pinMode(2, OUTPUT);
}

void loop(){
  lu=analogRead(A0);
  if (lu>0) { digitalWrite(2, HIGH); }
  else { digitalWrite(2, LOW); }
}

Version améliorée

L'idée est d'effectuer plusieurs lectures afin de vérifier le signal sur l'entrée A0.

bool lu() {
  int j=0;
  for (int i=0; i<15; i++) { if (analogRead(0)>0) j++; }
  if (j>1) return true;
  return false;
}

void setup(){
  pinMode(2, OUTPUT);
}

void loop(){
  if (lu()) { digitalWrite(2, HIGH); }
  else { digitalWrite(2, LOW); }
}

Conclusion

Le bipeur piézo-électrique peut être utilisé comme générateur sonore ou comme capteur.

A l'air libre, le dispositif de transmission cesse de fonctionner à partir d'une distance de 40 cm environ. Cette portée augmente largement :