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.
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.