buzzer-melodie.ino

Arduino Pro Mini · Archivo : buzzer-melodie.ino · Lenguaje : Arduino · Uso : Jouer une mélodie sur un buzzer piézo avec les notes nommées

Un zumbador piezoeléctrico pasivo toca el inicio de "Au clair de la lune". tone() genera una frecuencia exacta en un pin; la melodía se guarda en una tabla (nota, duración) como una partitura, fácil de ampliar.

Hardware

Un Arduino Pro Mini (ATmega328P, existe en 5 V/16 MHz y 3,3 V/8 MHz) conectado a un convertidor USB-serie (FTDI) o un programador ICSP. 1 zumbador pasivo (5 V): un zumbador activo solo emite un pitido fijo, sin tone().

Cableado

Hilo + del zumbador al pin 8, hilo - a GND. En AVR, tone() no usa los pines con temporizadores ocupados por Servo.

Funcionamiento

tone(pin, frecuencia, duración) configura un temporizador para producir la señal cuadrada de audio. La tabla de notas se lee secuencia a secuencia con un delay proporcional.

Ejecución

Elige « Arduino Pro Mini » en el IDE (5 V/16 MHz o 3,3 V/8 MHz según tu modelo), el procesador ATmega328P, el puerto correcto y Subir. El convertidor debe estar cableado DTR-DTR, RX-TX, TX-RX, VCC-VCC, GND-GND.

Variantes

Añade un botón para disparar la melodía, o reproduce desde una tabla guardada en EEPROM/flash (PROGMEM) para ahorrar RAM.

buzzer-melodie.ino

// Melodie sur buzzer passif avec la fonction tone() et une table de notes.
const int BUZZER = 8; // broche tone() sur les AVR (pas 9/10 si Servo actif)

// Frequences (Hz) des notes d'une octave.
const int NOTE_DO = 262, NOTE_RE = 294, NOTE_MI = 330, NOTE_FA = 349,
          NOTE_SOL = 392, NOTE_LA = 440, NOTE_SI = 494, NOTE_DO2 = 523;

// "Au clair de la lune" (debut) : note, duree en temps.
const int melody[][2] = {
  {NOTE_DO, 1}, {NOTE_DO, 1}, {NOTE_DO, 1}, {NOTE_RE, 2},
  {NOTE_MI, 1}, {NOTE_MI, 1}, {NOTE_RE, 2}, {NOTE_DO, 4},
  {NOTE_RE, 1}, {NOTE_RE, 1}, {NOTE_RE, 2}, {NOTE_MI, 1},
  {NOTE_SOL, 1}, {NOTE_MI, 1}, {NOTE_DO, 4},
};

void setup() {
  Serial.begin(9600);
  Serial.println(F("Lecture de la melodie..."));
}

void loop() {
  const int TEMPS = 220; // ms par unite de duree
  for (unsigned int i = 0; i < sizeof(melody) / sizeof(melody[0]); i++) {
    int note = melody[i][0];
    int duree = melody[i][1] * TEMPS;
    tone(BUZZER, note, duree * 9 / 10); // petite pause entre les notes
    delay(duree);
  }
  delay(3000); // pause avant repetition
}

← Volver a la ficha