miércoles, 5 de octubre de 2011

Octavo proyecto[Generando notas musicales]

Bueno tras unos dias OUT debido a la preparacion de examenes y practicas, vuelvo para realizar el proyecto musical de arduino. Se trata de generar hasta 8 notas musicales por una de las salidas analogicas de nuestro arduino.
Para ello vamos a necesitar los siguientes componentes:
  • Zumbador piezoelectrico
  • Arduino uno
Como podeis comprobar requerimos poco mas que un pequeño altavoz o zumbador para hacer esta practica.
Tan sencillo como los materiales que necesitamos sera nuestro diseño en placa, seria algo parecido al siguiente:
Una vez implementado nuestro diseño, pasaremos a programar nuestra placa arduino. Para ello, tenemos que tener en cuenta lo siguiente:
  • Se debe crear un arrayde datos compuesto por los valores correspondientes a las 8 notas que se pretende sacar:
int notas[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
  • Se deben definir también el tiempo de pausa entre nota y nota y el tiempo de pausa de fin de secuencia de notas:
int tnota=100;
int tpausa=100;
  • Las iteraciones para el recorrido de las 8 notas se realizan con una instrucción de tipo for:
for(n=0;n<8;n++)

  • El tiempo de activado y desactivado de la salida del zumbador también se resuelve con un bucle for:
for(m=0;m<=tnota;m++){

Dicho esto, el codigo seria el siguiente:


int notas[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956}; //cadena con los
tiempos que corresponden a las distintas notas
int n=0;
int m= 0;
int tnota=100; //no de repeticiones del pulso. Nos da la duración de la nota
int tpausa=100;
void setup() {
pinMode(10,OUTPUT);
}
void loop(){
for(n=0;n<8;n++){ //iteración que recorre la lista con las duraciones de los
pulsos de cada nota
for(m=0;m<=tnota;m++){
digitalWrite(10,HIGH);
delayMicroseconds(notas[n]); //Tiempo en microsegundos que está a 5V la salida del piezoeléctrico
digitalWrite(10,LOW);
delayMicroseconds(notas[n]); //Tiempo en microsegundos que está a 0V la salida del piezoeléctrico
}
delay(pausa); //tiempo en silencio
}
}

Con esto terminaremos el proyecto de hoy, proximamente ire subiendo nuevos proyectos. Salu2!

2 comentarios:

  1. Video Comprobación:

    ¿Sabéis de que canción se trata?
    http://www.youtube.com/watch?v=pyMT0EDJ1wI

    He cambiado un poco el código

    int speakerPin = 9;

    int length = 73; // the number of notes
    char notes[] = "ccdecgfec ccdecG ccdecgagfe ccdecg ggagfefga ffgfedefg eefedcdfa bagfedc "; // a space represents a rest
    int beats[] = { 1,1,1,2,2,4,1,1,1,1,1,1,1,2,2,4,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,2,4,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,2,4,4 };
    int tempo = 300;

    void playTone(int tone, int duration) {
    for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
    }
    }

    void playNote(char note, int duration) {
    char names[] = { 'G','c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
    int tones[] = { 1950,1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

    // play the tone corresponding to the note name
    for (int i = 0; i < 9; i++) {
    if (names[i] == note) {
    playTone(tones[i], duration);
    }
    }
    }

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

    void loop() {
    for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
    delay(beats[i] * tempo); // rest
    } else {
    playNote(notes[i], beats[i] * tempo);
    }

    // pause between notes
    delay(tempo / 2);
    }
    }

    ResponderEliminar
  2. muy buena.. una pregunta...es que quiero hacer una canción navideña...hay algún código en especifico

    ResponderEliminar