[Arduino] Proyecto Piano de Luz: Vídeo, Esquema y Código


Nivel de Dificultad:Tiempo estimado:Materiales Necesarios:
Básico 30 minutos
  • Un piezo
  • 3 Fotoresistores
  • 3 resistores de 10 kOhms
  • Arduino Uno R3 o compatible

En este segundo proyecto de arduino vamos a construir lo que denominaremos de forma afectiva un "piano de luz" pero que bien podría ser un arma de destrucción masiva más que un instrumento musical. Y es que, para la construcción de este piano de luz con arduino vamos a hacer uso de un Piezo que, como ya sabrán, no suele emitir los sonidos más agradables.

Mas adelante haremos lo suyo con un altavoz con lo que no se vayan muy lejos si lo que es el concepto les gusta.

    ¿Qué kit necesito para este proyecto?

    Si estás empezando entonces te vamos a recomendar que te hagas con el kit de la firma Elegoo; el kit denominado "Conjunto medio de iniciación con Arduino" que es el kit más básico y asequible de la firma compuesto por un microcontrolador UNO R3 así como todos los componentes necesarios para este proyecto y unos cuantos más.

     Se trata de un kit que reseñaremos más adelante de modo que no se vayan muy lejos.

    Objetivo: 

    Nuestro objetivo con este proyecto arduino será crear un piano de luz donde a cada fotoresistor le vamos a asignar un tono en el piezo cuando es "pulsado".

    En efecto los fotoresistores únicamente miden la luz de modo que lo que vamos a hacer es decirle al programa: Si el fotoresistor X tiene su mínima cantidad de luz (calculada previamente en el script) + 50 oHms (para tener un margen de operación) entonces emite un sonido Z en el piezo.

    A su vez, cada fotoresistor emitirá una frecuencia concreta que puede adaptarse en función de los gustos. Nosotros usamos como sonidos los 554, 622 y 750 Hertz para producir sonidos diferenciados entre sí.

    Bugs y posibilidades de mejora:

    Quizás el bug más destacado de este proyecto de arduino es que al tratarse de un piano que es sensible a la luz donde cada fotoresistor está trabajando de forma continua para medir la luz disponible habría sido conveniente que hubiese una mayor separación entre los fotoresistores para que la sombra de uno no incidiera sobre el otro dado que solo se puede llamar a la función tone() una vez.



    Esquema del piano de luz de arduino



    Video del piano de luz





    Código:


    //Declaramos las variables iniciales

    int luzMinima=1023;
    int luzMaxima=0;
    int valorLuz;
    const int ledPin=13;

    //Inicializamos el programa
    void setup() {

    pinMode(ledPin,OUTPUT);
    digitalWrite(ledPin,HIGH);
      
    //Iniciamos el monitor serial para poder monitorear la información //recibida por los fotoresistores

    Serial.begin(9600);

    //Lanzamos un bucle para calibrar la luz en 5 segundos o 5000 //milisegundos. Mientras dure la calibración el pin 13 tendrá su luz //encendida

    while (millis()<5000){
      int valorLuz=analogRead(A1);
      
      if (valorLuz<luzMinima){

        luzMinima=valorLuz;
      }
       if (valorLuz>luzMaxima){

        luzMaxima=valorLuz;
      }
    }
    //Apagamos el Pin 13 pues ha terminado la calibración

    digitalWrite(ledPin,LOW);
    }

    void loop() {

    //Leemos el valor de los tres fotoresistores y almacenamos dichos valores en las variables locales

    int sensorValue=analogRead(A0);
    int sensorValue2=analogRead(A1);
    int sensorValue3=analogRead(A2);


    //Medimos la luz recibida por el primer fotoresistor
    //Este IF se cumplirá si el valor del primer sensor es igual o menor
    //que la luz mínima registada + 50

    if (sensorValue<=(luzMinima+50)){

    //Llamamos a la función Tone diciendo el pin al que está conectado //el piezo, la frecuencia que queremos emitir y los milisegundos que //queremos que trabaje.

    tone(8,554,20);

    Serial.print("Sensor A0: ");
    Serial.print (sensorValue);
    delay(10);

    }
    else if (sensorValue2<=(luzMinima+50)){
      tone(8,622,20);

      Serial.print("Sensor A1: ");

    Serial.print (sensorValue2);
    delay(10);

    }

    else if (sensorValue3<=(luzMinima+50)){
      tone(8,750,20);

        Serial.print("Sensor A2: ");

    Serial.print (sensorValue3);

    delay(10);
    } else{

      noTone(8);
    }

    delay(5);
    }