Magazine

19.- Notas musicales con buzzers

Publicado el 06 diciembre 2013 por Practicandoarduino @PracticaArduino

Seguimos con los zumbadores (buzzers en inglés), vamos a reproducir en lugar de un sonido molesto como hasta ahora, uno menos molesto, una escala musical. Vamos a volver a usar digitalWrite() en lugar de la función tone()

Para este tutorial necesitaremos:

1 Placa Arduino Uno
1 Protoboard
1 Resistencia de 100Ω (opcional)
1 Zumbador
Cables para realizar las conexionesuito que vamos a usar es el mismo que en el tutorial anterior

El circuito que vamos a usar en este tutorial es el mismo que el del tutorial anterior.

Zumbadorconfunciontone_bb

Buzzers

Código fuente:

int longitud=15; //numero de notas
byte notas[]= "cdefgabCbagfedc"; //notas
int duracion[]= {1,1,1,1,1,1,1,3,1,1,1,1,1,1,4}; //duración de las notas
byte nombres[]={'c','d','e','f','g','a','b','C'}; //nombres de las notas
int tonos[]={1915, 1700, 1519, 1432, 1275, 1136, 1014, 956}; //tiempo en HIGH de la nota
int tiempo=120; //velocidad de la reproducción
 
void setup(){
  pinMode (7, OUTPUT); //pin como salida
}
 
void loop(){
  int i;
  for (i=0;i<longitud;i++){
    playNota(notas[i], duracion[i]*tiempo); //llamamos a la función para tocar las notas
    delay(tiempo/2);//pausa entre notas
  }
}
 
void playNota(byte nota, int duracion){ //obtiene el tono de la nota
  if (nota==' '){
    delay(duracion); //no tocamos
  }else{
    for(int i=0; i<8;i++){
      if (nombres[i]==nota)
        playTono(tonos[i], duracion); //llamamos a la funcion que hara sonar la nota
    }
  }
}
 
void playTono (int tono, int duracion){ //reporduce la nota
  for (long i=0;i<duracion*1000L;i+=tono*2){
    digitalWrite (7, HIGH);
    delayMicroseconds(tono);
    digitalWrite (7, LOW);
    delayMicroseconds(tono);
  }
}

Primero declaramos una variable longitud que representa la cantidad de notas que queremos reproducir, el array notas son las notsa musicales pero con la notación americana, el array duracion marca la duración de cada nota (el 2 dura el doble que el uno, etc), el array tonos guarda el tiempo que debe de estar en HIGH cada nota, por lo que su periodo es ese valor por 2, ya que un periodo es la parte HIGH más la LOW, sabiendo que la frecuencia es la inversa del periodo tenemos
tiempoHIGH= periodo / 2 = 1 / (frecuencia * 2)

En el void setup() configuramos el pin 7 como salida y ya vamos de lleno con el void loop(). Aquí repetimos en cada ciclo la escala ascendente y descendente (15 notas = longitud) llamando a la función playNota, pasándole como parámetros la nota y su duración. En la función playNota, comprobamos que no sea un silencio y llamamos a la función encargada de reproducir la nota, pasándole el tiempo que tiene que estar en high y la duración, para reproducirlo durante medio periodo y dejarlo en LOW el otro medio cubriendo así un periodo completo.


También podría interesarte :

Volver a la Portada de Logo Paperblog

Quizás te interesen los siguientes artículos :

Dossier Paperblog